1

我有这段代码可以提取一些关于我的 YouTube 频道的指标,并从中创建一个 pandas 数据框。

import os
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
import json

SCOPES = ['https://www.googleapis.com/auth/yt-analytics.readonly']
API_SERVICE_NAME = 'youtubeAnalytics'
API_VERSION = 'v2'
CLIENT_SECRETS_FILE = 'client_secrets.json'

def get_service():
  flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
  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()
  with open('data.json', 'w') as fp:
    json.dump(response, fp)

if __name__ == '__main__':
  # Disable OAuthlib's HTTPs verification when running locally.
  # *DO NOT* leave this option enabled when running in production.
  os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'


  youtubeAnalytics = get_service()
  execute_api_request(
      youtubeAnalytics.reports().query,
      ids='channel==MINE',
      startDate='2014-01-01',
      endDate='2019-02-26',
      metrics='averageViewDuration,views,likes,dislikes,subscribersGained,subscribersLost',
      dimensions='day',
      sort='day',
      filters = 'country==US'
  )

## Now, convert the json to dataframe

import json
import pandas as pd

with open('data.json') as json_data:
    d = json.load(json_data)
colnames = [d['columnHeaders'][i]['name'] for i in range(0,len(d['columnHeaders']))]

Results = pd.DataFrame(d['rows'],columns  = colnames)
Results.to_csv("Youtube_data.csv")

通过运行此代码,会打开一个窗口并要求我登录 youtube,然后向我提供授权代码。输入此授权码即可完成上述python程序的运行。但是,您应该在每次运行此程序时重复此授权过程。

有没有办法绕过这种重复授权,使这个过程可以自动化?

4

1 回答 1

0

您需要使用 oauth2client.file.Storage 类来存储和检索凭证对象,如此处(糟糕地)解释:https ://developers.google.com/api-client-library/python/guide/aaa_oauth

您将需要使用以下内容修改您的get_service功能:

from oauth2client import client, file

def get_service():
  flow = client.flow_from_clientsecrets(CLIENT_SECRETS_FILE, SCOPES)
  storage = file.Storage(API_SERVICE_NAME + '.dat')
  credentials = storage.get()

  http = credentials.authorize(http=httplib2.Http())

  service = build(API_SERVICE_NAME, API_VERSION, http=http)

  return service

希望这可以帮助

于 2019-04-18T17:05:34.693 回答