尝试通过Youtube Reporting API访问帐户的Youtube数据会导致HttpError 403:“呼叫者没有权限”

时间:2018-10-25 17:17:43

标签: python youtube-api youtube-analytics-api

我正在尝试使用YouTube的Reporting API来访问我公司的YouTube数据并进行分析。但是,当我运行Google提供的示例脚本时,出现以下错误:

HttpError: <HttpError 403 when requesting https://youtubereporting.googleapis.com/v1/media/%20?alt=json returned "The caller does not have permission">

我已经创建了Oauth 2.0客户端ID,下载了客户端机密文件,然后将脚本指向该文件。我还被重定向到Google的授权页面,在该页面上我登录到试图从中获取数据并授权脚本的Youtube帐户。供参考,我使用的范围是:

https://www.googleapis.com/auth/yt-analytics-monetary.readonly

这是我第一次尝试使用Google的API,因此我确定我遗漏了一些东西,但似乎无法弄清楚。如果有人可以提供一些指导,我将非常感激。

编辑:我在下面的Google示例脚本中包含了我正在使用的代码。

import urllib
import json
import os
from io import FileIO

import google.oauth2.credentials
import google_auth_oauthlib.flow
from oauth2client import client
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.http import MediaIoBaseDownload

def get_service():
    flow = InstalledAppFlow.from_client_secrets_file(client_secrets_file=client_secrets, scopes=scope)
    credentials = flow.run_console()
    return build(api_service_name, api_version, credentials = credentials)

def execute_api_request(client_library_function, **kwargs):
    response = client_library_function(**kwargs).execute()

    print(response)

scope = ['https://www.googleapis.com/auth/yt-analytics-monetary.readonly']
api_service_name = 'youtubereporting'
api_version = 'v1'
client_secrets = 'client_secret_397754690264-ba1rtbpi731qkveqb11361q4ggui2bmd.apps.googleusercontent.com.json'

youtube_analytics = get_service()
youtube_analytics.jobs().create(body={'reportTypeId':'channel_combined_a2', 'name':'test_job'}).execute()

# this lists all the reports that are generated after you've created a job
# so it might take a while before you're able to get list a report
youtube_analytics.jobs().reports().list(jobId = job_id).execute()

# this uses a reportId from one of the reports that are listed above
report_url = youtube_analytics.jobs().reports().get(jobId = job_id, reportId = 'REPORTIDGOESHERE').execute()['downloadUrl']

request = youtube_analytics.media().download(resourceName = " ")
request.uri = report_url

fh = FileIO('yt_test.txt', mode='wb')
downloader = MediaIoBaseDownload(fh, request, chunksize=-1)

done = False
while done is False:
    status, done = downloader.next_chunk()
    if status:
        print('Download %d%%.' % int(status.progress() * 100))
print('Download Complete!')

编辑#2:只是想用一个我发现给可能会偶然发现它的人的解决方案来更新它。

问题在于,我没有使用创建工作而生成的报告时创建的报告URL来设置请求的uri。我当时以为这是它自己的报告,但是实际上这只是您下载所说报告的方法。因此,我继续创建了一份工作,生成了一份报告。然后,我从报告元数据中获取“ downloadUrl”,将请求的uri设置为url,并照常运行下载程序。我已经更新了上面的代码以反映这一点。

1 个答案:

答案 0 :(得分:0)

添加此内容,以便将其标记为已回答。我的解决方案如下:

问题在于,我没有使用创建工作而生成的报告时创建的报告URL来设置请求的uri。我当时以为这是它自己的报告,但是实际上这只是您下载所说报告的方法。因此,我继续创建了一份工作,生成了一份报告。然后,我从报告元数据中获取“ downloadUrl”,将请求的uri设置为url,并照常运行下载程序。我已经更新了上面的代码以反映这一点。