数日前から yt-dlp を bilibili で使おうとすると412エラーを返すようになった。
しばらく待てば extractor のファイルも更新されるかな・・・と思ってたけどなかなか更新されない。
まぁいい機会だから対処法でも探そうかと。
一応解決したので備忘録も兼ねてシェア。
bilibiliでyt-dlpを使おうとすると412エラー
普通に使おうとすると412エラーが発生。
% yt-dlp -F https://www.bilibili.com/video/ほにゃらら/ [BiliBili] Extracting URL: https://www.bilibili.com/video/ほにゃらら/ [BiliBili] にゃらら: Downloading webpage [BiliBili] ほにゃらら: Extracting videos in anthology [BiliBili] ほにゃらら: Downloading wbi sign [BiliBili] ほにゃらら: Downloading video formats for cid xxxxxxxxxxx ERROR: [BiliBili] にゃらら: Unable to download JSON metadata: HTTP Error 412: Precondition Failed (caused by <HTTPError 412: Precondition Failed>)
かつて「クッキーを渡せばいける」という話もあったようなのでやってみたけど結果は同じ。
困ったねぇ
対処法:Origin ヘッダーを付与
色々試してみた結果、解決法としては
オプション --add-header "Origin:https://www.bilibili.com" を付与したら通りました。
% yt-dlp -F --add-header "Origin:https://www.bilibili.com" https://www.bilibili.com/video/ほにゃらら/ [BiliBili] Extracting URL: https://www.bilibili.com/video/ほにゃらら/ [BiliBili] にゃらら: Downloading webpage [BiliBili] ほにゃらら: Extracting videos in anthology [BiliBili] ほにゃらら: Downloading wbi sign [BiliBili] ほにゃらら: Downloading video formats for cid xxxxxxxxxxx [BiliBili] xxxxxxxxxxx: Extracting chapters [info] Available formats for ほにゃらら: ID EXT RESOLUTION FPS │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ───────────────────────────────────────────────────────────────────────────────────── 30216 m4a audio only │ ≈687.63KiB 66k https │ audio only mp4a.40.2 66k 30232 m4a audio only │ ≈ 1.27MiB 124k https │ audio only mp4a.40.2 124k 30280 m4a audio only │ ≈ 1.27MiB 124k https │ audio only mp4a.40.2 124k 30016 mp4 640x360 30 │ ≈ 2.87MiB 282k https │ avc1.640033 282k video only 30032 mp4 852x480 30 │ ≈ 4.13MiB 405k https │ avc1.640033 405k video only 30064 mp4 1280x720 30 │ ≈ 7.76MiB 761k https │ avc1.640033 761k video only 30080 mp4 1920x1080 30 │ ≈ 16.44MiB 1613k https │ avc1.640033 1613k video only
最初はクッキー、ユーザーエージェント、Refererヘッダー、Originヘッダーを付けてみましたが、削っていったら Origin だけでも通りました。
Origin:「リクエストがどのドメインから発行されたか」を見ている、ということですね。
yt-dlpのデフォルトの状態では Origin ヘッダーを送信しません。そのため「外部からの不正な直リンク(スクレイピング)」として 412 で弾かれていた、という理屈でしょうか。
たしかにブラウザでも、ユーザーの「動画リスト」ページにブックマークから直接飛ぶと空っぽと表示され、別ページに一旦移ってから再度移動すると表示されるという現象が起きています。
まとめ
今回は 412エラー(前提条件失敗) が発生し、Originヘッダーを付与したら通ったという結果になりました。
今後さらに厳格化されてリファラーやクッキーを見ることがあるかもしれません。
そうなったら
- クッキー:
--cookies-from-browser ブラウザ - ユーザーエージェント:
--user-agent
(Firefoxなら ヘルプ > トラブルシューティング情報 > ユーザーエージェント(の文字列)) - リファラー:
--add-header "Referer:https://www.bilibili.com" - オリジン:
--add-header "Origin:https://www.bilibili.com"
あたりを付与していくと何とかなるかも。ならんかも。
他のツールで何か対応してるものないかと探してみたんですけど今は yt-dlp 一強みたいな感じなんですかね。
streamlinkも「プラグインないよ!」って拒否られたし、lux(旧Annie)みたいなものももはや更新されてなさそうだし。
そのうち優秀なエンジニアさんが Extractor の bilibili.py を更新してくれるはず。
それまでは Originヘッダーを付与 で凌ぎましょう。
では。

コメント