Комментарий вставки API Google Youtube всегда возвращает сообщение об ошибке 403 - «Недостаточно прав доступа» - домен «глобальный» - PullRequest
0 голосов
/ 22 мая 2018

Я следовал документам и образцам кода из руководства по документации, то есть здесь: 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"
 }
}

Я потратил много времени на отладку и серфинг в Интернете, чтобы выяснить, как решить проблему, но не нашел ни одного ресурса, где я мог бы найти решение этой проблемы.проблема.Я был бы очень благодарен, если бы кто-нибудь мог дать мне подсказку или решение по этому поводу или сказать мне, если я что-то упустил.

PS Я также использовал другие методы API в моем приложении, такие как лайк видео, подпискаканал, логин с гуглом и все это отлично сработало.не, почему эта вставка комментария не работает.

Любая помощь будет оценена.Спасибо.

Вот мой сценарий 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());
}

?>

1 Ответ

0 голосов
/ 22 мая 2018

, если вы утешаете документацию для CommentThreads: insert

Авторизация
Для этого запроса требуется авторизация хотя бы с одной из следующих областей (подробнее об аутентификации и авторизации).

Область действия https://www.googleapis.com/auth/youtube.force-ssl

Вы заметите, что для доступа к этому методу необходимо включить эту область.

Совет: документация для всехиз методов включает этот раздел авторизации, если вам требуется авторизация для доступа к рассматриваемому методу.Если вы всегда проверяете это, то у вас больше не будет этой проблемы.

...