数日前から yt-dlp を bilibili で使おうとすると412エラーを返すようになった。
しばらく待てば extractor のファイルも更新されるかな・・・と思ってたけどなかなか更新されない。
まぁいい機会だから対処法でも探そうかと。
一応解決したので備忘録も兼ねてシェア。
bilibiliでyt-dlpを使おうとすると412エラー
追記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」)


コメント
初めまして。
私も同様の現象に悩まされており、ここに書かれている方法を試してみたのですが、
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
このような文字は表示されるのですが、ダウンロードが始まりません。動画を最も良い画質でダウンロードしたいとき、どうすればよいでしょうか?
-F, --list-formatsは利用可能なフォーマットの一覧を出すオプションです。通常、何もせずとも最高品質が選ばれるのでオプションをつける必要はありません。(「FORMAT SELECTION」を参照してください)
記事中ではoriginヘッダーを渡せば通るよと、そういうサンプルとして載せたので
-Fオプションを外してください。ありがとうございます!無事ダウンロードできました!
はじめまして。
yt-dlpでbilibiliの動画をDLしたいのですが、タイムアウトなどしてしまってなかなか成功しません。
そこでこの記事に書かれているbilibili.pyを書き換える方法をやってみたいのですが、pyファイルの使い方がわかりません。
pyファイルを保存したあと、どうすればいいのでしょうか?
もしよければご教示いただけたら幸いです。
こんにちは。エラーが出るようになってしまいましたね。
残念ながら現時点では「bilibili.py」を書き換えても、各種ヘッダーをつけても、エラーが出る状態な気がします。あちら圏内のVPNを使うしか今は方法がない、と言う情報もあります。
接続したCDNサーバーによって変わるような気もするので、ひとまず映像と音声を別々に、何度もトライしてDLした後で結合するしかないと思います。それでも出来ない時は出来ませんが。
ちなみに「bilibili.py」の場所は環境によって違うので一言では言えません。PC内を全検索して同じファイル名を探し、置き換えるのが早いと思います。