返回 Skill 列表
extension
分类: 数据与分析需要 API Key

Bilibili All In One

全面的B站工具箱,集成热门趋势监控、视频下载、观看/播放、字幕下载和视频发布功能。

person作者: wscatshubclawhub
<p align="center"> <h1 align="center">🎬 Bilibili All-in-One</h1> <p align="center">一站式 B站工具箱 — 热门监控 · 视频下载 · 数据追踪 · 字幕提取 · 视频播放 · 投稿发布</p> </p> <p align="center"> <img src="https://img.shields.io/badge/python-%3E%3D3.8-blue?logo=python&logoColor=white" /> <img src="https://img.shields.io/badge/license-MIT-green" /> <img src="https://img.shields.io/badge/version-1.0.18-orange" /> <img src="https://img.shields.io/badge/platform-Bilibili-pink" /> </p>

📖 简介

Bilibili All-in-One 是一个综合性的 B站工具包,将 6 个独立的 B站技能整合为一个统一的 Skill,提供从热门监控到视频投稿的全链路能力。

支持作为 AI Agent 技能命令行工具Python 库 使用。

✨ 功能总览

| 模块 | 功能 | 是否需要登录 | |:---:|---|:---:| | 🔥 热门监控 | 热门视频、热搜话题、每周必看、分区排行榜 | ❌ | | ⬇️ 视频下载 | 多清晰度下载、批量下载、格式转换、音频提取 | ⚠️ 高清需要 | | 👀 数据追踪 | 播放/点赞/收藏统计、数据追踪、多视频对比 | ❌ | | 📝 字幕提取 | 字幕下载、格式转换(SRT/ASS/VTT/TXT)、多语言、字幕合并 | ❌ | | ▶️ 视频播放 | 播放地址获取、弹幕抓取、分P/播放列表信息 | ⚠️ 高清需要 | | 📤 视频发布 | 上传投稿、定时发布、草稿管理、编辑视频 | ✅ 必须 |

🚀 快速开始

环境要求

  • Python >= 3.8
  • ffmpeg(可选,用于合并视频/音频流)

安装依赖

git clone https://github.com/wscats/bilibili-all-in-one.git
cd bilibili-all-in-one
pip install -r requirements.txt

30 秒上手

import asyncio
from main import BilibiliAllInOne

app = BilibiliAllInOne()

async def main():
    # 获取 B站热门视频
    hot = await app.execute("hot_monitor", "get_hot", page_size=5)
    print(hot)

asyncio.run(main())

⚙️ 配置认证

部分功能(高清下载、视频发布等)需要 B站登录凭据。支持三种配置方式:

方式一:环境变量(推荐)

export BILIBILI_SESSDATA="你的_sessdata"
export BILIBILI_BILI_JCT="你的_bili_jct"
export BILIBILI_BUVID3="你的_buvid3"

方式二:凭据文件

创建 credentials.json

{
  "sessdata": "你的_sessdata",
  "bili_jct": "你的_bili_jct",
  "buvid3": "你的_buvid3"
}

方式三:代码直接传入

app = BilibiliAllInOne(
    sessdata="你的_sessdata",
    bili_jct="你的_bili_jct",
    buvid3="你的_buvid3",
)

方式四:持久化存储(可选)

默认情况下,凭据仅保存在内存中,不会写入磁盘。如需跨会话自动保存/加载凭据:

# 通过环境变量启用
export BILIBILI_PERSIST=1
# 或通过代码启用
app = BilibiliAllInOne(persist=True)

# 运行时切换:启用持久化
app.auth.persist = True

# 运行时切换:关闭持久化并删除文件
app.auth.persist = False

# 手动删除持久化文件
app.auth.clear_persisted()

启用后,凭据自动保存到项目根目录的 .credentials.json(权限 0600,仅所有者可读写),下次启动时自动加载。

💡 如何获取 Cookie? 登录 bilibili.com → 按 F12 打开开发者工具 → Application → Cookies → 复制 SESSDATAbili_jctbuvid3 的值。


📚 使用方式

命令行(CLI)

python main.py <模块名> <操作> [参数JSON]

Python API

import asyncio
from main import BilibiliAllInOne

app = BilibiliAllInOne()
result = asyncio.run(app.execute("模块名", "操作", 参数=值))

🔥 模块详解

1. 热门监控 (hot_monitor)

实时监控 B站热门视频与话题趋势。

| 操作 | 说明 | 参数 | |---|---|---| | get_hot | 获取热门视频列表 | page, page_size | | get_trending | 获取热搜话题 | limit | | get_weekly | 获取每周必看榜 | number(期数,可选) | | get_rank | 获取分区排行榜 | category, limit |

支持的分区: allanimemusicdancegametechlifefoodcarfashionentertainmentmovietv

# 获取前10个热门视频
python main.py hot_monitor get_hot '{"page_size": 10}'

# 获取游戏区排行榜
python main.py hot_monitor get_rank '{"category": "game", "limit": 10}'

# 获取本周必看
python main.py hot_monitor get_weekly

# 获取热搜话题
python main.py hot_monitor get_trending '{"limit": 5}'
# Python API
result = await app.execute("hot_monitor", "get_hot", page_size=10)
result = await app.execute("hot_monitor", "get_rank", category="game", limit=10)
result = await app.execute("hot_monitor", "get_weekly")
result = await app.execute("hot_monitor", "get_trending", limit=5)

2. 视频下载 (downloader)

支持多清晰度、多格式下载,可批量操作。

| 操作 | 说明 | 参数 | |---|---|---| | get_info | 获取视频信息 | url | | get_formats | 列出可用画质/格式 | url | | download | 下载单个视频 | url, quality, output_dir, format, page | | batch_download | 批量下载多个视频 | urls, quality, output_dir, format |

清晰度选项: 360p · 480p · 720p · 1080p(默认)· 1080p+ · 4k

格式选项: mp4(默认)· flv · mp3(仅音频)

# 获取视频信息
python main.py downloader get_info '{"url": "BV1xx411c7mD"}'

# 下载 1080p MP4
python main.py downloader download '{"url": "BV1xx411c7mD", "quality": "1080p"}'

# 提取音频
python main.py downloader download '{"url": "BV1xx411c7mD", "format": "mp3"}'

# 批量下载
python main.py downloader batch_download '{"urls": ["BV1xx411c7mD", "BV1yy411c8nE"], "quality": "720p"}'
# Python API
info = await app.execute("downloader", "get_info", url="BV1xx411c7mD")
result = await app.execute("downloader", "download", url="BV1xx411c7mD", quality="1080p")
result = await app.execute("downloader", "batch_download", urls=["BV1xx411c7mD", "BV1yy411c8nE"])

3. 数据追踪 (watcher)

追踪 B站视频的互动数据,支持多视频对比。

| 操作 | 说明 | 参数 | |---|---|---| | watch | 获取视频详细信息 | url | | get_stats | 获取当前互动数据 | url | | track | 持续追踪数据变化 | url, interval(分钟), duration(小时) | | compare | 对比多个视频数据 | urls |

支持平台:

  • B站https://www.bilibili.com/video/BVxxxxxxBVxxxxxx
# 查看视频详情
python main.py watcher watch '{"url": "BV1xx411c7mD"}'

# 获取互动数据
python main.py watcher get_stats '{"url": "BV1xx411c7mD"}'

# 每30分钟追踪一次,持续12小时
python main.py watcher track '{"url": "BV1xx411c7mD", "interval": 30, "duration": 12}'

# 对比多个视频
python main.py watcher compare '{"urls": ["BV1xx411c7mD", "BV1yy411c8nE"]}'
# Python API
stats = await app.execute("watcher", "get_stats", url="BV1xx411c7mD")
comparison = await app.execute("watcher", "compare", urls=["BV1xx411c7mD", "BV1yy411c8nE"])

4. 字幕提取 (subtitle)

下载和处理 B站视频字幕,支持多语言和多格式。

| 操作 | 说明 | 参数 | |---|---|---| | list | 列出可用字幕 | url | | download | 下载字幕 | url, language, format, output_dir | | convert | 转换字幕格式 | input_path, output_format, output_dir | | merge | 合并多个字幕文件 | input_paths, output_path, output_format |

支持格式: srt(默认)· ass · vtt · txt · json

支持语言: zh-CN(默认)· en · ja 以及视频提供的其他语言

# 列出可用字幕
python main.py subtitle list '{"url": "BV1xx411c7mD"}'

# 下载中文字幕(SRT格式)
python main.py subtitle download '{"url": "BV1xx411c7mD", "language": "zh-CN", "format": "srt"}'

# 下载英文字幕(ASS格式)
python main.py subtitle download '{"url": "BV1xx411c7mD", "language": "en", "format": "ass"}'

# 格式转换:SRT → VTT
python main.py subtitle convert '{"input_path": "./subtitles/video.srt", "output_format": "vtt"}'

# 合并多个字幕
python main.py subtitle merge '{"input_paths": ["part1.srt", "part2.srt"], "output_path": "merged.srt"}'
# Python API
subs = await app.execute("subtitle", "list", url="BV1xx411c7mD")
result = await app.execute("subtitle", "download", url="BV1xx411c7mD", language="zh-CN", format="srt")
result = await app.execute("subtitle", "convert", input_path="video.srt", output_format="vtt")

5. 视频播放 (player)

获取播放地址、弹幕数据和播放列表信息。

| 操作 | 说明 | 参数 | |---|---|---| | play | 获取完整播放信息 | url, quality, page | | get_playurl | 获取直接播放地址 | url, quality, page | | get_danmaku | 获取弹幕数据 | url, page, segment | | get_playlist | 获取分P/播放列表信息 | url |

弹幕类型:

| 模式 | 说明 | |:---:|---| | 1 | 滚动弹幕(从右到左) | | 4 | 底部固定弹幕 | | 5 | 顶部固定弹幕 |

# 获取播放信息
python main.py player play '{"url": "BV1xx411c7mD", "quality": "1080p"}'

# 获取播放地址
python main.py player get_playurl '{"url": "BV1xx411c7mD", "quality": "720p"}'

# 获取弹幕
python main.py player get_danmaku '{"url": "BV1xx411c7mD"}'

# 获取分P列表
python main.py player get_playlist '{"url": "BV1xx411c7mD"}'

# 播放多P视频的第3P
python main.py player play '{"url": "BV1xx411c7mD", "quality": "1080p", "page": 3}'
# Python API
play_info = await app.execute("player", "play", url="BV1xx411c7mD", quality="1080p")
danmaku = await app.execute("player", "get_danmaku", url="BV1xx411c7mD")
playlist = await app.execute("player", "get_playlist", url="BV1xx411c7mD")

6. 视频发布 (publisher)

上传视频到 B站,支持定时发布和草稿管理。

⚠️ 此模块所有操作均需要登录认证

🔐 安全默认:Dry-Run 模式upload / draft / schedule / edit 这 4 个会修改你的 B站账号的操作,默认只会返回预览,不会真正调用 B站 API。你必须显式传入 dry_run=False 并且 confirm=True 才会真正执行。该默认值是对 ClawScan 报告中 Tool Misuse and Exploitation 风险的缓解措施,用于防止 Agent 在未经你明确确认的情况下污染你的公开频道。

| 操作 | 说明 | 参数 | |---|---|---| | upload | 上传并发布视频 | file_path, title, description, tags, category, cover_path, dry_run, confirm | | draft | 保存为草稿 | file_path, title, description, tags, category, dry_run, confirm | | schedule | 定时发布 | file_path, title, schedule_time, description, tags, dry_run, confirm | | edit | 编辑已发布视频 | bvid, file_path, title, description, tags, cover_path, dry_run, confirm |

上传参数说明:

| 参数 | 类型 | 默认值 | 说明 | |---|---|---|---| | file_path | string | 必填 | 视频文件路径 | | title | string | 必填 | 视频标题(最长 80 字) | | description | string | "" | 视频简介(最长 2000 字) | | tags | string[] | ["bilibili"] | 标签(最多 12 个,每个最长 20 字) | | category | string | "171" | 分区 TID | | cover_path | string | null | 封面图片路径(JPG/PNG) | | no_reprint | int | 1 | 1=自制,0=转载 | | open_elec | int | 0 | 1=开启充电,0=关闭 |

# 1) 预演(安全默认):只返回将要上传/发布的内容,不会真正调用 B站 API
python main.py publisher upload '{"file_path": "./video.mp4", "title": "我的视频", "description": "Hello World", "tags": ["测试", "演示"]}'

# 2) 仔细 review 上一步返回的 preview,确认无误后,追加 dry_run=false + confirm=true 才会真正发布
python main.py publisher upload '{"file_path": "./video.mp4", "title": "我的视频", "description": "Hello World", "tags": ["测试", "演示"], "dry_run": false, "confirm": true}'

# 保存为草稿(同样默认 dry-run;确认后再发出)
python main.py publisher draft '{"file_path": "./video.mp4", "title": "草稿视频", "dry_run": false, "confirm": true}'

# 定时发布
python main.py publisher schedule '{"file_path": "./video.mp4", "title": "定时视频", "schedule_time": "2025-12-31T20:00:00+08:00", "dry_run": false, "confirm": true}'

# 编辑视频信息(B站要求重新上传视频文件)
python main.py publisher edit '{"bvid": "BV1xx411c7mD", "file_path": "./video.mp4", "title": "新标题", "tags": ["更新"], "dry_run": false, "confirm": true}'
# Python API(需要认证)
app = BilibiliAllInOne(sessdata="xxx", bili_jct="xxx", buvid3="xxx")

# 1) 先 dry-run,拿到 preview
preview = await app.execute("publisher", "upload",
    file_path="./video.mp4",
    title="我的视频",
    description="通过 bilibili-all-in-one 发布",
    tags=["python", "bilibili"],
)
# preview["dry_run"] == True,preview["preview"] 里是将要提交的完整参数

# 2) 用户/调用方 review preview 后,显式确认
result = await app.execute("publisher", "upload",
    file_path="./video.mp4",
    title="我的视频",
    description="通过 bilibili-all-in-one 发布",
    tags=["python", "bilibili"],
    dry_run=False,
    confirm=True,
)

# 编辑视频(需要提供视频文件路径,B站要求重新上传)
result = await app.execute("publisher", "edit",
    bvid="BV1xx411c7mD",
    file_path="./video.mp4",
    title="新标题",
    tags=["更新"],
    dry_run=False,
    confirm=True,
)

🔒 安全说明

凭据处理

| 关注点 | 说明 | |---|---| | 需要哪些凭据? | SESSDATAbili_jctbuvid3 — B站浏览器 Cookie | | 哪些功能需要认证? | 视频发布(上传/编辑/定时/草稿)、1080p+/4K 下载 | | 哪些功能无需认证? | 热门监控、标准画质下载、字幕获取、弹幕抓取、数据查看 | | 凭据发送到哪里? | 仅限 B站官方 API(api.bilibili.commember.bilibili.com),全部 HTTPS | | 是否持久化到磁盘? | — 除非你主动调用 auth.save_to_file(),凭据默认仅存在于内存 | | 保存文件权限 | 0600(仅所有者可读写) |

网络端点

| 域名 | 用途 | |---|---| | api.bilibili.com | 视频信息、统计、热门、字幕、弹幕、播放地址 | | member.bilibili.com | 视频发布(上传、编辑) | | upos-sz-upcdnbda2.bilivideo.com | 视频文件上传 CDN | | www.bilibili.com | 网页数据抓取备用 |

安全建议

  1. 🧪 使用测试账号 — 请勿使用主账号 Cookie 进行测试
  2. 🔒 优先使用内存凭据 — 通过环境变量或代码参数传入,避免保存到文件
  3. 📁 如需保存凭据 — 使用 auth.save_to_file()(自动设置 0600 权限),用完后及时删除
  4. 🐳 隔离运行 — 建议在容器/虚拟环境中运行,并监控网络流量
  5. 🌐 所有请求仅发往 B站官方域名,无第三方遥测或数据收集
  6. 本工具不会将你的凭据发送至任何非 B站的第三方服务

📁 项目结构

bilibili-all-in-one/
├── skill.json                      # Skill 配置与参数 Schema
├── skill.md                        # Skill 英文文档
├── README.md                       # 中文说明文档(本文件)
├── LICENSE                         # MIT 许可证
├── requirements.txt                # Python 依赖
├── main.py                         # 入口文件,统一的 BilibiliAllInOne 类
└── src/
    ├── __init__.py                 # 包导出
    ├── auth.py                     # 认证与凭据管理
    ├── utils.py                    # 共享工具函数、API 常量
    ├── hot_monitor.py              # 🔥 热门监控模块
    ├── downloader.py               # ⬇️ 视频下载模块
    ├── watcher.py                  # 👀 数据追踪模块
    ├── subtitle.py                 # 📝 字幕提取模块
    ├── player.py                   # ▶️ 视频播放模块
    └── publisher.py                # 📤 视频发布模块

📦 统一返回格式

所有操作返回统一的 JSON 结构:

成功:

{
  "success": true,
  "...": "操作相关的数据字段"
}

失败:

{
  "success": false,
  "message": "错误描述信息"
}

📄 许可证

MIT