弹幕WebSocket解析逻辑
StreakingMan opened this issue · 1 comments
StreakingMan commented
API.WebSocket.md 里面
let body = textDecoder.decode(pako.inflate(data));
if (body) {
// 同一条 message 中可能存在多条信息,用正则筛出来
const group = body.split(/[\x00-\x1f]+/);
group.forEach(item => {
try {
result.body.push(JSON.parse(item));
}
catch(e) {
// 忽略非 JSON 字符串,通常情况下为分隔符
}
});
}
按照目前的弹幕数据,解析逻辑可以优化下
let body = '';
try {
// pako可能无法解压
body = textDecoder.decode(pako.inflate(data));
}
catch (e){
body = textDecoder.decode(data)
}
if (body) {
// 同一条 message 中可能存在多条信息,用正则筛出来
const group = body.split(/[\x00-\x1f]+/);
group.forEach(item => {
try {
const parsedItem = JSON.parse(item);
if (typeof parsedItem === 'object') {
result.body.push(parsedItem);
} else {
// 这里item可能会解析出number
// 此时可以尝试重新用pako解压data(携带转换参数)
// const newBody = textDecoder.decode(pako.inflate(data, {to: 'String'}))
// 重复上面的逻辑,筛选可能存在的多条信息
// 初步验证,这里可以解析到INTERACT_WORD、DANMU_MSG、ONLINE_RANK_COUNT
// SEND_GIFT、SUPER_CHAT_MESSAGE
}
}
catch(e) {
// 忽略非 JSON 字符串,通常情况下为分隔符
}
});
}
lovelyyoshino commented
已增加,非常感谢