0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python × YouTube Data APIで「チャンネルの最新100動画から再生回数Top10」を取得するCLIツールを作ってみた

0
Posted at

PythonでYouTube Data APIを使った動画再生回数ランキングCLIを作ってみた

はじめに

今回は、PythonからYouTube Data API v3を利用して、
指定したYouTubeチャンネルの動画を取得し、

  • 最新100件の動画を取得
  • 各動画の再生回数を取得
  • 再生回数の多い順にソート
  • Top 10をターミナルに表示

するCLIツールを作ってみました。

🎯 まず動く最小構成の CLI ツール(Python)

目的
YouTube の動画タイトルを検索する CLIツール
python3 youtube_cli.pyをターミナルで入力し、起動する。

🧩 1. 必要ライブラリのインストール

pip3 install google-api-python-client google-auth-oauthlib google-auth-httplib2

🧩 2. Google Cloud Console で API を有効化

  1. https://console.cloud.google.com/ (console.cloud.google.com in Bing)
  2. 新規プロジェクト作成
  3. 「YouTube Data API v3」を有効化
  4. 「OAuth 2.0 クライアントID」を作成
  5. client_secret.json をダウンロード
  6. プロジェクトフォルダに置く

🧩 3. CLI ツール本体(youtube_cli.py)

↓こちらが今回用いるPythonによる、CLIツールです!チャンネル名を入力すると、そのチャンネルがリリースしている最新の動画の100件の中から再生回数の高い順に、ベスト10を表示するようになっています。

youtube_cli.py
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build

SCOPES = ["https://www.googleapis.com/auth/youtube.readonly"]

def get_channel_id_from_query(youtube, query):
    # 入力されたチャンネル名やキーワードでYouTube内を検索
    print(f"{query}」に一致するチャンネルを検索中...")
    response = youtube.search().list(
        part="snippet",
        q=query,
        type="channel",
        maxResults=1
    ).execute()

    items = response.get("items", [])
    if not items:
        raise ValueError(f"指定されたチャンネル「{query}」が見つかりませんでした。")

    channel_id = items[0]["snippet"]["channelId"]
    channel_title = items[0]["snippet"]["title"]
    print(f"ターゲットチャンネル決定: 【 {channel_title}\n")
    
    return channel_id

def main():
    TOP_N = 10
    MAX_VIDEOS = 100  # 取得する最新動画の上限数(クォータ節約)
    
    # OAuth 認証
    flow = InstalledAppFlow.from_client_secrets_file(
        "client_secret.json", SCOPES
    )
    creds = flow.run_local_server(port=0)
    youtube = build("youtube", "v3", credentials=creds)

    # 1. ターミナルから調べたいチャンネル名やキーワードを入力してもらう
    user_query = input("再生回数を調べたいYouTube channelの名前を入力してください: ").strip()
    if not user_query:
        print("チャンネル名が入力されませんでした。終了します。")
        return

    # チャンネルID取得
    try:
        channel_id = get_channel_id_from_query(youtube, user_query)
    except ValueError as e:
        print(e)
        return

    # チャンネルの uploads プレイリストID を取得
    channel_info = youtube.channels().list(
        part="contentDetails",
        id=channel_id
    ).execute()

    uploads_playlist_id = channel_info["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]

    # 最新動画IDを最大100件まで集める
    video_ids = []
    next_page_token = None

    print("最新の動画リストを取得中...")
    while True:
        playlist_items = youtube.playlistItems().list(
            part="contentDetails",
            playlistId=uploads_playlist_id,
            maxResults=50,  # 1回で最大50件取得
            pageToken=next_page_token
        ).execute()

        for item in playlist_items.get("items", []):
            video_ids.append(item["contentDetails"]["videoId"])
            
            # 指定した上限(100件)に達したらストップ
            if len(video_ids) >= MAX_VIDEOS:
                break

        if len(video_ids) >= MAX_VIDEOS:
            break

        next_page_token = playlist_items.get("nextPageToken")
        if not next_page_token:
            break

    videos = []

    print(f"最新 {len(video_ids)} 件の動画データをまとめて取得中...")
    
    # 50件ずつバッチ処理で一括取得
    for i in range(0, len(video_ids), 50):
        chunk_ids = video_ids[i:i+50]
        ids_string = ",".join(chunk_ids)

        stats = youtube.videos().list(
            part="statistics,snippet",
            id=ids_string
        ).execute()

        for info in stats.get("items", []):
            title = info["snippet"]["title"]
            views = int(info["statistics"].get("viewCount", 0))
            video_id = info["id"]

            videos.append({
                "title": title,
                "views": views,
                "id": video_id
            })

    # 再生回数順にソート
    videos.sort(key=lambda x: x["views"], reverse=True)

    # ランキング表示(3桁区切りカンマ付き)
    print(f"\n--- 【{user_query}】 最新動画 再生回数ランキング(Top {TOP_N}) ---")
    for i, v in enumerate(videos[:TOP_N], start=1):
        print(f"{i}. {v['title']} - {v['views']:,} views (https://www.youtube.com/watch?v={v['id']})")

if __name__ == "__main__":
    main()

↓Terminalで、任意のディレクトリで以下のコマンドを入力し、Pythonファイルを実行します。

./scripts % python3 youtube_cli.py

↓Web Browser上で以下の画面に遷移するので、任意のアカウントを選択します。
Screenshot 2026-08-27 at 9.42.40.png

↓続行ボタンをクリック
Screenshot 2026-08-27 at 9.21.42.png

↓以下の画面になり、ターミナルに戻ります。
Screenshot 2026-08-27 at 9.21.55.png

↓すると、以下の内容が表示されます。

再生回数を調べたいYouTube channelの名前を入力してください:

↓仮に、以下のチャンネル名を入力します。

再生回数を調べたいYouTube channelの名前を入力してください:@Knight_in_night

↓以下の結果が表示されました。

「@Knight_in_night」に一致するチャンネルを検索中...
ターゲットチャンネル決定: 【 ナイトinナイト【ABCテレビ公式】 】

最新の動画リストを取得中...
最新 100 件の動画データをまとめて取得中...

--- 【@Knight_in_night】 最新動画 再生回数ランキング(Top 10) ---
1. 聞いてたんとちゃうやん!荒すぎる金遣いにイライラ #なるみ岡村の過ぎるTV #ナイトinナイト #shorts - 1,948,973 views (https://www.youtube.com/watch?v=H2QOksZgt8o)
2. 【相席食堂】新天地で輝く元NHKの2人が相席旅へ ラジオ沖縄アナウンサー 竹中知華 ナイトinナイト - 1,026,420 views (https://www.youtube.com/watch?v=qZMm7TE_cMU)
3. なぜか許されている大スケベギャグ #千鳥 #相席食堂 #ナイトinナイト #shorts - 991,705 views (https://www.youtube.com/watch?v=UYag_uKRnXA)
4. 苦節34年 ブー&ムー 相方の裏切り!? #千鳥 #相席食堂 #ナイトinナイト #shorts - 781,603 views (https://www.youtube.com/watch?v=3R3c9yUxtTg)
5. 30年前に開発された夢のマシン「Javaリング」を復活させて! - 572,843 views (https://www.youtube.com/watch?v=LF5PrzP9YTs)
6. 新喜劇おしどり夫婦 離婚の危機・・!? #なるみ岡村の過ぎるTV #ナイトinナイト #shorts - 475,443 views (https://www.youtube.com/watch?v=iBz_0UPg1ko)
7. 【かまいたち】五輪を夢見るキッズに聞いた!柔道金メダリストに忖度なしで答えて欲しいこと「これ余談なんですけど...」ナイトinナイト - 449,507 views (https://www.youtube.com/watch?v=khI7su42DwM)
8. マユリカ中谷の絶妙にイラっとする語録 #かまいたち #これ余談なんですけど #ナイトinナイト #shorts - 356,155 views (https://www.youtube.com/watch?v=DpvDhMGT2s0)
9. ぼっとん便所に純金の指輪を落っことしちゃった。 - 340,274 views (https://www.youtube.com/watch?v=Wi8vPmuAYfA)
10. 進研ゼミの漫画のキャラ「工藤先輩」が忘れられません。 - 280,952 views (https://www.youtube.com/watch?v=qk897djHp3A)

🎯 Conclusion

今回作成したYouTube Data APIのCLIツールでは、

Google CloudでAPIを有効化

OAuth 2.0 Client IDを作成

client_secret.jsonをPythonアプリに配置

GoogleアカウントでOAuth認証

YouTube Data APIを呼び出す

JSON形式のレスポンスを取得

Pythonで必要なデータを加工

ターミナルに結果を表示

という流れで処理を行いました。

今回の内容を一言でまとめると、

Google CloudでAPI利用の準備を行い、OAuthで認証したPythonアプリからYouTube Data APIを呼び出し、取得したJSONデータをPythonで加工してCLIに表示する。

という構成になります。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?