Federico Cuozzo
Federico Cuozzo

Reputation: 361

Get video comments on Youtube

I'm using Google API, specifically Youtube's Data API, to get comments above a video, using video ID. I'm using python example from Google Documentation here, but I've the following error:

Missing property "redirect_uris" in a client type of "web"

So, this is my client_secrets_....json file:

{
    "installed": {
        "client_id":"xxxxxxxxxxxx-xxxxje3a7fk4jbs63g6m1a2mand4sa3h.apps.googleusercontent.com",
        "project_id":"progettotesicuozzo",
        "auth_uri":"https://accounts.google.com/o/oauth2/auth",
        "token_uri":"https://accounts.google.com/o/oauth2/token",
        "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
        "client_secret":"XXXXXXXXXXX",
        "redirect_uris":[
            "urn:ietf:wg:oauth:2.0:oob",
            "http://localhost"
        ]
    }
}

This is the code:

# Usage example:
# python test.py --videoid='<video_id>' --text='<text>'

import httplib2
import os
import sys
import json

from apiclient.discovery import build_from_document
from apiclient.errors import HttpError
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow

CLIENT_SECRETS_FILE = "./client_secret_....json"

YOUTUBE_READ_ONLY_SCOPE = "https://www.googleapis.com/auth/youtube.readonly"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

MISSING_CLIENT_SECRETS_MESSAGE = """WARNING: Please configure OAuth 2.0
    To make this sample run you will need to populate the client_secrets.json file found at: %s with information from the APIs Console https://console.developers.google.com
    For more information about the client_secrets.json file format, please visit: https://developers.google.com /api-client-library/python/guide/aaa_client_secrets""" % os.path.abspath(os.path.join(os.path.dirname(__file__), CLIENT_SECRETS_FILE))

def get_authenticated_service(args):
    flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=YOUTUBE_READ_ONLY_SCOPE, message=MISSING_CLIENT_SECRETS_MESSAGE)

    storage = Storage("%s-oauth2.json" % sys.argv[0])
    credentials = storage.get()

    if credentials is None or credentials.invalid:
        credentials = run_flow(flow, storage, args)

    with open("youtube-v3-discoverydocument.json", "r", encoding="utf8") as f:  
        doc = f.read()
        return build_from_document(doc, http=credentials.authorize(httplib2.Http()))

def get_comment_threads(youtube, video_id):
    results = youtube.commentThreads().list(
        part="snippet",
        videoId=video_id,
        textFormat="plainText"
    ).execute()

    for item in results["items"]:
        comment = item["snippet"]["topLevelComment"]
        author = comment["snippet"]["authorDisplayName"]
        text = comment["snippet"]["textDisplay"]
        print("Comment by " + author + ": " + text)

    return results["items"]


 def get_comments(youtube, parent_id):
    results = youtube.comments().list(
        part="snippet",
        parentId=parent_id,
        textFormat="plainText"
    ).execute()

    for item in results["items"]:
        author = item["snippet"]["authorDisplayName"]
        text = item["snippet"]["textDisplay"]
        print("Comment by " + author + ": " + text)

    return results["items"]

if __name__ == '__main__':
    # The "videoid" option specifies the YouTube video ID that uniquely
    # identifies the video for which the comment will be inserted.
    argparser.add_argument("--videoid", help="Required; ID for video for which the comment will be inserted.")
    # The "text" option specifies the text that will be used as comment.
    #argparser.add_argument("--text", help="Required; text that will be used as comment.")
    args = argparser.parse_args()

    if not args.videoid:
        exit("Please specify videoid using the --videoid= parameter.")

    youtube = get_authenticated_service(args)
    # All the available methods are used in sequence just for the sake of an example.
    try:
        video_comment_threads = get_comment_threads(youtube, args.videoid)
        parent_id = video_comment_threads[0]["id"]
        video_comments = get_comments(youtube, parent_id)
        except HttpError as e:
        print("An HTTP error " + str(e.resp.status) + " occurred:\n" +  json.dumps(str(e.content)))
    else:
        print("Inserted, listed, updated, moderated, marked and deleted comments.")

How can I configure well my json file, please?

After fixing my Json file I am now faced with this error:

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

I've requested a my personal video, using the ID from the web URL, but I got the error, after I've been prompted to the redirect_uri.

Upvotes: 2

Views: 908

Answers (1)

Linda Lawton - DaImTo
Linda Lawton - DaImTo

Reputation: 116918

When you create your project on google developer console you will be prompted to download the JSon file. You should not change this file you appear to have removed the redirect URI. Redirect URI is created as part of browser credentials. It is needed to tell the server where to return the response to.

Example:

{  
   "web":{  
      "client_id":"xxxxx-i6cjd1hkjntu5bkdkjj5cdnpcu4iju8p.apps.googleusercontent.com",
      "project_id":"daimto-tutorials-101",
      "auth_uri":"https://accounts.google.com/o/oauth2/auth",
      "token_uri":"https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
      "client_secret":"xxxxx",
      "redirect_uris":[  
         "http://localhost/google-api-php-client-samples/Analytics/Oauth2.php",
         "http://localhost/google-api-php-client-samples/Calendar/Oauth2.php"
      ],
      "javascript_origins":[  
         "https://www.example.com"
      ]
   }
}

Authorized redirect URIs For use with requests from a web server. This is the path in your application that users are redirected to after they have authenticated with Google. The path will be appended with the authorization code for access. Must have a protocol. Cannot contain URL fragments or relative paths. Cannot be a public IP address.

insufficientPermissions means that the user you are authenticating with does not have access to do what you are trying to do. You authenticated with a user and a channel. you only have access to the videos within that channel.

Upvotes: 2

Related Questions