Youtube APIを使用するpythonアプリケーションを作成しました(例はPythonですが、実際には問題ではありません。概念は同じである必要があります)。接続してAPI呼び出しを行うことができる場所でそれを機能させることができました。ただし、APIに接続するときは、資格情報ストレージファイルが存在するかどうかを確認するフローを定義する必要があります。そうでない場合は、フローを使用して手動でサインインする必要があります。ファイル(main.py-oauth2.json)にサインインすると、トークンを使用して作成されます。手動でサインインしなくても資格情報をダウンロードできるようにしたいと思います。これまで見てきたように、そのトークンに対してPOSTリクエストを行う方法があることを望んでいました ここ 、しかし私はYoutubeapiでこれを行うことができました。誰かが目的の機能を実装する方法を知っていますか?
main.py
flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
scope=YOUTUBE_UPLOAD_SCOPE,
message=MISSING_CLIENT_SECRETS_MESSAGE)
storage = Storage(OAUTH_CREDENTIALS)
credentials = storage.get()
if credentials is None or credentials.invalid:
# manual / UI login
credentials = run_flow(flow, storage, args)
Googleサービスアカウントを使用しようとすると、アップロード時に401エラーがスローされます。
credentials = Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=YOUTUBE_UPLOAD_SCOPES)
if credentials is None or credentials.expired:
raise ValueError('Invalid credentials')
return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
credentials=credentials)
...
status, response = insert_request.next_chunk()
# <HttpError 401 "Unauthorized">
これができるという証拠
Oauth2client.service_account.ServiceAccountCredentialsクラスは、OAuth 2.0サービスアカウントでのみ使用されます。 これらのサーバー間API呼び出しにはエンドユーザーが関与しないため、Flowオブジェクトを使用せずにこのオブジェクトを直接作成できます。
https://developers.google.com/identity/protocols/OAuth2#serviceaccount
問題は、ほとんどのYouTubeデータがプライベートユーザーデータであるということです。プライベートユーザーデータであるため、アクセスするには、問題のデータにアクセスできるユーザーとして認証される必要があります。これを行うには、Oauth2を使用してアカウントにログインし、アクセストークンと更新トークンを取得します。
アクセストークンを使用してYoutubeApiにデータをリクエストできます。また、更新トークンを使用して、アクセストークンの有効期限が切れるたびに(1時間後)新しいアクセストークンをリクエストできます。
通常、サービスアカウントの使用を検討する必要があると思います。サービスアカウントはダミーユーザーであり、ユーザーデータへのアクセスを事前に構成できます。残念ながら、YoutubeAPIはサービスアカウントをサポートしていません。
あなたがすべきこと、そして私が過去に何度もやったことは、あなたのコードを一度認証することです。更新トークンを取得して保存します。今後、アプリケーションを実行するときはいつでも、更新トークンを使用して新しいアクセストークンをリクエストするだけで、APIにアクセスできるようになります。ログインとパスワードを手動で入力し、アクセスに同意する必要はありません。refeshトークンを使用してバックグラウンドですべてを実行できます。
注:更新トークンの有効期限が切れる場合があることを確認する必要がありますが、定期的に使用し続ける限り、ほとんどの場合、それらが有効であるかどうかを心配する必要はありません。
私はpython devではありませんが、これを見つけました
from oauth2client import client, GOOGLE_TOKEN_URI
CLIENT_ID = "client_id"
CLIENT_SECRET = "client_secret"
REFRESH_TOKEN = "refresh_token"
credentials = client.OAuth2Credentials(
access_token = None,
client_id = CLIENT_ID,
client_secret = CLIENT_SECRET,
refresh_token = REFRESH_TOKEN,
token_expiry = None,
token_uri = GOOGLE_TOKEN_URI,
token_ id = None,
revoke_uri= None)
http = credentials.authorize(httplib2.Http())