本项目仅供个人学习、研究和非商业性用途。用户在使用本工具时,需自行确保遵守相关法律法规,特别是与版权相关的法律条款。开发者不对因使用本工具而产生的任何版权纠纷或法律责任承担责任。请用户在使用时谨慎,确保其行为合法合规,并仅在有合法授权的情况下使用相关内容。
一个命令行式哔哩哔哩下载器. Bilibili Downloader.
本软件混流时需要外部程序:
本软件已经以 Dotnet Tool 形式发布
如果你本地有dotnet环境,使用如下命令即可安装使用
dotnet tool install --global BBDown
如果需要更新bbdown,使用如下命令
dotnet tool update --global BBDown
Release版本:https://github.com/AliverAnme/BBDown/releases
自动构建的测试版本:https://github.com/AliverAnme/BBDown/actions
运行 BBDown --help 查看完整的可用参数与命令列表:
BBDown --help部分核心参数速查:
| 短选项 | 长选项 | 说明 |
|---|---|---|
-t |
--use-tv-api |
使用 TV 端解析模式 |
-a |
--use-app-api |
使用 APP 端解析模式 |
-I |
--only-show-info |
仅解析而不下载 |
-i |
--interactive |
交互式选择清晰度 |
-d |
--download-danmaku |
下载弹幕 |
-e |
--encoding-priority |
编码优先级(如 hevc,av1,avc) |
-q |
--dfn-priority |
画质优先级 |
-p |
--select-page |
选择分 P(如 -p 1,3,5-10) |
-F |
--file-pattern |
自定义单 P 文件名格式 |
-M |
--multi-file-pattern |
自定义多 P 文件名格式 |
-c |
--cookie |
设置 Cookie |
--muxer-timeout |
混流超时时长(分钟,默认 30) | |
--retry-count |
网络请求失败重试次数(默认 3) | |
--retry-delay |
重试间隔基础毫秒数(默认 3000) | |
--thread-segment-size |
多线程下载分片大小(MB,默认 20) | |
--config-file |
指定配置文件路径 |
Commands:
login— APP 扫码登录 WEB 账号logintv— APP 扫码登录 TV 账号serve— 以 API 服务器模式运行-l, --listen— 监听地址(默认http://0.0.0.0:23333)--max-concurrent— 最大并发下载数(默认 3)
- 番剧下载(Web|TV|App)
- 课程下载(Web)
- 普通内容下载(Web|TV|App)
- 合集/列表/收藏夹/个人空间解析
- 多分P自动下载
- 选择指定分P进行下载
- 选择指定清晰度进行下载
- 下载外挂字幕并转换为srt/ass格式
- 自动合并音频+视频流+字幕流+章节信息
(使用ffmpeg或mp4box) - 单独下载视频/音频/字幕
- 二维码登录账号
- 多线程下载(支持自定义分片大小)
- 支持调用aria2c下载
- 支持AVC/HEVC/AV1编码
- 支持8K/HDR/杜比视界/杜比全景声下载
- Widevine DRM 解密 (原生C#实现, 无需 Python)
- 自定义存储文件名
- API 服务器模式(
BBDown serve,支持并发限制与文件日志) - 配置文件支持(
BBDown.config) - Ctrl+C 下载中断(CancellationToken 全链路贯通)
- .tmp 断点续传(崩溃后自动识别已下载的临时文件)
- API 服务器下载任务队列限制(
SemaphoreSlim(3)并发控制) -
HttpClientDNS 刷新配置(SocketsHttpHandler.PooledConnectionLifetime = 5min) -
BBDownMuxer.RunExe超时机制(30 分钟上限 + 强制终止) - 下载目标文件并发排他锁(按路径
SemaphoreSlim) - 异常粒度精细化(28 处
Exception→ 语义化类型) - 重试策略精细化(指数退避 + 不可重试异常短路)
- 下载链路
CancellationToken贯通(CLI Ctrl+C / API 请求取消) -
Config全局静态可变状态重构(AppSettingsrecord + 线程安全锁) -
.tmp文件断点续传(完整临时文件自动移动,写入校验修复) - 日志系统适配 API 服务器(
Logger.LogFilePath→bbdown-api.log) - 支持更多自定义选项(
--muxer-timeout/--retry-count/--retry-delay/--thread-segment-size) - 零测试覆盖 → 单元测试骨架(
BBDown.Tests+BilibiliBvConverterTests/UrlResolverTests/FormatHelperTests) - 拆分下载/解析核心方法(
UrlResolver.cs/ExternalToolHelper.cs) - API 并发数自定义(
--max-concurrent选项暴露 API 服务器并发限制) - Cookie 过期检测与明确提示(区分 "未登录" vs "Cookie 已过期")
- JSON 解析统一错误包装(
JsonElementExtensions+ 全项目 200+ 处调用迁移至 safe accessor)
当前所有高优先级 TODO 已完成。后续可继续优化单元测试覆盖率、增加更多 CLI/HTTP 自定义参数等。
配置文件 (NEW)
在1.4.9或更高版本中,BBDown支持读取本地配置文件以简化命令行的手动输入。
如果用户没有指定--config-file,则默认读取程序同目录下的BBDown.config文件;若用户指定,则读取特定文件。
一个典型的配置文件:
#本文件是BBDown程序的配置文件
#以#开头的都会被程序忽略
#然后剩余非空白内容程序逐行读取,对于一个选项,其参数应当在下一行出现
#例如下面将设置输出文件名格式
--file-pattern
<videoTitle>[<dfn>]
--multi-file-pattern
<videoTitle>/[P<pageNumberWithZero>]<pageTitle>[<dfn>]
#下面设置下载多个分P时,每个分P的下载间隔为2秒
--delay-per-page
2
#开启弹幕下载功能
--download-danmaku
自定义输出文件名格式 (NEW)
在1.4.9或更高版本中,BBDown支持用户自定义合并时的文件名组成。
| 代码 | 含义 |
|---|---|
<videoTitle> |
视频主标题 |
<pageNumber> |
视频分P序号 |
<pageNumberWithZero> |
视频分P序号(前缀补零) |
<pageTitle> |
视频分P标题 |
<bvid> |
视频BV号 |
<aid> |
视频aid |
<cid> |
视频cid |
<dfn> |
视频清晰度 |
<res> |
视频分辨率 |
<fps> |
视频帧率 |
<videoCodecs> |
视频编码 |
<videoBandwidth> |
视频码率 |
<audioCodecs> |
音频编码 |
<audioBandwidth> |
音频码率 |
<ownerName> |
上传者名称(下载番剧时,该值为"") |
<ownerMid> |
上传者mid(下载番剧时,该值为"") |
<publishDate> |
发布时间(yyyy-MM-dd_HH-mm-ss) |
<apiType> |
API类型(TV/APP/INTL/WEB) |
WEB/TV鉴权
扫码登录网页账号:
BBDown login
然后按照提示操作
扫码登录云视听小电视账号:
BBDown logintv
然后按照提示操作
PS: 如果登录报错The type initializer for 'Gdip' threw an exception,请参考 #37 解决
手动加载网页cookie:
BBDown -c "SESSDATA=******" "https://www.bilibili.com/video/BV1qt4y1X7TW"
手动加载云视听小电视token:
BBDown -tv -token "******" "https://www.bilibili.com/video/BV1qt4y1X7TW"
APP鉴权
根据 #123 ,可以填写TV登录产生的
access_token来给APP接口使用。可复制BBDownTV.data到BBDownApp.data使程序自动读取.
目前程序无法自动获取鉴权信息,推荐通过抓包来获取.
在请求Header中寻找键为authorization的项,其值形为identify_v1 5227************1,其中的5227************1就是token(access_key)
获取后手动通过-token命令加载, 或写入BBDownApp.data使程序自动读取.
BBDown -app -token "******" "https://www.bilibili.com/video/BV1qt4y1X7TW"
Widevine DRM 解密
BBDown 目前以原生 C# 实现了 Widevine CDM,可自动获取解密密钥并解密 B站 DRM 保护内容,无需 Python/pywidevine。
准备
- 获取一个
device.wvd文件(Widevine 设备文件,需自行提取或从可信来源获取) - 将
device.wvd放在以下任一位置:- 程序所在目录
- 环境变量
PATH中的目录 - macOS:
/opt/homebrew/bin/ Linux:/usr/local/bin/ Windows: 程序目录
使用
# 下载 DRM 保护的视频(自动解密)
BBDown --decrypt-drm "https://www.bilibili.com/cheese/play/ep1243104"如需手动指定 device.wvd 路径,可将其放置在工作目录或 PATH 环境变量中的目录里。
原理说明
- 使用
drm_tech_type=2请求标准 Widevine 流 - 从 B站许可证服务器获取密钥(兼容性取决于 device.wvd 的
security_level) - 解密后与普通视频一样进行混流输出
常用命令
下载普通视频:
BBDown "https://www.bilibili.com/video/BV1qt4y1X7TW"
使用TV接口下载(粉丝量大的UP主基本上是无水印片源):
BBDown -tv "https://www.bilibili.com/video/BV1qt4y1X7TW"
当分P过多时,默认会隐藏展示全部的分P信息,你可以使用如下命令来显示所有每一个分P。
BBDown --show-all "https://www.bilibili.com/video/BV1At41167aj"
选择下载某些分P的三种情况:
- 单个分P:10
BBDown "https://www.bilibili.com/video/BV1At41167aj?p=10"
BBDown -p 10 "https://www.bilibili.com/video/BV1At41167aj"
- 多个分P:1,2,10
BBDown -p 1,2,10 "https://www.bilibili.com/video/BV1At41167aj"
- 范围分P:1-10
BBDown -p 1-10 "https://www.bilibili.com/video/BV1At41167aj"
下载番剧全集:
BBDown -p ALL "https://www.bilibili.com/bangumi/play/ss33073"
API服务器
启动服务器(自定义监听地址和端口):
BBDown serve -l http://0.0.0.0:12450API服务器不支持HTTPS配置,如果有需要请自行使用nginx等反向代理进行配置
API详细请参考 API.md
下载完毕后在当前目录查看MP4文件:
# 克隆仓库
git clone https://github.com/AliverAnme/BBDown.git
cd BBDown
# 还原依赖并编译
dotnet restore
dotnet build
# 运行
BBDown/bin/Debug/net9.0/BBDown --help详细贡献指南请参考 CONTRIBUTING.md。
查看 CHANGELOG.md 了解版本历史。
本项目基于 MIT 许可证 开源。
安全漏洞报告请参考 SECURITY.md。请勿通过公开 Issue 报告安全问题。
本项目继承自 nilaoda/BBDown,在此感谢原作者的开创性工作。
- https://github.com/codebude/QRCoder
- https://github.com/icsharpcode/SharpZipLib
- https://github.com/protocolbuffers/protobuf
- https://github.com/grpc/grpc
- https://github.com/SocialSisterYi/bilibili-API-collect
- https://github.com/SeeFlowerX/bilibili-grpc-api
- https://github.com/FFmpeg/FFmpeg
- https://github.com/gpac/gpac
- https://github.com/aria2/aria2

