PHP YouTube API - thumbnails.set失败

 手机用户2502909293 发布于 2023-01-20 10:20

我试图更新使用YouTube上的视频缩略图YouTube API,与 google-api-php-client库.我们正在上版1.0.3-beta.

我已经复制/粘贴了这个示例,并将我们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 
 * For more information about using OAuth 2.0 to access Google APIs, please see:
 * 
 * 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 .= "

Thumbnail Uploaded

    "; $htmlBody .= sprintf('
  • %s (%s)
  • ', $videoId, $thumbnailUrl); $htmlBody .= sprintf('', $thumbnailUrl); $htmlBody .= '
'; } catch (Google_ServiceException $e) { $htmlBody .= sprintf('

A service error occurred: %s

', htmlspecialchars($e->getMessage())); } catch (Google_Exception $e) { $htmlBody .= sprintf('

An client error occurred: %s

', 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 = <<Authorization Required

You need to authorize access before proceeding.

END; } ?> Claim Uploaded

BT643.. 7

我终于找到了答案.YouTube 帐户无权上传自定义缩略图(尽管可以从YouTube后端"选择"缩略图.

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

就我而言,我需要未启用的自定义缩略图权限: 自定义缩略图

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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有