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両方つけると通ります
追記4:エクストラクタ書き換え方法↓

普通に使おうとすると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:「リクエストがどのドメインから発行されたか」を見ている、ということですね。

「外部からの不正な直リンク(スクレイピング)」として 412 で弾かれていた、という理屈でしょうか。
デフォルトでOriginも送信はしているようです。が、オプションから付与したおかげで何か漏れていた部分で通ったのかもしれません。

たしかにブラウザでも、ユーザーの「動画リスト」ページにブックマークから直接飛ぶと空っぽと表示され、別ページに一旦移ってから再度移動すると表示されるという現象が起きています。

まとめ

今回は 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ヘッダーを付与 で凌ぎましょう。

では。

追記(20260616):extractor/bilibili.pyを書き換える方法

yt-dlp 2026.6.9にアップグレードしたけれど「bilibili.py」はアップデートされず、そのままでした。残念。
412エラーは前述のように OriginヘッダーとRefererヘッダーを付ければ通りますが、480pまでしかリストが取得できないのでbilibili.pyを直接いじります。

bilibili.py 179行目

'https://api.bilibili.com/x/player/wbi/playurl', bvid,

'https://api.bilibili.com/x/player/playurl', bvid,

に変更すれば、
Originヘッダー、Refererヘッダーをつける必要もなく、またリストフォーマットで1080pなども(あれば)表示されるようになります。
(当たるサーバーによってなのか何なのか、412が出る時もありますが2回ほどトライすると通ります。)
(参考:github「bilibili video download fail #16962」)

extractorフォルダのパスはwin、macなど環境によって違うのでご自身で探して書き換えてください。プラグインフォルダに入れてもエラーになるのでバックアップをとって書き換えた方が無難です。自己責任でお願いします。

コメント

  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 より:

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

  3. より:

    はじめまして。
    yt-dlpでbilibiliの動画をDLしたいのですが、タイムアウトなどしてしまってなかなか成功しません。
    そこでこの記事に書かれているbilibili.pyを書き換える方法をやってみたいのですが、pyファイルの使い方がわかりません。
    pyファイルを保存したあと、どうすればいいのでしょうか?
    もしよければご教示いただけたら幸いです。

    • watary watary より:

      こんにちは。エラーが出るようになってしまいましたね。
      残念ながら現時点では「bilibili.py」を書き換えても、各種ヘッダーをつけても、エラーが出る状態な気がします。あちら圏内のVPNを使うしか今は方法がない、と言う情報もあります。
      接続したCDNサーバーによって変わるような気もするので、ひとまず映像と音声を別々に、何度もトライしてDLした後で結合するしかないと思います。それでも出来ない時は出来ませんが。
      ちなみに「bilibili.py」の場所は環境によって違うので一言では言えません。PC内を全検索して同じファイル名を探し、置き換えるのが早いと思います。

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