Google Youtube API 插入评论总是返回错误响应 403-“权限不足”-域“全局”

Posted

技术标签:

【中文标题】Google Youtube API 插入评论总是返回错误响应 403-“权限不足”-域“全局”【英文标题】:Google Youtube API Insert Comment always returns error response 403 - "Insufficient Permission" - domain "global" 【发布时间】:2018-10-31 15:52:21 【问题描述】:

我遵循文档指南中的文档和代码示例,即此处:https://developers.google.com/youtube/v3/docs/commentThreads/insert 但是当我执行脚本时,它总是返回带有错误代码的响应:403 消息:"Insufficient Permission"

这是完整的响应对象:


 "error": 
  "errors": [
   
    "domain": "global",
    "reason": "insufficientPermissions",
    "message": "Insufficient Permission"
   
  ],
  "code": 403,
  "message": "Insufficient Permission"
 

我花了很多时间在调试和上网以找出解决问题的方法,但没有找到任何资源可以找到解决此问题的方法。如果有人能给我一些提示或解决方案,或者告诉我是否遗漏了什么,我将不胜感激。

附:我还在我的应用程序中使用了其他 API 方法,例如点赞视频、订阅频道、使用 Google 登录,所有这些都非常有效。不要为什么这个插入评论的事情不起作用。

任何帮助将不胜感激。谢谢。

这是我进行 API 调用的 API 脚本。

<?php    
// filename: api.php    
    class GoogleApi 

            private $client_id;
            private $client_secret;
            private $redirect_uri;

            private $client; // stored client instance
            private $yt_service; // youtube service instance for making all api calls

            public function __construct($client_id, $client_secret, $redirect_uri, $token = '') 
                $this->client_id = $client_id;
                $this->client_secret = $client_secret;
                $this->redirect_uri = $redirect_uri;

                // create google client instance
                $this->client = $this->getClient();

                if(!empty($token)) 
                    // set / refresh access token
                    $this->setRefreshAccessToken($token);
                    // Define an object that will be used to make all API requests.
                    $this->yt_service = new Google_Service_YouTube($this->client);
                
            

            // Get a google client instance
            // docs: https://developers.google.com/youtube/v3/guides/auth/server-side-web-apps
            private function getClient($redirect_uri = '') 
                if (!empty($redirect_uri)) 
                    $this->redirect_uri = $redirect_uri;
                

                $client = new Google_Client();
                $client->setAuthConfig('client_secrets.json');
                $client->setScopes([
                    "https://www.googleapis.com/auth/userinfo.email",
                    "https://www.googleapis.com/auth/userinfo.profile",
                    "https://www.googleapis.com/auth/plus.me",
                    "https://www.googleapis.com/auth/plus.profiles.read",
                    "https://www.googleapis.com/auth/youtube"
                ]);
                // available scopes: https://developers.google.com/identity/protocols/googlescopes
                $client->setRedirectUri($this->redirect_uri);
                $client->setState(mt_rand());
                $client->setAccessType('offline');
                $client->setApprovalPrompt('force');
                $client->setIncludeGrantedScopes(true);   // incremental auth

                return $client;
            

            public function setRefreshAccessToken($accessToken) 
                // Set the access token
                $this->client->setAccessToken($accessToken);
                // Refresh the token if it's expired.
                if ($this->client->isAccessTokenExpired()) 
                    // update access token
                    $this->client->fetchAccessTokenWithRefreshToken($this->client->getRefreshToken());
                
            

            // Insert a comment on video
            // docs: https://developers.google.com/youtube/v3/docs/commentThreads/insert
            public function commentVideo($videoId, $commentText) 
                $this->client->addScope('https://www.googleapis.com/auth/youtube');
                $this->client->addScope('https://www.googleapis.com/auth/youtube.force-ssl');

                # Create a comment snippet with text.
                $commentSnippet = new Google_Service_YouTube_CommentSnippet();
                $commentSnippet->setTextOriginal($commentText);

                # Create a top-level comment with snippet.
                $topLevelComment = new Google_Service_YouTube_Comment();
                $topLevelComment->setSnippet($commentSnippet);

                # Create a comment thread snippet with channelId and top-level comment.
                $commentThreadSnippet = new Google_Service_YouTube_CommentThreadSnippet();
                // $commentThreadSnippet->setChannelId($CHANNEL_ID);
                $commentThreadSnippet->setVideoId($videoId); // Insert video comment
                $commentThreadSnippet->setTopLevelComment($topLevelComment);

                # Create a comment thread with snippet.
                $commentThread = new Google_Service_YouTube_CommentThread();
                $commentThread->setSnippet($commentThreadSnippet);

                # Call the YouTube Data API's commentThreads.insert method to create a comment.
                $response = $this->yt_service->commentThreads->insert('snippet', $commentThread);

                // print_r($response);
                return $response;
            

        
?>

这是我的端点的脚本(我在这个脚本上执行 ajax 调用)。

<php

// filename: comment.php

require_once("api.php");

// Insert a comment on youtube video.

if(empty($_POST['token'])) 
    return die('parameter `token` is required.');

if(empty($_POST['videoId'])) 
    return die('parameter `videoId` is required.');

if(empty($_POST['commentText'])) 
    return die('parameter `commentText` is required.');


try 
    // GoogleApi class instance
    $api = new GoogleApi(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_CALLBACK, $_POST['token']);

    $data = $api->commentVideo($_POST['videoId'], $_POST['commentText']);

    // send response.
    echo json_encode($result);
 catch(Exception $err) 
    return die($err -> getMessage());


?>

【问题讨论】:

这可能是增量身份验证的问题。我认为您需要在添加范围后刷新访问令牌。要测试,您可以尝试将youtube.force-ssl 范围向上移动到原始setScopes 吗? 好的,我试试。 【参考方案1】:

如果你安慰CommentThreads: insert的文档

授权 此请求需要至少具有以下范围之一的授权(阅读有关身份验证和授权的更多信息)。

范围 https://www.googleapis.com/auth/youtube.force-ssl

您会注意到,为了访问此方法,您需要包含此范围。

提示:如果您需要获得授权才能访问相关方法,则所有方法的文档都包含此授权部分。如果你总是检查,那么你就不会再遇到这个问题了。

【讨论】:

以上是关于Google Youtube API 插入评论总是返回错误响应 403-“权限不足”-域“全局”的主要内容,如果未能解决你的问题,请参考以下文章

ReferenceError:未定义 YouTube/将 YouTube 评论插入电子表格

使用youtube API和node.js添加youtube评论

Youtube 评论 API 抛出“权限不足:请求的身份验证范围不足”错误

YouTube API和品牌帐户

Youtube API CommentThreads的范围无效 - java

使用 Youtube 数据 API 获取评论