B站直播控制面板助手
项目介绍
这是一个基于Tampermonkey的B站直播辅助脚本,为主播提供了一套完整的直播间管理工具。通过简洁的UI界面,用户可以快速开关直播、更新直播信息、获取推流地址等,无需频繁切换B站官方直播后台,大幅提高直播管理效率。
主要功能
- 用户认证:检查登录状态并提供可视化反馈
- 二维码登录:快速扫码登录B站账号
- 直播控制:开始/停止直播
- 信息管理:更新直播标题和分区
- 推流管理:获取RTMP推流地址
- 直播监控:查看直播状态和历史记录
- 可拖动面板:通过标题栏拖动控制面板到任意位置
安装使用
- 安装 Tampermonkey 浏览器扩展
- 创建新脚本,复制并粘贴
bilibili_live_tampermonkey.js
的内容
- 保存并启用脚本
- 访问B站页面,右上角会出现一个蓝色控制按钮
- 点击按钮打开直播控制面板
B站API接口详解
用户认证相关API
直播控制相关API
签名验证机制
B站API的安全机制主要包括以下几种:
1. APP_KEY与APP_SECRET签名
B站直播API使用了类似OAuth的签名机制,特别是针对官方客户端(如LiveHime)的API。签名流程如下:
基础参数准备:构建包含时间戳、平台、版本等信息的基础参数
function basePayload() {
return {
access_key: "",
build: "9240", // LiveHime客户端版本build号
platform: "pc_link", // 平台标识
ts: Math.floor(Date.now() / 1000).toString(), // 当前时间戳
version: "7.16.0.9240" // LiveHime客户端版本
};
}
参数合并与排序:将业务参数与基础参数合并,按键名字母顺序排序
function orderPayload(obj) {
return Object.keys(obj)
.sort()
.reduce((result, key) => {
result[key] = obj[key];
return result;
}, {});
}
生成签名字符串:将排序后的参数转换为URL查询字符串,并附加密钥
// 参数URL编码
function encodeParams(params) {
return Object.keys(params)
.map((key) => `${key}=${encodeURIComponent(params[key])}`)
.join("&");
}
// 签名生成
const queryString = encodeParams(orderedParams);
const signStr = queryString + APP_SECRET; // APP_SECRET是应用密钥
4. **计算MD5哈希**:对签名字符串进行MD5哈希计算,得到最终签名
```javascript
const sign = md5(signStr);
orderedParams.sign = sign; // 将签名添加到参数中
完整实现:
function livehimeSign(payload) {
const signed = { ...basePayload() };
signed.appkey = "aae92bc66f3edfab"; // LiveHime的APP_KEY
Object.assign(signed, payload);
const orderedParams = orderPayload(signed);
const queryString = encodeParams(orderedParams);
const signStr = queryString + "af125a0d5279fd576c1b4418a3e8276d"; // APP_SECRET
const sign = md5(signStr);
orderedParams.sign = sign;
return orderedParams;
}
2. CSRF令牌保护
大多数修改操作(POST请求)除了需要API签名外,还需要提供csrf_token
参数进行双重验证:
// 从Cookie获取CSRF令牌
function getCsrfToken() {
const match = document.cookie.match(/bili_jct=([^;]+)/);
return match ? match[1] : "";
}
// 使用示例(开始直播)
const payload = {
room_id: roomId,
area_v2: areaId,
type: 2
};
// 添加csrf令牌
if (csrf) {
payload.csrf = csrf;
payload.csrf_token = csrf; // 某些API需要两种形式的csrf参数
}
// 生成带签名的参数
const params = livehimeSign(payload);
// 发送请求
const response = await utils.post(
"https://api.live.bilibili.com/room/v1/Room/startLive",
params
);
3. Cookie认证
大部分API请求依赖Cookie中的登录凭证:
SESSDATA
:会话标识
bili_jct
:CSRF令牌
DedeUserID
:用户ID
这些凭证通过浏览器自动附加到请求中,脚本通过GM_xmlhttpRequest
保持这些Cookie。
4. 请求头验证
B站API会验证请求的User-Agent
、Referer
和Origin
头,确保请求来自合法来源:
GM_xmlhttpRequest({
method: "POST",
url: url,
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
data: formData,
onload: function(response) { /* 处理响应 */ }
});
5. 访问频率限制
B站API有请求频率限制,过于频繁的请求可能导致临时IP封禁。脚本中实现了延迟和错误重试机制:
// 轮询检查二维码扫描状态,1秒一次
const checkInterval = setInterval(async () => {
const result = await auth.checkQRCodeStatus(qrData.qrcodeKey);
// 处理结果...
}, 1000);
// 设置超时,防止无限轮询
setTimeout(() => {
clearInterval(checkInterval);
}, 60000);
API参数详解
1. 检查用户登录状态
2. 获取登录二维码URL
3. 开始直播
- 接口:
https://api.live.bilibili.com/room/v1/Room/startLive
- 请求方式: POST
- 参数:
area_v2
: 直播子分区ID
platform
: 平台,默认为"pc"
csrf_token
: CSRF令牌
- 返回示例:
json
{
"code": 0,
"msg": "success",
"message": "success",
"data": {
"change": 1,
"status": "success",
"rtmp": {
"addr": "rtmp://live-push.bilivideo.com/live-bvc/",
"code": "?streamname=xxx&key=xxx"
}
}
}
4. 更新直播信息
工具函数说明
脚本提供了多个工具函数模块,用于处理不同的功能需求:
- auth: 处理用户认证相关功能
- liveControls: 处理直播控制相关功能
- ui: 处理用户界面相关功能
- utils: 提供通用工具函数,如请求、日志等
面板使用
主控面板功能区
- 直播状态区:显示当前直播状态(直播中/未开播)
- 直播标题:修改直播间标题
- 直播分区:选择主分区和子分区
- 分区搜索:支持拼音、首字母和ID搜索分区
- 操作按钮区:
- 开始直播:选择分区并开始直播
- 结束直播:结束当前直播
- 复制推流:复制RTMP地址到剪贴板
- 更新信息:更新直播标题和分区
操作流程
- 点击右上角蓝色按钮打开控制面板
- 如未登录,会提示扫描二维码登录
- 填写直播标题并选择分区
- 点击"开始直播"按钮
- 获取推流地址后,可点击复制按钮复制到推流软件
注意事项
- 使用前需要登录B站账号
- 需要有直播权限的账号才能操作
- 因B站API变动,部分功能可能会失效
- 请合理使用脚本,避免频繁请求导致账号异常
更新日志
- 添加了面板拖动功能,支持通过标题栏拖动
- 优化了登录状态检查,添加可视化提示
- 改进了面板初始位置,使其靠近悬浮按钮
- 修复了事件冒泡问题,优化交互体验
- 添加了边界检测,防止面板被拖出屏幕
本文档详细说明了B站直播控制面板助手脚本使用的API接口,如有API变动,请以最新代码为准。