YouTubeAPIで動画の管理
過去に投稿した動画を一気に非公開にしたい…と思いYouTubeAPIでのやり方を探したのですがあまり無かったので自分が行った方法を紹介したいと思います。
※やった後に気づいたのですが基本的に管理ツールからの方法で事足りるようです。ただ「指定のキーワードを含む動画だけ」などを行いたい人はこちらがお勧めです。
YouTubeAPI認証
最初にOAuth2.0による認証の準備をします。ただデータを取得するだけでしたらAPIキーを発行すればいいのですが、動画の操作になるとこの手続きが必要です。下記を参考にしてJSONファイルをダウンロードしてください。
※この記事だと一部が古いようでユーザー登録の画面は別となっておりテストユーザーはOAuth同意画面の「対象」から追加してください。
下の方にテストユーザーというのがあるので、[Add users]をクリックしてください。
ここにユーザとして認証するGoogleアカウント(操作対象のYouTubeのアカウント)を入れて保存してください。
APIによる動画の非公開化
動画が一括更新されますので操作には十分注意してください
ソースは以下にまとめていますが同じものを載せます
※GoogleColabの場合は不要ですが、ローカルで行う場合は以下のインストールが必要です
oauth2client
google-api-python-client
httplib2
最初に先ほどダウンロードしたjsonファイルを"client_secrets.json"に名前を変えて読み込ませて下さい。
from oauth2client.client import flow_from_clientsecrets
from apiclient.discovery import build
from apiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow
CLIENT_SECRETS_FILE = "client_secrets.json"
# This OAuth 2.0 access scope allows an application to upload files to the
# authenticated user's YouTube channel, but doesn't allow other types of access.
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
MISSING_CLIENT_SECRETS_MESSAGE = ""
flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
scope=YOUTUBE_UPLOAD_SCOPE,
message=MISSING_CLIENT_SECRETS_MESSAGE)
storage = Storage("%s-oauth2.json")
credentials = storage.get()
flags = argparser.parse_args(args=[])
if credentials is None or credentials.invalid:
credentials = run_flow(flow, storage, flags)
上記を実行してJSONが読み込めるとコンソールに「Your browser has been opend to ~」と出てきますが、以下の画面のような場合は失敗です。もう一度実行してみて下さい。
成功の場合は「Enter verification code:」というボックスが出てきますので、その場合は出てきたURLをクリックしてください。
対象となるYouTubeのGoogleアカウントを選んでください。
警告と認証コードが表示されますので、この認証コードを先ほどのボックスに入力してEnterして下さい。
これであとはコードの操作のみとなります。
最初に更新対象動画を確認しておきます。この例は投稿日が指定の日付より前のものとしていますが、パラメータ"q"を使えば指定のキーワードを含む動画なども抽出できます。
import httplib2
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
http=credentials.authorize(httplib2.Http()))
channelId = "ここに対象となるチャンネルIDを入力"
publishedBefore = "2024-12-31T23:59:59Z"
response = youtube.search().list(
part = "snippet",
channelId = channelId,
type = "video",
maxResults = 100,
order = "date",
# publishedAfter = publishedAfter,
publishedBefore = publishedBefore,
).execute()
print(f"対象件数:{len(response['items'])}")
video_list = []
for item in response['items']:
print(item['snippet']['title'], item["id"]["videoId"])
video_list.append([item["id"]["videoId"], item['snippet']['title']])
対象の動画に問題が無ければ、あとは以下を実行するだけで非公開となります。
※動画の"privacyStatus"を"private"にしています。
def set_private(video_id):
response = youtube.videos().update(
part = "id, status",
body={
"id": f"{video_id}",
"status": {
"privacyStatus": "private",
}
}
).execute()
import time
for video in video_list:
video_id = video[0]
title = video[1]
print(video_id, title)
set_private(video_id)
time.sleep(3)
※リクエストが多すぎるとはじかれるかもしれないので、3秒ごとにしています
最初は少ない対象だけで試してみてください!
おわりに
APIでタイトルの一括変更もできるようですが(snippetのtitleを指定)他の項目も全て指定しないと初期値になる(説明などが指定しないと空になる)ので使う場合は気をつけてください。
【参考】公式ドキュメント









