blivedmjs
Version:
B站直播弹幕库的Node.js实现 (CommonJS版本)
196 lines (160 loc) • 6.98 kB
JavaScript
const { BLiveClient } = require('../src/clients/web_client.js');
const { OpenLiveClient } = require('../src/clients/open_live_client.js');
const BaseHandler = require('../src/handlers/base_handler.js');
const SESSDATA = '';
// 测试房间ID列表
const TEST_ROOM_IDS = [ 10722218
];
// 已登录账号的cookie中的SESSDATA字段值(可选)
// 开放平台配置(可选)
const ACCESS_KEY_ID = '';
const ACCESS_KEY_SECRET = '';
const APP_ID = 0;
const ROOM_OWNER_AUTH_CODE = '';
class MyHandler extends BaseHandler {
on_client_start(client) {
console.log(`[${client.roomId}] 客户端已启动`);
}
on_client_stop(client) {
console.log(`[${client.roomId}] 客户端已停止`);
}
_on_heartbeat(client, message) {
console.log(`[${client.roomId}] 心跳包,人气值: ${message.popularity}`);
}
_on_danmaku(client, message) {
console.log(`[${client.roomId}] ${message.uname}${message.medal.level > 0 ? `[${message.medal.name}${message.medal.level}]` : ''}: ${message.msg}`);
}
_on_gift(client, message) {
console.log(`[${client.roomId}] ${message.uname} 赠送 ${message.giftName}x${message.num} (${message.coinType === 'gold' ? '金瓜子' : '银瓜子'}x${message.totalCoin})`);
}
_on_buy_guard(client, message) {
const guardLevelName = ['', '总督', '提督', '舰长'][message.guardLevel];
console.log(`[${client.roomId}] ${message.username} 开通了 ${guardLevelName}`);
}
_on_super_chat(client, message) {
console.log(`[${client.roomId}] 醒目留言 ¥${message.price} ${message.uname}: ${message.message}`);
}
_on_super_chat_delete(client, message) {
console.log(`[${client.roomId}] 删除醒目留言`);
}
_on_like(client, message) {
console.log(`[${client.roomId}] 收到点赞`);
}
_on_interact_word(client, message) {
const medal_str = message.fans_medal.medal_level > 0 ? `[${message.fans_medal.medal_name}${message.fans_medal.medal_level}]` : '';
const user_str = `${message.uname}${medal_str}`;
switch (message.msgType) {
case 1:
console.log(`[${client.roomId}] ${user_str} 进入直播间`);
break;
case 2:
console.log(`[${client.roomId}] ${user_str} 关注了主播`);
break;
case 3:
console.log(`[${client.roomId}] ${user_str} 分享了直播间`);
break;
case 4:
console.log(`[${client.roomId}] ${user_str} 特别关注了主播`);
break;
case 5:
console.log(`[${client.roomId}] ${user_str} 与主播互粉了`);
break;
case 6:
console.log(`[${client.roomId}] ${user_str} 为主播点赞了`);
break;
default:
console.log(`[${client.roomId}] ${user_str} 未知互动类型: ${message.msgType}`);
break;
}
}
_on_open_live_danmaku(client, message) {
console.log(`[${message.roomId}] ${message.uname}:${message.msg}`);
}
_on_open_live_gift(client, message) {
const coinType = message.paid ? '金瓜子' : '银瓜子';
const totalCoin = message.price * message.giftNum;
console.log(`[${message.roomId}] ${message.uname} 赠送${message.giftName}x${message.giftNum} (${coinType}x${totalCoin})`);
}
_on_open_live_buy_guard(client, message) {
console.log(`[${message.roomId}] ${message.userInfo.uname} 购买 大航海等级=${message.guardLevel}`);
}
_on_open_live_super_chat(client, message) {
console.log(`[${message.roomId}] 醒目留言 ¥${message.rmb} ${message.uname}:${message.message}`);
}
_on_open_live_super_chat_delete(client, message) {
console.log(`[${message.roomId}] 删除醒目留言 message_ids=${message.messageIds}`);
}
_on_open_live_like(client, message) {
console.log(`[${message.roomId}] ${message.uname} 点赞`);
}
_on_open_live_enter_room(client, message) {
console.log(`[${message.roomId}] ${message.uname} 进入房间`);
}
_on_open_live_start_live(client, message) {
console.log(`[${message.roomId}] 开始直播`);
}
_on_open_live_end_live(client, message) {
console.log(`[${message.roomId}] 结束直播`);
}
}
async function runSingleClient() {
console.log('=== 测试单个直播间 ===');
const roomId = TEST_ROOM_IDS[0]; // 使用TEST_ROOM_IDS中的第一个房间
console.log(`正在连接房间: ${roomId}`);
const client = new BLiveClient(roomId, { sessData: SESSDATA }); // 添加SESSDATA参数
const handler = new MyHandler();
client.set_handler(handler);
await client.start();
console.log('客户端启动成功,等待接收消息...');
// 等待60秒后停止
await new Promise(resolve => setTimeout(resolve, 60000));
console.log('测试结束,正在停止客户端...');
await client.stop();
}
async function runMultiClients() {
// 创建多个客户端
const clients = TEST_ROOM_IDS.map(roomId => new BLiveClient(roomId, { sessData: SESSDATA }));
const handler = new MyHandler();
// 设置处理器并启动
for (const client of clients) {
client.set_handler(handler);
client.start();
}
try {
// 演示5秒后停止
await new Promise(resolve => setTimeout(resolve, 5000));
clients.forEach(client => client.stop());
} finally {
await new Promise(resolve => setTimeout(resolve, 1000)); // 等待连接完全关闭
}
}
async function runOpenLiveClient() {
if (!ACCESS_KEY_ID || !ACCESS_KEY_SECRET || !APP_ID || !ROOM_OWNER_AUTH_CODE) {
console.log('未配置开放平台参数,跳过测试');
return;
}
// 创建开放平台客户端
const client = new OpenLiveClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, APP_ID, ROOM_OWNER_AUTH_CODE);
// 设置处理器
const handler = new MyHandler();
client.set_handler(handler);
// 启动客户端
client.start();
try {
// 演示70秒后停止
await new Promise(resolve => setTimeout(resolve, 70000));
client.stop();
} finally {
await new Promise(resolve => setTimeout(resolve, 1000)); // 等待连接完全关闭
}
}
// 运行示例
async function main() {
console.log('=== 测试单个直播间 ===');
await runSingleClient();
console.log('\n=== 测试多个直播间 ===');
await runMultiClients();
console.log('\n=== 测试开放平台 ===');
await runOpenLiveClient();
}
main().catch(console.error);