☰
BBDown 扫码登录失败:Arg_KeyNotFound 与 HTTP 400 报错的 5 步排查指南
2026/11/2 1:37:38 网站建设 项目流程

BBDown 扫码登录失败:Arg_KeyNotFound 与 HTTP 400 报错的 5 步排查指南

【免费下载链接】BBDownBilibili Downloader. 一个命令行式哔哩哔哩下载器.项目地址: https://gitcode.com/gh_mirrors/bb/BBDown

BBDown 是一个命令行式哔哩哔哩下载器,支持番剧、课程、普通视频解析下载、弹幕字幕抓取与二维码登录。本文专门解决一类高频故障:执行BBDown login或BBDown logintv后,二维码能正常显示,但随后抛出Arg_KeyNotFound、KeyNotFoundException或 HTTP 400 错误,程序直接退出,导致无法获取SESSDATA或access_token。下面带你先确认环境、再定位根源、最后分步修复。

症状与自查:先花 2 分钟确认这些信息

排查前,先记录以下运行环境信息,后面无论是自助解决还是反馈给维护者都用得上:

  • 操作系统与版本(Windows 10/11、macOS、Linux 发行版)
  • BBDown 版本与安装方式:dotnet tool安装,还是 Release 下载的二进制
  • 执行的完整命令(BBDown login还是BBDown logintv)
  • 报错的完整原文

典型报错表现有这几种,你可以对号入座:

Arg_KeyNotFound: The given key 'data' was not present in the dictionary. KeyNotFoundException: ... System.Net.Http.HttpRequestException: Response status code does not indicate success: 400 (Bad Request)

另外两种不算崩溃、但结果相同的"软失败":

  • 二维码生成后长时间停在"扫码成功, 请确认...",始终不输出登录成功: SESSDATA=
  • 提示二维码已过期, 请重新执行登录指令.,重新执行后依然复现

自查小动作:先手动在浏览器里打开 B 站,确认账号本身能正常扫码登录,排除账号与网络大环境的问题,再回来处理程序。

根源剖析:为什么二维码能显示,登录却失败?

BBDown 的扫码登录(源码位于 BBDown/BBDownLoginUtil.cs)分三步走,理解它就能看懂每一类报错从哪里来:

  1. 向passport.bilibili.com请求生成二维码地址,拿到qrcode_key
  2. 本地渲染qrcode.png并在控制台打印二维码
  3. 每 1 秒轮询一次poll接口,根据返回 JSON 中的code判断状态:86101等待扫码、86090等待确认、86038二维码过期,其他值视为登录成功并解析出SESSDATA

打个比方:二维码就像一张限时取货凭证,程序每隔一秒问一次"货好了没"。而Arg_KeyNotFound的含义是——程序去 JSON 里找data这个"抽屉",发现抽屉没了。这不是你操作的问题,而是"仓库货架被重新摆放过":B 站接口返回的 JSON 结构或状态码与旧版 BBDown 里写死的解析逻辑对不上了。接口一旦调整字段,旧版本读取data.code或data.url时就会抛KeyNotFoundException,外层 HTTP 400 则是服务端直接拒绝了不合规的请求参数。

所以结论很明确:报错的根源大概率是"BBDown 版本落后于 B 站接口",其次是网络链路干扰。这两类原因决定了下面排查顺序——先升级,再查网络。

分步排查与解决:按顺序执行,一般第 1~2 步即可修复

第 1 步:先确认版本,再升级(最快解法)

先查看当前版本:

BBDown --version

如果用的是dotnet tool安装,直接升级到最新版:

dotnet tool update --global BBDown

如果是下载的 Release 二进制,重新获取最新版本覆盖安装即可。升级后重新执行:

BBDown login

如果升级后扫码能走完"扫码成功 → 登录成功: SESSDATA=..."的完整流程,问题即已解决。登录成功后,凭证会自动保存到程序同目录下的BBDown.data(TV 账号为BBDownTV.data),之后下载会员内容无需重复登录。

第 2 步:用 --debug 打开调试日志,看清真实报错

如果升级后仍失败,先带--debug再跑一次,把完整日志留存:

BBDown --debug login

调试日志会输出每一次请求的 URL 与响应内容(见 BBDown.Core/Logger.cs)。重点看:

  • 轮询接口的响应里有没有data字段、code是多少
  • 如果是 400,看请求 URL 与参数是否完整

第 3 步:检查网络链路

若日志显示请求超时或返回异常页面,多半是网络问题:

  • 确认能正常访问https://passport.bilibili.com与https://passport.snm0516.aisee.tv(logintv依赖后者)
  • WiFi 环境下注意是否有代理、防火墙或 DNS 限制,可以先关闭代理再试
  • 换用 4G/5G 热点交叉验证一次,就能区分"本地网络问题"还是"账号/接口问题"

第 4 步:绕过扫码,手动传 Cookie 或 Token 验证下载链路

如果登录链路暂时走不通、但你急着下载,可以绕开扫码直接注入凭证:

BBDown -c "SESSDATA=******" "https://www.bilibili.com/video/BV1qt4y1X7TW"

TV 端则使用:

BBDown -tv -token "******" "https://www.bilibili.com/video/BV1qt4y1X7TW"

若手动传凭证能正常下载,说明问题确实只卡在登录环节,继续回到第 1~3 步处理;若连手动传凭证也失败,则问题在下载链路(接口/网络),而非登录。

第 5 步:仍不行,就从最新源码自行编译

以上都没解决时,最后手段是基于最新代码自行构建:

git clone https://gitcode.com/gh_mirrors/bb/BBDown

进入目录后执行dotnet build -c Release,或参考项目内的 Dockerfile 了解构建方式(项目基于 .NET 9,混流还需本机准备 ffmpeg 或 mp4box)。

预防与最佳实践:避免再次踩坑

  • 定期升级:BBDown 这类依赖第三方接口的工具,接口一变旧版就会失灵。养成dotnet tool update --global BBDown的习惯,比出问题时再排查省时间
  • 凭证文件要放对位置:程序只会读取程序所在目录(APP_DIR)下的BBDown.data/BBDownTV.data/BBDownApp.data,换目录运行会导致"明明登录过却没生效"
  • 配置文件兜底:常用参数可以写进BBDown.config(每行一个参数、#开头为注释),减少手输命令出错的可能,详见 BBDown/BBDownConfigParser.cs
  • 日志脱敏:分享日志给别人前,先涂掉SESSDATA、access_token、cookie 等敏感字段,避免账号被盗用
  • 服务器模式用户:以BBDown serve启动的,同样建议开启--debug并在 json-api-doc.md 中对照 API 行为

FAQ:两个高频追问

Q1:提示The type initializer for 'Gdip' threw an exception是怎么回事?

这是二维码图形渲染相关的异常,多出现在 Linux 精简环境缺少图形库的场景。可以先安装系统图形依赖(如 libgdiplus 或相关图形库),或升级到最新版本的 BBDown 重试;Linux 下也可借助 Docker 方式运行以避开系统库依赖。

Q2:BBDownTV.data登录的 token 能给 APP 接口用吗?

可以。把BBDownTV.data复制一份改名为BBDownApp.data放到程序同目录,程序即可自动读取该access_token用于 APP 端解析。

结语

一句话总结处理顺序:先升级,再开--debug,查网络,必要时手动传 Cookie 验证,最后才考虑自行编译。扫码登录失败十有八九是版本落后于 B 站接口变化,保持 BBDown 处于最新版本、凭证文件放对位置,绝大多数报错都会在第一步就烟消云散。

【免费下载链接】BBDownBilibili Downloader. 一个命令行式哔哩哔哩下载器.项目地址: https://gitcode.com/gh_mirrors/bb/BBDown

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询