YouTubeの動画を自動で高評価するスクリプトが失敗していたので見てみる
これ #30 を毎月始めに実行するcronを動かしていたら今月頭の実行が失敗していたので調べてみます。
実行時のリポジトリの状態 https://github.com/waonpad/youtube-playground/tree/6acbb8e28cb2d685621053ca98beffe09b110c3d
実行時の出力
bun run scripts/rate-all-videos-in-playlist.ts --no-save --rating like --ids PLXK8F4c9oU0nZZ3y0wtVAGjyVd-oF3Bfq,PLXK8F4c9oU0mUuUWmT3ZHjaLLqmV2szOV,PLXK8F4c9oU0n2wpLpgBgi6X2Wvz5c0ft3,PLXK8F4c9oU0nGImxaLp87NWI57tPNo9jm
shell: /usr/bin/bash -e {0}
env:
YOUTUBE_DATA_API_REFRESH_TOKEN: ***
GOOGLE_CLIENT_ID: ***
GOOGLE_CLIENT_SECRET: ***
実行時引数: {
clean: undefined,
noSave: true,
ids: [ "PLXK8F4c[9](https://github.com/waonpad/youtube-playground/actions/runs/14199078332/job/39781338924#step:5:10)oU0nZZ3y0wtVAGjyVd-oF3Bfq", "PLXK8F4c9oU0mUuUWmT3ZHjaLLqmV2szOV",
"PLXK8F4c9oU0n2wpLpgBgi6X2Wvz5c0ft3", "PLXK8F4c9oU0nGImxaLp87NWI57tPNo9jm"
],
rating: "like",
}
プレイリストID: PLXK8F4c9oU0nZZ3y0wtVAGjyVd-oF3Bfq
動画をAPIから取得します
プレイリスト内の動画数: 497
削除または非公開の動画数: 5
評価可能な動画数: 492
新たに評価した動画数: 7
プレイリストID: PLXK8F4c9oU0mUuUWmT3ZHjaLLqmV2szOV
動画をAPIから取得します
プレイリスト内の動画数: 1829
削除または非公開の動画数: 37
評価可能な動画数: 1792
45 | // fallback to native
46 | return Function.prototype[Symbol.hasInstance].call(GaxiosError, instance);
47 | }
48 | constructor(message, config, response, error) {
49 | var _b;
50 | super(message);
^
error: The owner of the video that you are trying to rate has disabled ratings for that video.
config: {
url: "https://youtube.googleapis.com/youtube/v3/videos/rate?id=UpEPkPg8YP4&rating=like",
method: "POST",
apiVersion: "",
userAgentDirectives: [
[Object ...]
],
paramsSerializer: [Function],
headers: [Object ...],
params: [Object ...],
validateStatus: [Function],
retry: true,
responseType: "unknown",
errorRedactor: [Function: defaultErrorRedactor],
retryConfig: [Object ...],
},
response: {
config: [Object ...],
data: [Object ...],
headers: [Object ...],
status: 403,
statusText: "Forbidden",
request: [Object ...],
},
error: undefined,
status: 403,
code: 403,
errors: [
[Object ...]
],
gaxios-gaxios-error: "6.7.1",
at new GaxiosError (/home/runner/work/youtube-playground/youtube-playground/node_modules/gaxios/build/src/common.js:50:9)
at <anonymous> (/home/runner/work/youtube-playground/youtube-playground/node_modules/gaxios/build/src/gaxios.js:[14](https://github.com/waonpad/youtube-playground/actions/runs/14199078332/job/39781338924#step:5:15)2:23)
Bun v1.2.8 (Linux x64 baseline)
Error: Process completed with exit code 1.
これか。
The owner of the video that you are trying to rate has disabled ratings for that video. (評価しようとしている動画の所有者が、その動画の評価を無効にしています。)
YouTube Data APIのドキュメントにもエラーが載っていました。 Videos: rate | YouTube Data API | Google for Developers
動画自体はこれ。 Caramel Pain / 星街すいせい(official) - YouTube
ブラウザからなら普通に評価できるんですが、評価数が非表示にされているのがダメっぽい・・・?
以下のような質問もありました。 youtube - How can I solve Video Rating Disabled? - Stack Overflow
ローカルで評価を取得してみると普通に現在の値が取得できますね。 この質問の回答は少なくとも現在は間違っているようです。
ああ、ローカルで試してみた事だしエラーの全文も見ておこう。
全文
{
"config": {
"url": "https://youtube.googleapis.com/youtube/v3/videos/rate?id=UpEPkPg8YP4&rating=like",
"method": "POST",
"apiVersion": "",
"userAgentDirectives": [
{
"product": "google-api-nodejs-client",
"version": "7.2.0",
"comment": "gzip"
}
],
"headers": {
"x-goog-api-client": "gdcl/7.2.0 gl-node/22.6.0",
"Accept-Encoding": "gzip",
"User-Agent": "google-api-nodejs-client/7.2.0 (gzip)",
"Authorization": "<<REDACTED> - See `errorRedactor` option in `gaxios` for configuration>."
},
"params": {
"id": "UpEPkPg8YP4",
"rating": "like"
},
"retry": true,
"responseType": "unknown",
"retryConfig": {
"currentRetryAttempt": 0,
"retry": 3,
"httpMethodsToRetry": [
"GET",
"HEAD",
"PUT",
"OPTIONS",
"DELETE"
],
"noResponseRetries": 2,
"retryDelayMultiplier": 2,
"timeOfFirstRequest": 1743840963558,
"totalTimeout": 9007199254740991,
"maxRetryDelay": 9007199254740991,
"statusCodesToRetry": [
[
100,
199
],
[
408,
408
],
[
429,
429
],
[
500,
599
]
]
}
},
"response": {
"config": {
"url": "https://youtube.googleapis.com/youtube/v3/videos/rate?id=UpEPkPg8YP4&rating=like",
"method": "POST",
"apiVersion": "",
"userAgentDirectives": [
{
"product": "google-api-nodejs-client",
"version": "7.2.0",
"comment": "gzip"
}
],
"headers": {
"x-goog-api-client": "gdcl/7.2.0 gl-node/22.6.0",
"Accept-Encoding": "gzip",
"User-Agent": "google-api-nodejs-client/7.2.0 (gzip)",
"Authorization": "<<REDACTED> - See `errorRedactor` option in `gaxios` for configuration>."
},
"params": {
"id": "UpEPkPg8YP4",
"rating": "like"
},
"retry": true,
"responseType": "unknown"
},
"data": {
"error": {
"code": 403,
"message": "The owner of the video that you are trying to rate has disabled ratings for that video.",
"errors": [
{
"message": "The owner of the video that you are trying to rate has disabled ratings for that video.",
"domain": "youtube.video",
"reason": "videoRatingDisabled",
"location": "id",
"locationType": "parameter"
}
]
}
},
"headers": {
"alt-svc": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
"content-encoding": "gzip",
"content-type": "application/json; charset=UTF-8",
"date": "Sat, 05 Apr 2025 08:16:03 GMT",
"server": "scaffolding on HTTPServer2",
"transfer-encoding": "chunked",
"vary": "Origin, X-Origin, Referer",
"x-content-type-options": "nosniff",
"x-frame-options": "SAMEORIGIN",
"x-xss-protection": "0"
},
"status": 403,
"statusText": "Forbidden",
"request": {
"responseURL": "https://youtube.googleapis.com/youtube/v3/videos/rate?id=UpEPkPg8YP4&rating=like"
}
},
"status": 403,
"code": 403,
"errors": [
{
"message": "The owner of the video that you are trying to rate has disabled ratings for that video.",
"domain": "youtube.video",
"reason": "videoRatingDisabled",
"location": "id",
"locationType": "parameter"
}
]
}
うーん。
まぁ結局対応としては手動で評価するしか無いっぽいので、videoRatingDisabled
のエラーが返ってきたらログに出力するなり通知するなりしようかな。
発生頻度的にも問題無さそう。
対応しました。 一旦こんな感じのコードで良いでしょう。 https://github.com/waonpad/youtube-playground/blob/5eac53782ec40063905ace40cbc6bfd5180f8d24/src/rate.ts#L51
評価が無効な動画があったらこんな感じのIssueで通知される。 waonpad/youtube-playground#1
今回の問題にはあまり関係無いですが、エラー原因の判別に使用する部分の型がついていないので、こんな感じに用意しました。 https://github.com/waonpad/youtube-playground/blob/5eac53782ec40063905ace40cbc6bfd5180f8d24/types/googleapis.d.ts#L8