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 を有効化
-
https://console.cloud.google.com/(console.cloud.google.com in Bing) - 新規プロジェクト作成
- 「YouTube Data API v3」を有効化
- 「OAuth 2.0 クライアントID」を作成
-
client_secret.jsonをダウンロード - プロジェクトフォルダに置く
🧩 3. CLI ツール本体(youtube_cli.py)
↓こちらが今回用いるPythonによる、CLIツールです!チャンネル名を入力すると、そのチャンネルがリリースしている最新の動画の100件の中から再生回数の高い順に、ベスト10を表示するようになっています。
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上で以下の画面に遷移するので、任意のアカウントを選択します。

↓すると、以下の内容が表示されます。
再生回数を調べたい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に表示する。
という構成になります。

