文件预览

README.md

查看 Bilibili All In One 技能包中的文件内容。

文件内容

README.md


<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**(可选,用于合并视频/音频流)

### 安装依赖

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

### 30 秒上手

```python
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站登录凭据。支持三种配置方式:

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

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

### 方式二:凭据文件

创建 `credentials.json`:

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

### 方式三:代码直接传入

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

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

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

```bash
# 通过环境变量启用
export BILIBILI_PERSIST=1
```

```python
# 或通过代码启用
app = BilibiliAllInOne(persist=True)

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

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

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

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

> 💡 **如何获取 Cookie?** 登录 [bilibili.com](https://www.bilibili.com) → 按 F12 打开开发者工具 → Application → Cookies → 复制 `SESSDATA`、`bili_jct`、`buvid3` 的值。

---

## 📚 使用方式

### 命令行(CLI)

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

### Python API

```python
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` |

**支持的分区:** `all`、`anime`、`music`、`dance`、`game`、`tech`、`life`、`food`、`car`、`fashion`、`entertainment`、`movie`、`tv`

```bash
# 获取前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
# 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`(仅音频)

```bash
# 获取视频信息
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
# 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/BVxxxxxx` 或 `BVxxxxxx`

```bash
# 查看视频详情
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
# 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` 以及视频提供的其他语言

```bash
# 列出可用字幕
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
# 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 | 顶部固定弹幕 |

```bash
# 获取播放信息
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
# 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=关闭 |

```bash
# 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
# 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,
)
```

---

## 🔒 安全说明

### 凭据处理

| 关注点 | 说明 |
|---|---|
| **需要哪些凭据?** | `SESSDATA`、`bili_jct`、`buvid3` — B站浏览器 Cookie |
| **哪些功能需要认证?** | 视频发布(上传/编辑/定时/草稿)、1080p+/4K 下载 |
| **哪些功能无需认证?** | 热门监控、标准画质下载、字幕获取、弹幕抓取、数据查看 |
| **凭据发送到哪里?** | **仅限** B站官方 API(`api.bilibili.com`、`member.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 结构:

**成功:**

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

**失败:**

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

## 📄 许可证

[MIT](LICENSE)