gpt4 book ai didi

PHP YouTube API - thumbnails.set 失败

转载 作者:可可西里 更新时间:2023-11-01 00:21:14 25 4
gpt4 key购买 nike

我正在尝试使用 YouTube APIgoogle-api-php-client 库更新 YouTube 上的视频缩略图。我们的版本是 1.0.3-beta

我已经复制/粘贴了 example ,并将我们的 client_idclient_secret 更改为我知道有效的值,因为我仍然可以使用这些值上传视频现在,我无法设置缩略图(在我刚刚使用相同凭据上传的视频上)。

这是我得到的错误:

An client error occurred: Error calling PUT https://www.googleapis.com/upload/youtube/v3/thumbnails/set?videoId=wL3Rt0sokdI&uploadType=resumable&upload_id=AEnB2UqFI4w1qO1gjoFS-fOlc61OthOht0ngdFAcdG9Nnufds61IyMIUUxf1rAvmoDl77LeEQZb1-HMyqtc9Op3Jg4hRfcyuOQ: (403) Forbidden

编辑 - 更多信息:这是我在打印出整个异常时得到的一小段信息:

{
["errors":protected]=> array(1)
{
[0]=> array(5) {
["domain"]=> string(17) "youtube.thumbnail"
["reason"]=> string(9) "forbidden"
["message"]=> string(9) "Forbidden"
["locationType"]=> string(6) "header"
["location"]=> string(13) "Authorization"
}
}

这是我正在使用的脚本(它与示例代码相同,但我把它放在这里以防上面的示例 URL 出现故障):

/**
* This sample uploads and sets a custom thumbnail for a video.
*
* 1. It uploads an image using the "Google_MediaFileUpload" class.
* 2. It sets the uploaded image as a custom thumbnail to the video by
* calling the API's "youtube.thumbnails.set" method
*
* @author Ibrahim Ulukaya
*/


// Call set_include_path() as needed to point to your client library.
set_include_path('/path/to/google-api-php-client/src/');
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://cloud.google.com/console>
* 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 = 'OURCLIENTIDWASHERE';
$OAUTH2_CLIENT_SECRET = 'OURCLIENTSECRETWASHERE';

$client = new Google_Client();
$client->setClientId($OAUTH2_CLIENT_ID);
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
$client->setScopes('https://www.googleapis.com/auth/youtube');
$redirect = filter_var('http://' . $_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();
header('Location: ' . $redirect);
}

if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}

// Check to ensure that the access token was successfully acquired.
if ($client->getAccessToken()) {
try{

// REPLACE this value with the video ID of the video being updated.
$videoId = "wL3Rt0sokdI";

// REPLACE this value with the path to the image file you are uploading.
$imagePath = "/path/to/image.jpg";

// 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 thumbnails.set method to upload the image and associate
// it with the appropriate video.
$setRequest = $youtube->thumbnails->set($videoId);

// Create a MediaFileUpload object for resumable uploads.
$media = new Google_Http_MediaFileUpload(
$client,
$setRequest,
'image/jpeg',
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize($imagePath));


// Read the media file and upload it chunk by chunk.
$status = false;
$handle = fopen($imagePath, "rb");
while (!$status && !feof($handle)) {
$chunk = fread($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);


$thumbnailUrl = $status['items'][0]['default']['url'];
$htmlBody .= "<h3>Thumbnail Uploaded</h3><ul>";
$htmlBody .= sprintf('<li>%s (%s)</li>',
$videoId,
$thumbnailUrl);
$htmlBody .= sprintf('<img src="%s">', $thumbnailUrl);
$htmlBody .= '</ul>';


} catch (Google_ServiceException $e) {
$htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>',
htmlspecialchars($e->getMessage()));
} catch (Google_Exception $e) {
$htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>',
htmlspecialchars($e->getMessage()));
}

$_SESSION['token'] = $client->getAccessToken();
} else {
// If the user hasn't authorized the app, initiate the OAuth flow
$state = mt_rand();
$client->setState($state);
$_SESSION['state'] = $state;

$authUrl = $client->createAuthUrl();
$htmlBody = <<<END
<h3>Authorization Required</h3>
<p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p>
END;
}
?>

<!doctype html>
<html>
<head>
<title>Claim Uploaded</title>
</head>
<body>
<?=$htmlBody?>
</body>
</html>

最佳答案

我终于找到了答案。 YouTube 帐户没有上传自定义缩略图的权限(尽管可以从 YouTube 后端“选择”缩略图。

您可以在以下 URL 找到帐户启用的功能列表: http://www.youtube.com/features

在我的例子中,我需要未启用的自定义缩略图权限: Custom thumbnails

显然,只要您的帐户信誉良好,验证您的 YouTube 帐户就会授予此权限。

关于PHP YouTube API - thumbnails.set 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22170881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com