API YouTube - ошибка скрипта загрузки данных Python - PullRequest
1 голос
/ 13 июня 2019

Мне удалось частично запустить скрипт для загрузки анализов через API. Ниже приведен код, который я использовал.

from datetime import datetime, timedelta
import httplib2
import os
import sys

from apiclient.discovery import build
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"
#channel_id= "UCYdadasiio69NXxvhoPw"

YOUTUBE_SCOPES = [
    "https://www.googleapis.com/auth/youtube", 
    "https://www.googleapis.com/auth/youtube.readonly",
    "https://www.googleapis.com/auth/youtubepartner",
    "https://www.googleapis.com/auth/yt-analytics-monetary.readonly",
    "https://www.googleapis.com/auth/yt-analytics.readonly"]
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
YOUTUBE_ANALYTICS_API_SERVICE_NAME = "youtubeAnalytics"
YOUTUBE_ANALYTICS_API_VERSION = "v1"
MISSING_CLIENT_SECRETS_MESSAGE = "credentials missed"

def get_authenticated_services(args):
    flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
        scope=" ".join(YOUTUBE_SCOPES),
        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)
    http = credentials.authorize(httplib2.Http())

    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,http=http)
    youtube_analytics = build(YOUTUBE_ANALYTICS_API_SERVICE_NAME,
        YOUTUBE_ANALYTICS_API_VERSION, http=http)   

    return(youtube, youtube_analytics)

def get_channel_id(youtube):
    channels_list_response = youtube.channels().list(
        mine=True,
        part="id"
    ).execute()
    return channels_list_response["items"][0]["id"]


def run_analytics_report(youtube_analytics, channel_id, options):
  # Call the Analytics API to retrieve a report. For a list of available
  # reports, see:
  # https://developers.google.com/youtube/analytics/v1/channel_reports
  analytics_query_response = youtube_analytics.reports().query(
    ids="contentOwner==%s" % options.content_owner_id,
    filters="channel==%s" % options.channel_id,
    metrics=options.metrics,
    dimensions=options.dimensions,
    start_date=options.start_date,
    end_date=options.end_date,
    max_results=options.max_results,
    sort=options.sort
  ).execute()

print "Analytics Data for Channel %s" % channel_id
print analytics_query_response

for column_header in analytics_query_response.get("columnheaders", []):
    print "%-20s" % column_header["name"],

for row in analytics_query_response.get("rows", []):
    for value in row:
        print "%-20s" % value,


if __name__ == "__main__":
  now = datetime.now()
  one_day_ago = (now - timedelta(days=1)).strftime("%Y-%m-%d")
  one_week_ago = (now - timedelta(days=7)).strftime("%Y-%m-%d")

  argparser.add_argument("--metrics", help="Report metrics",
    default="views,earnings")
  argparser.add_argument("--dimensions", help="Report dimensions",
    default="video")
  argparser.add_argument("--start-date", default=one_week_ago,
    help="Start date, in YYYY-MM-DD format")
  argparser.add_argument("--end-date", default=one_day_ago,
    help="End date, in YYYY-MM-DD format")
  argparser.add_argument("--max-results", help="Max results", default=10)
  argparser.add_argument("--sort", help="Sort order", default="-views")
  args = argparser.parse_args()

  (youtube, youtube_analytics) = get_authenticated_services(args)
try:
  channel_id = get_channel_id(youtube)
  run_analytics_report(youtube_analytics, channel_id, args)
except HttpError, e:
  print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)

К сожалению, авторизация не работает в контексте загрузки списка каналов:

print "Analytics Data for Channel %s" % channel_id
NameError: name 'channel_id' is not defined

Однако, если я жестко передам параметр chanell_id, ошибки продолжатся:

print analytics_query_response
NameError: name 'analytics_query_response' is not defined

Раньше у меня была проблема с новой версией Python, теперь у меня версия 2.7.16

Можете ли вы сказать мне, в чем причина таких ошибок, потому что у меня пока нет идей?

Я имею в виду, что может вызвать ошибку в начале загрузки channel_id с переменной не определено, хотя она должна загружать данные из yt, а затем определение ошибки analytics_query_response?

В этих частях кода есть проблема: 1. channel_id

def get_channel_id(youtube):
    channels_list_response = youtube.channels().list(
        mine=True,
        part="id"
    ).execute()
    return channels_list_response["items"][0]["id"]
  1. analytics_query_response
def run_analytics_report(youtube_analytics, channel_id, options):
  # Call the Analytics API to retrieve a report. For a list of available
  # reports, see:
  # https://developers.google.com/youtube/analytics/v1/channel_reports
  analytics_query_response = youtube_analytics.reports().query(
    ids="contentOwner==%s" % options.content_owner_id,
    filters="channel==%s" % options.channel_id,
    metrics=options.metrics,
    dimensions=options.dimensions,
    start_date=options.start_date,
    end_date=options.end_date,
    max_results=options.max_results,
    sort=options.sort
  ).execute()
...