luminouspathway/bilibili-comment-collector
GitHub: luminouspathway/bilibili-comment-collector
一个B站评论采集系统,通过协议级还原极验三代验证码加密参数并配合YOLO+Siamese双模型实现自动登录与数据采集。
Stars: 1 | Forks: 0
# B站评论采集系统
## 项目概述
本项目的核心技术挑战是**分析极验三代(GeeTest v3)点选验证码**并完成 B站全链路自动登录,最终实现大规模评论数据采集。
不同于一般爬虫项目直接调用第三方打码平台,本项目从**协议层还原**了极验三代验证码的全部加密参数(w1/w2/w3),并结合 **YOLO + Siamese 双模型**实现点选坐标的端到端识别,是一套完整的"客户端指纹模拟 + 验证码识别 + 业务数据采集"解决方案。
## 技术栈
| 层次 | 技术 | 说明 |
|---|---|---|
| 协议分析 | Reqable | HTTP 抓包、请求对比 |
| 算法还原 | Python `pycryptodome` | AES-CBC + 自定义Base64 + RSA-1024 |
| 验证码识别 | YOLOv8s + Siamese Net (ONNX) | 全图目标检测 + 贪心匹配 |
| 轨迹模拟 | 贝塞尔曲线 + RLE 编码 | 极验三代 `$_BHIh` / `$_HDl` 轨迹压缩算法 |
| 浏览器自动化 | DrissionPage (Chromium) | 无头浏览器搜索 + 设备指纹提取 |
| WBI 签名 | HMAC-SHA256 + MD5 | B站新版 WBI 签名接口还原 |
| 数据存储 | MySQL + Redis | 评论持久化 + 视频ID队列 |
| GUI | Tkinter + Threading | 蓝白风格桌面应用,多线程防卡顿 |
## 核心分析模块
### 1. 极验三代点选验证码(核心亮点)
**需分析的参数:**
w1 参数:AES-CBC 加密配置 + 自定义 Base64 ($_HCB) + RSA 公钥加密
w2 参数:轨迹编码 ($_BHIh) + 指纹 ep/tm + MD5 + 设备信息
w3 参数:点击坐标 ca + 时间戳 + W2 校验 + RSA 签名
- **加密算法**:AES-128-CBC(自定义 iv)、RSA-1024(PKCS1_v1_5)、MD5
- **编码算法**:自定义 Base64 变体(`$_HCB` / `$_HEJ`),字符集 `A-Za-z0-9()`
- **轨迹压缩**:RLE + 类型编码 + 有符号整数压缩 —— 将数百个鼠标事件压缩为几十字符
- **设备指纹**:WebGL 渲染器、GPU 型号、时间戳、DOM 事件序列
**识别流程:**
验证码图片下载
→ YOLOv8s 全图检测
→ 分区 NMS(题目区 / 选项区)
→ Siamese 孪生网络相似度匹配
→ 贪心匹配输出点击坐标
- `click_identify.py`:YOLO + Siamese ONNX 推理,CPU 运行无需 GPU
- `bilibili_login.py`:w1/w2/w3 参数构造、轨迹生成、完整登录流程
**参考标准:** 极验三代 `click.3.1.2.js` + `fullpage.9.2.0.js`
### 2. B站 WBI 签名还原
B站 2024 年启用的新版 WBI 签名机制,从 `img_key` + `sub_key` 派生 `mixin_key`,对请求参数做 MD5 签名。
- `comment.py: BiliAuth` — 完整实现 `get_bili_ticket()` + `get_wbi_sign()`
### 3. 翻页游标修复
通过 Reqable HAR 抓包对比发现:B站评论接口 `pagination_reply` 返回 `next_offset`,但翻页请求参数名必须为 `offset`。字段名不匹配导致第 2 页起全部返回缓存数据(20 条重复但 `code=0`),属典型的**服务端静默反爬**。
## 项目结构
bilibili-comment-collector/
├── main.py # TK 桌面应用入口
├── comment.py # 评论采集核心(WBI签名、分页、MySQL写入)
├── bilibili_login.py # 登录模块(极验三代全参数还原 + 验证码识别)
├── click_identify.py # 验证码识别(YOLOv8s + Siamese 双模型)
├── get_id.py # 无头浏览器搜索视频ID
├── model/
│ ├── yolov8s.onnx # YOLOv8s 目标检测模型
│ └── siamese.onnx # Siamese 孪生网络模型
└── requirements.txt # Python 依赖
## 快速开始
# 1. 安装依赖
pip install -r requirements.txt
# 2. 启动 Redis 和 MySQL(使用默认端口和密码)
# 3. 启动应用
python main.py
**操作流程:**
搜索关键词 → 导入视频到列表 → 输入账号密码 → 点击登录(自动过极验) → 登录成功后采集评论
登录支持最多 3 次自动重试,验证码识别失败或密码错误均会自动刷新验证码重新尝试。
## 技术难点与解决方案
| 难点 | 解决方案 |
|---|---|
| 极验三代 w 参数还原 | 分析 `click.3.1.2.js`,还原 AES+RSA+自定义Base64 全链路 |
| 轨迹编码压缩 | 分析 `$_BHIh` 函数,实现 RLE + 类型编码 + 有符号整数压缩 |
| 点选坐标识别 | YOLO 全图检测 + 分区 NMS + Siamese 贪心匹配,CPU 推理 < 1s |
| B站二级风控(短信验证) | 无头浏览器提取设备指纹,减少风控触发 |
| 翻页数据重复 | Reqable 抓包对比浏览器/脚本请求差异,定位 `offset` 字段名问题 |
| 403 权限拦截 | 每页刷新 `bili_ticket` + WBI 密钥对,保持设备指纹一致 |
## 项目亮点
- **极验三代全参数协议还原**:分析 `click.3.1.2.js` / `fullpage.9.2.0.js`,还原 w1/w2/w3 全链路加密(AES-CBC + 自定义 Base64 `$_HCB` + RSA-1024 + MD5),纯 Python 实现,零第三方打码依赖
- **YOLO + Siamese 双模型点选识别**:YOLOv8s 全图检测 + 分区 NMS + Siamese 贪心匹配,CPU 推理 < 1s,无需 GPU
- **轨迹编码算法分析**:还原极验三代压缩算法(RLE + 类型编码 + 有符号整数编码),将数百个鼠标事件压缩为几十字符,通过行为风控检测
- **B站 WBI 签名 + 翻页游标修复**:全方位还原新版 WBI 签名机制,通过 Reqable 抓包对比修复 `pagination_reply` 字段名不匹配导致的服务端静默反爬
- **桌面应用工程化**:Tkinter 多线程桌面应用,集成无头浏览器自动化、登录重试、MySQL 批量写入、Redis 队列管理
## License
MIT
## 免责声明
本项目仅用于**技术研究与学习**,严禁用于任何商业用途或非法爬取行为。使用者须自行承担一切法律责任,开发者概不负责。
标签:B站, CNCF毕业项目, 云资产清单, 搜索引擎查询, 机器视觉, 自动化采集, 逆向工具, 逆向工程, 验证码识别