0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

YouTubeAPIで動画を一括に非公開にする方法(Python)

0
Posted at

YouTubeAPIで動画の管理

過去に投稿した動画を一気に非公開にしたい…と思いYouTubeAPIでのやり方を探したのですがあまり無かったので自分が行った方法を紹介したいと思います。

※やった後に気づいたのですが基本的に管理ツールからの方法で事足りるようです。ただ「指定のキーワードを含む動画だけ」などを行いたい人はこちらがお勧めです。

YouTubeAPI認証

最初にOAuth2.0による認証の準備をします。ただデータを取得するだけでしたらAPIキーを発行すればいいのですが、動画の操作になるとこの手続きが必要です。下記を参考にしてJSONファイルをダウンロードしてください。


※この記事だと一部が古いようでユーザー登録の画面は別となっておりテストユーザーはOAuth同意画面の「対象」から追加してください。

Snapshot_507.PNG

Snapshot_489.PNG

Snapshot_490.PNG


下の方にテストユーザーというのがあるので、[Add users]をクリックしてください。

Snapshot_492.PNG


ここにユーザとして認証するGoogleアカウント(操作対象のYouTubeのアカウント)を入れて保存してください。

Snapshot_491.PNG

APIによる動画の非公開化

動画が一括更新されますので操作には十分注意してください

ソースは以下にまとめていますが同じものを載せます

※GoogleColabの場合は不要ですが、ローカルで行う場合は以下のインストールが必要です

oauth2client
google-api-python-client
httplib2

最初に先ほどダウンロードしたjsonファイルを"client_secrets.json"に名前を変えて読み込ませて下さい。

OAuth2.0 認証
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 ~」と出てきますが、以下の画面のような場合は失敗です。もう一度実行してみて下さい。

Snapshot_508.PNG


成功の場合は「Enter verification code:」というボックスが出てきますので、その場合は出てきたURLをクリックしてください。

Snapshot_509.PNG


対象となるYouTubeのGoogleアカウントを選んでください。

Snapshot_510.PNG


警告と認証コードが表示されますので、この認証コードを先ほどのボックスに入力してEnterして下さい。

Snapshot_513.PNG

Snapshot_512.PNG


これであとはコードの操作のみとなります。


最初に更新対象動画を確認しておきます。この例は投稿日が指定の日付より前のものとしていますが、パラメータ"q"を使えば指定のキーワードを含む動画なども抽出できます。

接続用オブジェクト生成
import httplib2

youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
  http=credentials.authorize(httplib2.Http()))
search実行
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を指定)他の項目も全て指定しないと初期値になる(説明などが指定しないと空になる)ので使う場合は気をつけてください。


【参考】公式ドキュメント

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?