アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

YouTube Data APIでdislikeCountが返らない時の取り方(オーナー認証と検算)

Featured image of the post

「YouTube Data API で動画の低評価数を取ろうとしたら、dislikeCount が返ってこない」「Studio の画面では低評価が見えるのに、APIの結果には列そのものが無い」「集計スクリプトに低評価の列を足したいが、追加のクォータが要るのか分からない」。動画の成績を自動で記録していると、こうした場面に出会います。

原因は、低評価数が2021年から一般には非公開になったことです。ただし、自分のチャンネルの動画を、そのチャンネルのオーナーとして認証して取れば返ります。この記事では、APIキーだけの時と OAuth 認証した時の違い、既存の集計に低評価の列を1つ足す手順、値が合っているかを確かめる方法、落とし穴をまとめました。

💡
💡 30秒で要点
- 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 の値はその時点の累計です。推移が要るなら、定期実行で日付つきの行を台帳に足していきます。定期実行を登録しているかは、先に確認してください。手動で走らせた回数しか行が無いのに「日次」と呼ぶと、後で数字の読み違いが起きます。

プログラミング学習でお悩みですか?

現役エンジニアがあなたの学習をマンツーマンでサポートします。

  • 学習の進め方がわからない
  • ポートフォリオの作り方を知りたい
  • 現場で使える技術を学びたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら