😺

PythonからYouTube Data APIを叩いてアップロード済み動画のリストを取得する

2022/03/11に公開

YouTube Data APIを使って動画の情報を取得する流れが分かったので、PythonでAPIを叩いてデータを取得します。

前回の記事はこちらです。
https://zenn.dev/yorifuji/articles/youtube-data-api

今回作成したソースコードはこちらにあります。
https://github.com/yorifuji/YouTubeDataAPI_Python

実行すると以下のようなデータが取得できます(HIKAKINさんのチャンネルの動画を取得)。

[
    {
        "id": "OD7wsfblIAU",
        "image": "https://i.ytimg.com/vi/OD7wsfblIAU/hqdefault.jpg",
        "likes": 21506,
        "publishedAt": "2022-03-10T10:30:14Z",
        "title": "LINEのボイス付きスタンプ100連発したらYouTuberは怒るか検証w【3.11チャリティー・売上寄付】",
        "views": 757197
    },
    {
        "id": "RJKo3bDCBGo",
        "image": "https://i.ytimg.com/vi/RJKo3bDCBGo/sddefault.jpg",
        "likes": 22632,
        "publishedAt": "2022-03-08T11:15:14Z",
        "title": "【No.1決定戦】チョコフォンデュタワーに色んなアイス突っ込んでどれが1番合うか試してみたwww",
        "views": 1001088
    },
    {
        "id": "5FalwD0yHb0",
        "image": "https://i.ytimg.com/vi/5FalwD0yHb0/hqdefault.jpg",
        "likes": 23017,
        "publishedAt": "2022-03-08T11:14:36Z",
        "title": "息継ぎ無しでビートボックス世界最長記録目指した結果… #Shorts",
        "views": 546196
    },

ポイント

認証

今回はサーバサイドやローカルでの実行を想定してAPIKEYを利用しました。
APIKEIの取得はこちらを参考にしました。

https://qiita.com/shinkai_/items/10a400c25de270cb02e4

google-api-python-client

Google APIのPython Clientを使います、pipでインストールしました

https://github.com/googleapis/google-api-python-client

service objectの作成

APIを叩くためにservice objectを生成します、以下の例ではDEVELOPER_KEY.envに記載しています。

api_service_name = "youtube"
api_version = "v3"
DEVELOPER_KEY = getenv('DEVELOPER_KEY')

def get_authenticated_service():
    return googleapiclient.discovery.build(
        api_service_name, api_version, developerKey = DEVELOPER_KEY)

service objectを作成します。

youtube = get_authenticated_service()

プレイリストに含まれる動画のIDを取得

プレイリストに含まれる動画のID(videoId)を取得する部分です。

def get_video_id_in_playlist(playlistId):
    video_id_list = []

    request = youtube.playlistItems().list(
        part="snippet",
        maxResults=50,
        playlistId=playlistId,
        fields="nextPageToken,items/snippet/resourceId/videoId"
    )

    while request:
        response = request.execute()
        video_id_list.extend(list(map(lambda item: item["snippet"]["resourceId"]["videoId"], response["items"])))
        request = youtube.playlistItems().list_next(request, response)

    return video_id_list

上記のコードでプレイリストに含まれる動画のIDの配列が取得できます

動画の詳細情報を取得する

動画のIDを使って詳細情報を取得します。

def get_video_items(video_id_list):
    video_items = []

    chunk_list = list(chunks(video_id_list, 50)) # max 50 id per request.
    for chunk in chunk_list:
        video_ids = ",".join(chunk)
        request = youtube.videos().list(
            part="snippet,statistics",
            id=video_ids,
            fields="items(id,snippet(title,description,publishedAt,thumbnails),statistics(viewCount,likeCount))"
        )
        response = request.execute()
        video_items.extend(response["items"])

    return video_items
def chunks(lst, n):
    """Yield successive n-sized chunks from lst."""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]
  • videos().list()で動画の情報を取得します
  • partにsnippet,statisticsを指定しています、statisticsには再生数いいねが含まれています
  • idに動画のIDを指定します、,で複数のIDを指定することができます
    • video_ids = ",".join(chunk)
  • fieldsで取得する情報を指定しています

get_video_items(['OD7wsfblIAU']) のように実行すると次のようなデータが取得できます

[
    {
        "id": "OD7wsfblIAU",
        "snippet": {
            "description": "◆「ヒカキン SMILEスタンプ」はコチラ\nhttps://store.line.me/stickershop/product/25452/ja\n\n◆「3.11 これからも、できること」特設サイト\nhttps://yahoo.jp/TKiGZx\n\n◆「3.11 寄付は、チカラになる。」特設ページ\nhttps://yahoo.jp/ahLQTL\n\n @東海オンエア \n@はじめしゃちょー(hajime) \n@SeikinTV \n@瀬戸弘司 / Koji Seto \n@デカキン Dekakin \n@MasuoTV \n\n◆チャンネル登録はこちら↓\nhttp://www.youtube.com/user/hikakintv?sub_confirmation=1\n\n◆ツイッター\nhttps://twitter.com/hikakin\n\n◆インスタグラム\nhttps://instagram.com/hikakin/\n\n◆TikTok\nhttps://vt.tiktok.com/BTWxUN/\n\n◆ヒカキンゲームズ\nhttp://www.youtube.com/hikakingames\n\n◆ビートボックス動画のHIKAKINチャンネル\nhttp://www.youtube.com/HIKAKIN\n\n◆ラフな動画のHikakinBlog\nhttp://www.youtube.com/hikakinblog\n\n\n◆ヒカキンLINEスタンプはこちら\nhttps://store.line.me/stickershop/product/1022677/ja\n\n\n◆ヒカキンLINE公式アカウント\n●友達登録はこちら↓\nhttp://line.naver.jp/ti/p/%40hikakin\n\n#LINEスタンプ\n#LINE\n#YouTuber",
            "publishedAt": "2022-03-10T10:30:14Z",
            "thumbnails": {
                "default": {
                    "height": 90,
                    "url": "https://i.ytimg.com/vi/OD7wsfblIAU/default.jpg",
                    "width": 120
                },
                "high": {
                    "height": 360,
                    "url": "https://i.ytimg.com/vi/OD7wsfblIAU/hqdefault.jpg",
                    "width": 480
                },
                "medium": {
                    "height": 180,
                    "url": "https://i.ytimg.com/vi/OD7wsfblIAU/mqdefault.jpg",
                    "width": 320
                }
            },
            "title": "LINEのボイス付きスタンプ100連発したらYouTuberは怒るか検証w【3.11チャリティー・売上寄付】"
        },
        "statistics": {
            "likeCount": "21917",
            "viewCount": "762998"
        }
    }
]

参考情報

https://developers.google.com/youtube/v3/docs

https://developers.google.com/youtube/v3/quickstart/python

https://github.com/googleapis/google-api-python-client

https://developers.google.com/resources/api-libraries/documentation/youtube/v3/python/latest/

https://github.com/youtube/api-samples

アップロード済み動画を取得するサンプル

https://github.com/youtube/api-samples/blob/master/python/my_uploads.py

https://developers.google.com/youtube/v3/code_samples/python?hl=ja#retrieve_my_uploads

Discussion