「YouTube Data API で動画の低評価数を取ろうとしたら、dislikeCount が返ってこない」「Studio の画面では低評価が見えるのに、APIの結果には列そのものが無い」「集計スクリプトに低評価の列を足したいが、追加のクォータが要るのか分からない」。動画の成績を自動で記録していると、こうした場面に出会います。
原因は、低評価数が2021年から一般には非公開になったことです。ただし、自分のチャンネルの動画を、そのチャンネルのオーナーとして認証して取れば返ります。この記事では、APIキーだけの時と OAuth 認証した時の違い、既存の集計に低評価の列を1つ足す手順、値が合っているかを確かめる方法、落とし穴をまとめました。
- APIキーだけの匿名アクセスでは、
statistics に dislikeCount が入らない - 自分のチャンネルの動画を、オーナーとして OAuth 認証した
videos.list では dislikeCount が返る - 既存の
part="statistics" の取得に1列足すだけで、追加のクォータは要らない - 取れなかった行は
None(null)で埋め、集計では0として扱わない - Analytics API の合計と突き合わせると、値が正しいか確認できる
目次を開く
何が起きているのか
videos.list の part="statistics" は、再生数・高評価数・コメント数などを返します。低評価数は2021年から一般には非公開のため、APIキーだけで叩くと dislikeCount の項目自体が入りません。
| 呼び出し方 | dislikeCount |
|---|---|
| APIキーのみ(匿名アクセス) | 返らない |
| 他人の動画を OAuth 認証で取得 | 返らない前提で設計する |
| 自分のチャンネルの動画を、オーナーとして OAuth 認証 | 返る |
1行目と3行目は実際に確かめた結果です。2行目は確かめていない前提なので、必要なら自分の環境で1本だけ試してから本番の処理に組み込んでください。
手順:オーナー認証で取得して列を足す
1. 読み取りだけのスコープで認証する
低評価を読むだけなら、読み取り用のスコープで足ります。
SCOPES = ["https://www.googleapis.com/auth/youtube.readonly"] 集計用のスクリプトが、すでにオーナーの認証情報(creds)で動いているなら、認証まわりは変えなくて構いません。
2. statistics から dislikeCount を読む
from googleapiclient.discovery import build
youtube = build("youtube", "v3", credentials=creds) # オーナーで認証済み
def fetch_stats(video_ids):
res = youtube.videos().list(
part="statistics",
id=",".join(video_ids), # 1回に最大50本まで
).execute()
rows = {}
for item in res["items"]:
s = item["statistics"]
rows[item["id"]] = {
"views": int(s.get("viewCount", 0)),
"likes": int(s["likeCount"]) if "likeCount" in s else None,
"dislikes": int(s["dislikeCount"]) if "dislikeCount" in s else None,
}
return rows 数値は文字列で返るので int() に通します。dislikeCount が無い動画は None にします。
3. 追加のクォータは要らない
part の中身を増やしたわけではなく、すでに取っている statistics の中の項目を1つ読むだけです。videos.list の呼び出し回数もそのままなので、クォータは増えません。
値が正しいかを確かめる
statistics の低評価を全動画分足した数を、Analytics API の合計と比べます。
analytics = build("youtubeAnalytics", "v2", credentials=creds)
# スコープに https://www.googleapis.com/auth/yt-analytics.readonly が必要
res = analytics.reports().query(
ids="channel==MINE",
startDate="2020-01-01",
endDate="2026-09-24", # 確定している日まで
metrics="likes,dislikes",
).execute()
print(res["rows"][0]) チャンネル全体の合計と、動画別の dislikeCount の合計が一致していれば、取得は正しく動いています。直近数日分は Analytics 側の集計が追いついていないことがあるので、終了日は数日前に置きます。
つまずきやすい点
取れなかった行を0にしない
過去に記録した台帳には低評価の列がありません。集計側で None を0として扱うと、「低評価ゼロ」と「未取得」が区別できなくなります。
known = [r for r in rows.values() if r["dislikes"] is not None]
total = sum(r["dislikes"] for r in known)
print(f"取得できた動画 {len(known)} 本 / 合計 {total}") 母数が小さい動画の1件は傾向ではない
再生数が数十、評価が数件しかない動画の低評価1件は、傾向ではなく個別の出来事です。動画の中身の問題と決めつける前に、母数を並べて見ます。
調査用のファイル名に標準ライブラリ名を使わない
低評価の確認用に dis.py という名前で使い捨てのスクリプトを作ると、標準モジュールの dis と衝突して、起動時に落ちることがあります。json・logging・types なども同じです。接頭辞を付けます。
python3 -c "import dis; print(dis.__file__)" # 標準ライブラリの場所が出れば衝突していない
mv dis.py yt_dislike_check.py まとめ
- 匿名(APIキーのみ)では
dislikeCountは返らない。オーナー認証のvideos.listなら返る - 既存の
statistics取得に1項目足すだけで、追加のクォータは要らない - 取れなかった行は
Noneにして、0として集計しない - Analytics API の合計と突き合わせて、値を検算する
- 調査用のファイル名に、標準ライブラリと同じ名前を付けない
よくある質問(FAQ)
APIキーだけで低評価数を取る方法はありますか?
一般公開の低評価数はAPIキーのみでは取れません。自分のチャンネルの動画なら、オーナーとして OAuth 認証する形に切り替えます。
他人の動画の低評価数は取れますか?
返らない前提で設計してください。競合の動画を比べたい場合は、高評価数や再生数など、公開されている指標で比べます。
認証したのに dislikeCount が入っていません
まず認証したアカウントが、その動画のチャンネルのオーナーかを確認します。次に、返ってきた statistics のキー一覧を出して、項目そのものが無いのか、値が0なのかを切り分けます。
低評価の推移を日次で残せますか?
videos.list の値はその時点の累計です。推移が要るなら、定期実行で日付つきの行を台帳に足していきます。定期実行を登録しているかは、先に確認してください。手動で走らせた回数しか行が無いのに「日次」と呼ぶと、後で数字の読み違いが起きます。
