yt-dlpでbilibiliがエラー412を返す時の対処法|HTTPError 412:Precondition Failed

コンピュータ関連
スポンサーリンク

数日前から yt-dlpbilibili で使おうとすると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ヘッダーを付与 で凌ぎましょう。

では。

コメント

タイトルとURLをコピーしました