如何更新访问令牌(借助刷新令牌帮助)并在YouTube上上传视频?
authenticate.php
<?php
$client = new Google_Client();
$client->setClientId($OAUTH2_CLIENT_ID);
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
$client->setScopes('https://www.googleapis.com/auth/youtube');
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https' : 'http';
$redirect = filter_var($protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],
FILTER_SANITIZE_URL);
$client->setRedirectUri($redirect);
// Define an object that will be used to make all API requests.
$youtube = new Google_Service_YouTube($client);
if (isset($_GET['code'])) {
if (strval($_SESSION['state']) !== strval($_GET['state'])) {
die('The session state did not match.');
}
$client->authenticate($_GET['code']);
$_SESSION['token'] = $client->getAccessToken();
exit;
}
if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}
config.php
<?php
require_once 'google-api-php-client-2.2.0/vendor/autoload.php';
// Call set_include_path() as needed to point to your client library.
// require_once 'Google/Client.php';
// require_once 'Google/Service/YouTube.php';
session_start();
/*
* You can acquire an OAuth 2.0 client ID and client secret from the
* Google Developers Console <https://console.developers.google.com/>
* For more information about using OAuth 2.0 to access Google APIs, please see:
* <https://developers.google.com/youtube/v3/guides/authentication>
* Please ensure that you have enabled the YouTube Data API for your project.
*/
$OAUTH2_CLIENT_ID = '';
$OAUTH2_CLIENT_SECRET = '';
require_once 'inc/authenticate.php';
upload.php
<?php
if (!empty($_POST['video_path'])) {
try{
// REPLACE this value with the path to the file you are uploading.
$videoPath = $_POST['video_path'];
// Create a snippet with title, description, tags and category ID
// Create an asset resource and set its snippet metadata and type.
// This example sets the video's title, description, keyword tags, and
// video category.
$snippet = new Google_Service_YouTube_VideoSnippet();
if (!empty($_POST['video_title'])) {
$snippet->setTitle($_POST['video_title']);
}
if (!empty($_POST['video_description'])) {
$snippet->setDescription($_POST['video_description']);
}
if (!empty($_POST['video_tags'])) {
$video_tags = array_filter(array_map('trim', explode(',', $_POST['video_tags'])));
$snippet->setTags($video_tags);
}
// Numeric video category. See
// https://developers.google.com/youtube/v3/docs/videoCategories/list
// $snippet->setCategoryId("22");
// Set the video's status to "public". Valid statuses are "public",
// "private" and "unlisted".
$status = new Google_Service_YouTube_VideoStatus();
if (!empty($_POST['video_status']) && in_array($_POST['video_status'], array('public', 'private', 'unlisted'))) {
$status->privacyStatus = $_POST['video_status'];
}
// Associate the snippet and status objects with a new video resource.
$video = new Google_Service_YouTube_Video();
$video->setSnippet($snippet);
$video->setStatus($status);
// Specify the size of each chunk of data, in bytes. Set a higher value for
// reliable connection as fewer chunks lead to faster uploads. Set a lower
// value for better recovery on less reliable connections.
$chunkSizeBytes = 1 * 1024 * 1024;
// Setting the defer flag to true tells the client to return a request which can be called
// with ->execute(); instead of making the API call immediately.
$client->setDefer(true);
// Create a request for the API's videos.insert method to create and upload the video.
$insertRequest = $youtube->videos->insert('status,snippet', $video);
// Create a MediaFileUpload object for resumable uploads.
$media = new Google_Http_MediaFileUpload(
$client,
$insertRequest,
'video/*',
null,
true,
$chunkSizeBytes
);
// $media->setFileSize(filesize($videoPath));
$headers = array_change_key_case(get_headers($videoPath, true));
$media->setFileSize(intval($headers['content-length']));
// Read the media file and upload it chunk by chunk.
$status = false;
$handle = fopen($videoPath, 'rb');
while (!$status && !feof($handle)) {
$chunk = stream_get_contents($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
fclose($handle);
// If you want to make other calls after the file upload, set setDefer back to false
$client->setDefer(false);
$video_url = 'https://www.youtube.com/watch?v=' . $status['id'];
?>
<div class="alert alert-success">
<h3 class="alert-heading">Video Uploaded</h3>
<p><a href="<?php echo $video_url; ?>" class="alert-link"><?php echo $video_url; ?></a></p>
</div>
<?php
} catch (Google_Service_Exception $e) {
?>
<div class="alert alert-danger">
<p>A service error occurred: <code><?php echo htmlspecialchars($e->getMessage()); ?></code></p>
</div>
<?php
} catch (Google_Exception $e) {
?>
<div class="alert alert-danger">
<p>An client error occurred: <code><?php echo htmlspecialchars($e->getMessage()); ?></code></p>
</div>
<?php
}
$_SESSION['token'] = $client->getAccessToken();
}
如何添加refresh_token文件,以防止重置授权。
{"access_token":"ya29.GluQBs6GFi_0sG1VgmLUZ0....","expires_in":3600,"refresh_token":"1\/cLxr6ox0...","scope":"https:\/\/www.googleapis.com\/auth\/userinfo.email https:\/\/www.googleapis.com\/auth\/userinfo.profile","token_type":"Bearer","id_token":"eyJhbGc..","created":1547330141}
我找到了正确的信息,但是无法在上面的代码中实现。
PHP server-side YouTube V3 OAuth API video upload guide
我可以获得刷新令牌并将所有内容保存到文件或会话中,但是如何将令牌的验证和更新集成到上面的代码中?
请帮助我!