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

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

数日前から yt-dlpbilibili で使おうとすると412エラーを返すようになった。

しばらく待てば extractor のファイルも更新されるかな・・・と思ってたけどなかなか更新されない。

まぁいい機会だから対処法でも探そうかと。

一応解決したので備忘録も兼ねてシェア。

スポンサーリンク

bilibiliでyt-dlpを使おうとすると412エラー

追記:数日経ってbilibili側が仕様変更したようです。何もせずとも通るようになってます
追記1:DLできるけど480pまでになっています。ログインしてクッキーを渡すしか…
追記2:修正案が示されました。問題なくDLできます。正式な配布を待ちましょう
追記3:再び412エラーが発生。今回はOrigin,Referer両方つけると通ります

普通に使おうとすると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 ヘッダーを送信しません。デフォルトで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ヘッダーを付与 で凌ぎましょう。

では。

コメント

  1. Hourai より:

    初めまして。
    私も同様の現象に悩まされており、ここに書かれている方法を試してみたのですが、

    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

    このような文字は表示されるのですが、ダウンロードが始まりません。動画を最も良い画質でダウンロードしたいとき、どうすればよいでしょうか?

    • watary watary より:

      -F, --list-formats は利用可能なフォーマットの一覧を出すオプションです。
      通常、何もせずとも最高品質が選ばれるのでオプションをつける必要はありません。(「FORMAT SELECTION」を参照してください)
      記事中ではoriginヘッダーを渡せば通るよと、そういうサンプルとして載せたので -F オプションを外してください。

  2. Hourai より:

    ありがとうございます!無事ダウンロードできました!

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