Google Youtube API插入评论始终返回错误响应403-“权限不足"; -域“全局" [英] Google Youtube API Insert Comment always returns error response 403 - "Insufficient Permission" - domain "global"

查看:541
本文介绍了Google Youtube API插入评论始终返回错误响应403-“权限不足"; -域“全局"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I followed the docs and code samples from documentation guide i.e., here: https://developers.google.com/youtube/v3/docs/commentThreads/insert But when I execute the script it always returns a response with error code: 403 message: "Insufficient Permission"

完整的响应对象:

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

我花了很多时间在Internet上进行调试和浏览,以找到解决问题的方法,但是却没有任何资源可以找到该问题的解决方案.如果有人可以给我一些提示或解决方案,或者告诉我是否有任何遗漏,我将非常感激.

I spent alot of time in debugging and surfing on internet to find out how to fix the problem but didn't get any resource where I can find the solution to this problem. I'd be very thankful if anyone can give me some hint or solution to this or tell me if I'm missing something.

P.S.我在我的应用程序中还使用了其他API方法,例如喜欢视频,订阅频道,使用Google登录等,所有这些都很好用.不要解释为什么插入评论不起作用.

P.S. I also have used other API methods in my app like liking a video, subscribing a channel, Login with Google and all these have been worked great. don't why this Inserting a comment thing not working.

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

Any help will be appreciated. Thanks.

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

Here's my API script for making the API call.

<?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调用).

And here's the script for my end-point (I perform ajax call on this script).

<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());
}

?>

推荐答案

如果您对注释线程:插入

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

Authorization
This request requires authorization with at least one of the following scopes (read more about authentication and authorization).

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

您会注意到,要访问此方法,您需要包括此作用域.

You will notice that in order to access this method you need to include this scope.

提示:如果需要获得授权才能访问所涉及的方法,则所有方法的文档都包括此授权部分.如果您始终进行检查,则不会再遇到此问题.

Tip: The documentation for all of the methods includes this authorization section if you are required to be authorized in order to access the method in question. If you always check that then you wont have this problem again.

这篇关于Google Youtube API插入评论始终返回错误响应403-“权限不足"; -域“全局"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆