【Google Colaboratory】YouTube APIを使って再生リストを作る方法
Google ColaboratoryでYouTube APIを利用して「再生リストを作成したい」と思ったので、少し調べてまとめてみました。
Google ColaboratoryでOAuth認証を通す方法がなかなかわからなかったので、メモしておきたいと思います。
- Playlists | YouTube Data API | Google Developers
- PlaylistItems | YouTube Data API | Google Developers
目次
Google Cloud Platformの設定
Google Cloud Platformへアクセスして、APIを利用するための設定をしていきます。
プロジェクトを作成する
まずはAPIを利用するためにプロジェクトを作成します。
「YouTube Data API v3」を有効化する
メニューから「API とサービス」→「ライブラリ」を開きます。「YouTube Data API v3」を検索して「有効にする」を押します。
「OAuth 2.0 クライアント ID」を作成する
メニューから「API とサービス」→「認証情報」を開きます。「+認証情報を作成」を押して、「OAuth クライアント ID」を選択します。
アプリケーションの種類を「デスクトップ アプリ」を選択して、名前を設定し作成します。(名前はなんでもOK)
OAuthクライアントのjsonファイルを取得する
OAuth 2.0 クライアント IDを作成すると出てくる「JSONをダウンロード」または「OAuthクライアントをダウンロード」を押してjsonをダウンロードします。
ダウンロードしたファイル名を「client_secret.json」に変更してください。
コード全文
あらかじめGoogle Colaboratoryにダウンロードした「client_secret.json」をアップロードしておきます。(左側に表示されているフォルダのタブにドラックアンドドロップなどでアップロード)
import argparse
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
# ==================================================
# Google OAuth 2.0の認証設定
# ==================================================
CLIENT_SECRETS_FILE = 'client_secret.json'
SCOPES = ['https://www.googleapis.com/auth/youtube']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
# Authorize the request and store authorization credentials.
def get_authenticated_service():
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
credentials = flow.run_console()
return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
youtube = get_authenticated_service()
# ==================================================
# 再生リストを作成する
# ==================================================
TITLE = "Youtube APIに関する動画たち"
DESCTIPTION = "Youtube APIに関する動画をまとめています。"
playlist = youtube.playlists().insert(
part="snippet,status",
body={
"snippet": {
"title": TITLE, # プレイリストのタイトル
"description": DESCTIPTION # プレイリストの説明文
},
"status": {
"privacyStatus": "private" # プレイリストの公開ステータス
}
}
).execute()
# ==================================================
# 再生リストに動画を追加する
# ==================================================
playlist_id = playlist['id']
video_ids = ["xxx", "yyy"]
for video_id in video_ids:
playlist_item = youtube.playlistItems().insert(
part="snippet,status",
body={
"snippet": {
"playlistId": playlist_id,
"resourceId": {
"kind": "youtube#video",
"videoId": video_id,
},
"position":
},
"status": {
"privacyStatus": "private"
},
}
).execute()
コード:Google OAuth 2.0の認証設定
import argparse
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
# ==================================================
# Google OAuth 2.0の認証設定
# ==================================================
CLIENT_SECRETS_FILE = 'client_secret.json'
SCOPES = ['https://www.googleapis.com/auth/youtube']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
# Authorize the request and store authorization credentials.
def get_authenticated_service():
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
credentials = flow.run_console()
return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
youtube = get_authenticated_service()
コード:再生リストを作成する
# ==================================================
# 再生リストを作成する
# ==================================================
TITLE = "Youtube APIに関する動画たち"
DESCTIPTION = "Youtube APIに関する動画をまとめています。"
playlist = youtube.playlists().insert(
part="snippet,status",
body={
"snippet": {
"title": TITLE, # プレイリストのタイトル
"description": DESCTIPTION # プレイリストの説明文
},
"status": {
"privacyStatus": "private" # プレイリストの公開ステータス
}
}
).execute()
コード:再生リストに動画を追加する
# ==================================================
# 再生リストに動画を追加する
# ==================================================
playlist_id = playlist['id']
video_ids = ["xxx", "yyy"]
for video_id in video_ids:
playlist_item = youtube.playlistItems().insert(
part="snippet,status",
body={
"snippet": {
"playlistId": playlist_id,
"resourceId": {
"kind": "youtube#video",
"videoId": video_id,
},
"position":
},
"status": {
"privacyStatus": "private"
},
}
).execute()
エラーで詰まったところ
⑴ GCPのOAuthクライアントIDの設定ミス
OAuth 2.0 クライアント IDのアプリケーションの種類を「ウェブアプリ」で作成していて、「エラー 400: redirect_uri_mismatch」のエラーが出ました。
「デスクトップアプリ」で作成すると解消されました。
⑵ YouTubeチャンネルを作成していない
認証を通したGoogleアカウントのYouTubeチャンネルがない場合、401エラーが返ってきます。Youtubeを開いてチャンネルを作成しましょう。
(Googleアカウントを作成したら自動でチャンネルも作成されると思ってた…)