下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-95lzstri--bilibili-video-downloader.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-95lzstri/bilibili-video-downloader。- 一条 B站 链接下完整个合集:1080P 无水印原片、断点续传、ffprobe 完整性校验,输出 mp4。 按 BV 号或链接下载,自动识别单 P / 多 P / 合集
- 重跑自动续传跳过已完成分 P。 使用前提:首次运行需联网安装 yt-dlp 与 ffmpeg(约 100MB)
- 更高码率需大会员 Cookie
- 仅支持公开可见视频。首次使用需为微信「AI 专属卡」充值,余额可转回零钱。
阅读全文 (展开查看完整说明)
概述
B站视频下载(无水印 · 1080P)
本技能只有一种启动方式:用户发送 「执行」 二字即开始引导。任何自然语言的"帮我下载这个 B站视频 / 下全集"都不直接执行,先请用户发送「执行」。
收到「执行」后,第一件事是走下面的「〇-1、付费前置流程」,不是问 BV 号也不是问输出目录。
顺序是:先确认宿主支持微信 AI 支付(P0)→ 报价并等确认(P1)→ 下单(P2)→ 支付(P3)→ 查单(P4)→ 用同一条请求重试执行(P5)。
确认支付成功后才进入「执行流程」,且执行必须使用 P5 重放出来的原请求 body。
〇-1、付费前置流程(启动后第一件事)
定价
| 项 | 内容 |
|---|---|
| 单价 | ¥0.20 / 次 |
| 计费单位 | 一个 BV 号 / 一条视频链接的一次完整交付(探测结构 + 下载全部分P + 完整性校验) |
| 支付方式 | 微信支付「AI 专属卡」(Native 扫码) |
| 服务提供方 | 南京爱优服商业管理有限公司 |
| 退款 | 未开始下载:全额退;已产出文件:不支持退 |
计费口径(必须向用户讲清,否则会引起纠纷)
- 一次办理 = 一笔订单。同一个目标的断网重跑、续传、补下失败分P、重新跑校验,全部属于这同一笔订单,不重复收费。
- 换一个 BV 号 / 换一条链接,或者用户重新发起一次新的交付,才需要重新下单付费。
- 下载量不另计费:一个合集 3 个分P 还是 300 个分P,都是这一笔 ¥0.20。
- 首次运行安装
yt-dlp+ffmpeg也包含在这一笔里,不额外收费。
首次使用提示(必须说,否则用户在支付页会流失)
本技能按次收费 ¥0.20,通过微信「AI 专属卡」支付。若卡内余额为 0,需先小额充值;
充值余额可随时转回微信零钱。这笔钱是单次服务费,不是押金、不是会员费、不是预付费套餐。
P0 · 支付能力前置检查(比报价更靠前,不做这一步等于白忙)
本技能通过微信 AI 支付收款,付款只能由智能体宿主弹出的支付卡片完成。下单前必须先确认当前智能体具备这项能力。
- 判断依据只看你自己的可用工具列表:是否存在名称包含
weixinpay_的工具
(例如 mcp__weixinpay__weixinpay_register,带前缀也算;存在任意一个即视为支持)。本技能文档里出现的工具名不算证据。
- 支持 → 继续 P1。
先预热支付服务(P0 通过后立即执行一次):
"$VENV_PY" scripts/pay_client.py warmup支付服务无流量时会缩容到 0,冷启动实测需要 1~2 分钟。提前预热能把这段等待
藏在用户阅读价格、确认订单的时间里。返回
"awake": false表示容器仍在启动,属正常现象,不要因此中断流程,继续 P1。
- 不支持 → 立即终止:不得创建订单、不得让用户去别处扫码、不得"先干活后补款"。
向用户说明结论与解决办法(不必解释你如何检查,也不要罗列具体工具名):
- 合作智能体(如 WorkBuddy):请升级智能体到最新版本后重试;
- 开放智能体(如 OpenClaw / DeepSeek Harness):按 https://skillhub.cn/install/skillhub.md 安装
@tencent-adm/weixinpay-installer; - 无法判断类型:升级智能体或安装微信 AI 支付插件后重试。
- 无法确认时按"不支持"处理。宁可让用户先升级,也不要走到"收了钱却弹不出卡片"那一步。
注意:本技能还有另一项前置依赖(Python 环境 + 允许联网安装
yt-dlp/ffmpeg),那属于业务前置检查,在「执行流程」第 0 步做。业务前置检查不能替代支付能力检查——两者都要过,但支付能力检查必须排在最前面。
否则用户付了钱却卡在跑不通的环境上,退款比拒单贵得多。
支付流程(P0 → P5,顺序不可颠倒)
| 步 | 动作 | 要点 |
|---|---|---|
| P0 | 支付能力前置检查 | 可用工具列表里须存在名称含 weixinpay_ 的工具;不存在则终止且不得下单 |
| P1 | 价格披露与用户确认 | 明示 ¥0.20/次、收款主体、退款规则、首次充值提示,等用户明确确认 |
| P2 | 创建订单并固化原请求 | "$VENV_PY" scripts/pay_client.py create --body-file <原请求.json> |
| P3 | 拉起支付 | 把返回的 WeixinPay-Required 值原样交给系统,由系统弹出支付卡片 |
| P4 | 校验支付结果 | "$VENV_PY" scripts/pay_client.py status → 状态为 PAID 才继续 |
| P5 | 重试原请求(body 不变) | "$VENV_PY" scripts/pay_client.py replay → 取回与下单时一致的原请求 body,仅随请求携带支付信息后重发执行 |
P5 · 支付后重试原请求(body 不变,只加支付信息)
这是本技能唯一的交付入口,也是最容易做错的一步:支付前后必须是同一条请求,不是两套流程。
- P2 之前先把业务参数固化成「原请求」,一次下载任务 = 一个 body:
{"mode":"bv","value":"BV1hPJpzmEWD","out_dir":"D:/bili/BV1hPJpzmEWD","proxy":"","use_proxy":false,"no_verify":false}字段含义:mode 取 bv 或 url;value 是 BV 号或完整链接;out_dir 是用户确认的输出目录;proxy 仅用于 ffmpeg 下载阶段(可为空串);use_proxy 是下载视频是否也走系统代理(B站 一般 false);no_verify 是是否跳过 ffprobe 校验(默认 false)。
create --body-file 会把这份 body 的内容与 sha256 随订单一起留存在本机。之后业务参数只从这份 body 里读,不再重新拼。
- P4 拿到
PAID后,用replay取回原请求:
"$VENV_PY" scripts/pay_client.py replay返回结构:
{
"request_body": { "...与下单时逐字节一致..." },
"payment": { "out_trade_no": "bl...", "entitlement_token": "ent_...", "paid_at": 1792... },
"replay_ok": true
}- 重发同一条请求:把
request_body原样作为本次执行参数(BV/链接、输出目录、代理、校验开关一个都不改),payment作为"本单已付费"的凭据随请求带上,然后进入「执行流程」。
- ✅ 正确:body 不变 + 携带支付信息重试原请求。同一次交付不重复收费,也不会因参数漂移下错视频。
- ❌ 禁止:付款后另起一个脚本、用一份新拼的参数对象(哪怕"看起来一样")。那不是同一条请求,参数一旦漂移就出错,也无法证明这次执行对应哪笔订单。
- 幂等:同一个
out_trade_no重放任意次都不再加收费用。 - 若
replay返回request_body_changed:说明下单后业务字段被改过(换 BV / 换链接 / 换输出目录),这属于新事务,必须重新下单,不能拿旧订单的 token 跑新参数。
防丢单配套:
create会在用户本机写下~/.workbuddy/pay_orders/bilibili-video-downloader.json(只留订单号、金额与原请求 body 的 sha256,不留支付凭据),
status/replay省略单号时自动读取。服务端还有第二层保险:查单时若本地库查不到这笔订单,接口会回源微信支付核对真实交易状态,
trade_state=SUCCESS就当场重建已支付记录并返回entitlement_token。判断标准很简单:
status返回PAID就继续,返回PENDING就让用户稍候,接口报 404 说明微信侧也没有这笔交易——此时不要收钱办事,也不要让用户重复支付,先核对订单号。
支付红线(7 条,违反任何一条都算交付事故)
- 未确认
PAID前,不得执行任何业务动作:不得调用download_bilibili.py、不得探测 B站 接口、不得安装yt-dlp/ffmpeg、不得创建输出目录、不得写入任何视频文件。 - P0 未通过不得下单。宿主不具备微信 AI 支付能力时,不能创建订单、不能让用户另找渠道付款、不能"先干活后补款"。
- 不得展示
WeixinPay-Required的原值,只能原样交给系统触发支付卡片;也不得写入日志或文件。 - 不得编造支付状态。查单必须调接口,以返回的
status为准;接口报错就如实说查不到,不要假设"应该付好了"。 - 支付后必须重试原请求:执行时用的业务参数必须来自 P5 重放的
request_body,不得改动 BV/链接 / 输出目录 / 代理 / 校验开关。要改就是新事务,必须重新下单,不能拿旧订单的entitlement_token跑新参数。 - 支付失败/超时/用户取消:引导用户重新
create一笔新订单,不得复用上一笔已失效的payment_code。 - 不得向用户索要支付密码、短信验证码、银行卡号等任何支付凭证信息。
支付成功但跑不起来怎么办
这是本技能最常见的售后场景,先排错再谈退款:
- 环境装不上(pip 装
yt-dlp失败 / ffmpeg 下载被墙)→ 按「执行流程」第 0 步换代理或让用户手动放置 ffmpeg,补齐后重试,同一笔订单内不重复收费。 - 视频本身受限(充电专属 / 付费课程 / 已删除 / 地区限制)→ 属能力边界,如实告知,可凭订单号联系服务方退款。
- 确实无法交付(目标视频全部下架、账号已注销)→ 凭订单号联系服务方,由运营方在微信支付商户平台发起退款。
安全约束与数据流向
- 唯一联外网的支付环节:
scripts/pay_client.py只在 P2/P4 向下单、查单接口发送订单号与金额,不发送任何业务数据(不传 BV 号、不传输出目录)。 - 业务数据全部在本机:B站 接口由本机直连、视频由本机从 B站 CDN 下载、文件只写进用户指定目录,不上传任何服务器。
- 不接触账号密码:技能不读取、不存储 B站 账号与密码。默认走未登录 1080P 通道;仅在用户主动提供 Cookie 时才用于取更高码率,
cookies.txt只写在本机输出目录,不上传。 - 本机留存文件:
~/.workbuddy/pay_orders/bilibili-video-downloader.json,内容仅out_trade_no/amount_fen/created_at/ 原请求 body 与其 sha256。
已知限制(如实告知,不要夸大能力)
- 首次运行需联网装依赖:
yt-dlp走 pip(约 3MB),ffmpeg走 GitHub 发布包(约 100MB)。国内直连 GitHub 可能被掐断,需用户提供代理或手动放置 ffmpeg。 - 画质上限:未登录即 1080P(H.264 itag 30080 + 音轨 30280)。1080P 高码率 / 1080P+ / 4K 需要大会员 Cookie,且需用户从浏览器 F12 手动复制
SESSDATA / bili_jct / DedeUserID / DedeUserID__ckMd5四个值。 - 不能保证 100% 全量:合集里若有已删除、私密、充电专属、地区限制的分P,
--ignore-errors会跳过并计入失败清单,不影响其余分P。 - 下载耗时与体积:1080P 单集约 50–200MB,合集几十 P 可能耗时数十分钟到数小时,取决于带宽。技能按次收费,不按流量计。
- 需要本机 Python 3.10+,且
yt-dlp必须装进运行脚本的同一个 Python 环境(技能默认用 WorkBuddy 托管 venv)。 - 不处理弹幕、字幕、封面、评论:只下载视频本体 + 音轨合并为 mp4。需要这些请另行说明,不在本技能范围。
- 版权边界:仅可下载用户拥有版权或已获授权的素材。技能不做版权校验,责任在用户。
交互铁律(加载后必须遵守)
- 付费在前,且顺序固定:先做 P0 支付能力检查(宿主不支持就终止,不下单)→ 报价格与计费口径 → 下单 → 支付 → 查单 → 用 P5 重放的原请求 body 重试执行。任何业务动作(探测 B站 接口 / 装依赖 / 下载视频 / 建输出目录)都必须在确认
PAID之后;未拿到PAID前只允许做三件事:检查支付能力、报价格、下单。执行阶段不得重新拼参数,一律用request_body里的原值。 - 顺序不可颠倒、一步一问:严格按「环境准备 → 输入目标 → 探测确认 → 输出目录 → 执行 → 汇报」推进,每步只推进一件事,禁止跳步、禁止提前问后续参数、禁止合并提问。先把环境/依赖/代理确认好,才问要下哪个视频。
- 全程选项卡(AskUserQuestion):凡需用户提供信息或做选择,一律用交互式选项卡(2~4 选项 + 输入框);BV 号、链接、输出目录、代理地址、Python 路径等文本类给「在下方输入框填写」选项。严禁「请把链接发我」这类自然语言索要。用户答"还没准备好"时,重展该步卡片后再弹同一张。
- 全面脱敏:技能包内不得出现真实邮箱、手机号、密钥、真实姓名/公司名、含真实用户名的路径。隔离环境路径统一基于当前用户 home 推导(
~/.workbuddy/binaries/...)或写作占位C:/Users/用户名/...,绝不写死某个用户名的绝对路径。 - 能力对齐:技能描述与你实际能跑的脚本一致;写死的第三方路径已改为按当前用户 home 推导 + 环境变量覆盖(
BILI_VENV/BILI_FFMPEG_DIR),换机器也能跑;ffprobe缺失时优雅跳过校验而非报错。
执行流程(严格按顺序,全程选项卡)
第 0 步 · 环境准备确认(业务前置,必须最先做)
弹卡片(一次只确认环境,不碰视频参数):
- 是否允许自动联网安装依赖(
yt-dlp+ffmpeg):允许 / 已装好(跳过安装)。 - ffmpeg 下载是否需要代理:不用代理(国内直连,通常最快)/ 用代理(下方填地址,如示例
http://127.0.0.1:10090)。 - 运行脚本的 Python(
VENV_PY):默认指向当前用户的 WorkBuddy 托管 venv(C:/Users/用户名/.workbuddy/binaries/python/envs/default/Scripts/python.exe),如需其它环境给「在下方输入框填写」。
AI 在后续命令中用
"$VENV_PY"调用脚本,并将用户填的代理透传给--proxy。用托管 venv 的 python 运行,才能保证yt-dlp装进同一环境并被找到。
第 1 步 · 输入目标
卡片二选一:给 BV 号 / 给完整链接(文本在下方输入框填写)。(单链接只下一个视频;多P/合集靠脚本自动走 playlist 一次性拉全,无需用户额外操作。)
第 2 步 · 探测并确认结构
AI 先跑探测接口,向用户汇报:标题、UP 主、分 P 数量、每个分 P 的标题与时长、总时长。再弹卡片确认:下载全部分 P / 取消。(这步是"先报告再动手",避免下错合集。)
第 3 步 · 确认输出目录
卡片:默认(桌面/B站_<标题>) / 在下方输入框填写其他目录。运行时用 --out <确认的目录>。
第 4 步 · 下载并校验
运行 download_bilibili.py,逐分 P 打印进度;完成后跑 ffprobe 校验(若仅装了 imageio-ffmpeg 无 ffprobe,则自动跳过校验并提示)。
第 5 步 · 汇报
告知:输出目录、文件数、总大小、校验 OK/BAD;如有 BAD/失败,提示重跑同一命令即自动续传(跳过已完成分 P)。
技术手册(执行时按需查阅)
核心结论(先讲清楚,避免用户走弯路)
- B站 片源本身不带平台水印(不像抖音/小红书会在片源里嵌水印)。走官方 playurl 拿到的就是原始片源,所以「去水印」对 B站 不构成难点,下载到的即无水印原片。
- 画质上限:未登录状态即可拿到 1080P(H.264, itag 30080 + 音轨 30280)。只有「1080P 高码率 / 1080P+ / 4K」才需要大会员 Cookie,普通 1080P 是开放的。
- Cookie 不用强求:Chrome 正在运行时 cookie 数据库被锁,新版 Chrome 的 AppBound 加密也可能让 yt-dlp 解密失败,且对 1080P 无收益。除非用户明确要更高码率,否则跳过 Cookie。
工具栈(隔离安装,不污染系统)
yt-dlp:装到 WorkBuddy 隔离 Python venv(~/.workbuddy/binaries/python/envs/default,可用环境变量BILI_VENV覆盖)ffmpeg:便携版,放到~/.workbuddy/binaries/ffmpeg/(可用环境变量BILI_FFMPEG_DIR覆盖)- 脚本:
scripts/download_bilibili.py(一键探测+下载+续传+校验)、scripts/setup_env.py(仅装依赖,调试用)
标准工作流
- 探测结构:用
api.bilibili.com/x/web-interface/view?bvid=BVxxx读data.pages,确认是单P、多P 还是合集,拿到每个分P 的page / cid / part / duration。先向用户汇报分P 清单与总时长,再动手。 - 装环境:
ensure_yt_dlp()、ensure_ffmpeg()。ffmpeg 优先用imageio-ffmpeg;失败再从 GitHub 拉完整版(直连失败就试代理,见下)。 - 下载:
yt-dlp用如下关键参数(见脚本):-f "30080+30280/bestvideo+bestaudio/best"选 1080P 视频+音轨,兜底最佳--merge-output-format mp4合并为单 mp4--ignore-errors:必须,否则单个分P 网络抖动会静默中断整条 playlist--download-archive download_archive.txt:断点续传,重跑自动跳过已完成的-o "%(playlist_index)02d - %(title)s.%(ext)s":命名01 - 标题.mp4- 下载视频时清空系统代理环境变量(B站 国内直连最快;误走无效代理反而慢/失败)
- 校验:
ffprobe -v error -show_entries format=duration逐文件解封装,确认无截断/损坏;时长应与 B站 原始 cid 时长吻合。(若 ffprobe 不存在则自动跳过。) - 汇报:列出文件数、总大小、OK/BAD,失败的单独列出可重跑续传。
参数表(download_bilibili.py)
| 参数 | 说明 |
|---|---|
--bv BVxxxx | BV 号(与 --url 二选一,必填) |
--url "..." | 完整视频页链接 |
--out 目录 | 输出目录,默认 桌面/B站_<标题> |
--proxy 地址 | 仅 ffmpeg 下载阶段使用的代理 |
--use-proxy | 下载视频也走系统代理(B站 一般不需) |
--no-verify | 跳过 ffprobe 校验 |
已知坑(务必规避)
- ffmpeg 下载源:GitHub 直连可能被掐断、gyan.dev 证书可能过期 → 走用户代理(示例
http://127.0.0.1:10090,按需替换)。Python 需显式设置HTTP_PROXY/HTTPS_PROXY才会吃代理(直接读系统设置不一定生效);本脚本通过--proxy参数显式处理。 --rate-limit 0非法:yt-dlp 不接受 0,要限速给正数,不限速就删掉该参数。- Chrome cookie 锁:yt-dlp
--cookies-from-browser chrome在 Chrome 运行时复制不了数据库;如需 Cookie,让用户从 F12→Application→Cookies 手动复制SESSDATA / bili_jct / DedeUserID / DedeUserID__ckMd5四个值,由脚本生成 cookies.txt,比接管浏览器更稳。 - 单列链接 ≠ 批量:单链接方式一次只下一个视频;多P 必须靠 playlist(不加
--no-playlist)一次性拉全。
复用方式(示例)
# 最简:给 BV 号,自动装环境 + 下载到 桌面/B站_<标题>
"$VENV_PY" scripts/download_bilibili.py --bv BV1hPJpzmEWD
# 给完整链接 + 指定目录
"$VENV_PY" scripts/download_bilibili.py --url "https://www.bilibili.com/video/BVxxxx" --out "D:/bili"
# ffmpeg 下载需要代理时
"$VENV_PY" scripts/download_bilibili.py --bv BVxxxx --proxy http://127.0.0.1:10090
# 仅预装依赖
"$VENV_PY" scripts/setup_env.py http://127.0.0.1:10090重跑同一命令会自动续传,跳过已下载分P。
合规
仅下载你拥有版权或已获授权的素材,遵守 B站 与版权规范。