3shain / comen Goto Github PK
View Code? Open in Web Editor NEW📺直播用弹幕栏【原bilichat】
Home Page: https://comen.app
License: MIT License
📺直播用弹幕栏【原bilichat】
Home Page: https://comen.app
License: MIT License
document.hidden 并没有在obs内置浏览器被正确实现
但我真的没钱了
前一个做不到,但后一个还是可以的(指屏蔽指定uid
@simon300000 你的弹幕记录有UID吗,昨天MIO的B限有很多脚本哥,我要去杀一波
看服务器日志上时间较为规律似乎是被爬虫了
而且都是vtuber的房间
不会是被拿来爬弹幕记录了吧?我寻思这方法效率也挺低的啊
这已经属于严重滥用行为了,但似乎用了IP代理池我还没有有效的办法阻止
请问"自行修改"指的是需要修改代码实现解除吗?
如果是,那能否加入当指定wordFilter参数为空时移除默认关键词屏蔽的功能呢?
因为有的时候关键词会误伤,比如如下弹幕:
这个梗是老生常谈了(触发关键词“梗”)
别刷新,阿B炸了(触发关键词“别刷”)
感谢主播送出的问号风暴(触发关键词“风暴”)
这样会造成反馈不佳的误解,能否解除或者采用更好的机制呢?
在仍是bilichat的时候,bilichat的timestamp的display的样式通过 var(--yt-live-chat-item-timestamp-display,inline);
来控制是否显示timestamp,此时 yt-live-chat-item-timestamp-display
的默认值是 none
,如果不使用css覆盖的话将会默认不显示,而comen的timestamp样式同样通过 var(--yt-live-chat-item-timestamp-display,inline);
来控制是否显示timestamp,但yt-live-chat-item-timestamp-display样式缺失,导致display的默认样式变为 inline
,同时样式生成器 chat v2.0 style
改变是否显示时间戳的本质是增加和删除 display: inline !important;
样式来实现的,并非直接修改本身的样式,而是通过覆盖样式来实现的,并且在非勾选/反勾选状态仅仅是删除 display: inline !important;
,而不是修改为 display: none !important;
,这共同导致了这个错误
考虑加入缓存
comen在线版本,bilibili方面无法正常运作
对比老版本的自动转化链接发现缺少&bilichat=字段,补上后可正常运行
不知是特性还是尚未处理的bug
(老版本的自动转化链接如删去&bilichat=字段也会导致无法正常运作)
指主播本地输入转发,不再需要进直播间发送评论(不过vtb们好像不需要这个鸡肋功能(救救聋哑小主播们(((
前几天还能用,今天发现protover升级到3,原来的协议其实还能连接和heartbeat,但是出了一个新的ver 3的封包,用的是BrotliDecode。我本来想直接用Comen的包来做弹幕解析的,但是发现了这个问题,所以搬了一下b站的最新代码,并且使用brotliDecode算法可以正常解包。
附上我的部分代码:
const WebSocket = require("ws");
const _ = require("lodash");
const { BrotliDecode } = require("./brotli");
const { WS_CONSTANTS, WS_BINARY_HEADER_LIST } = require("./constants");
const { getRoomIdAndToken } = require("./server");
function toUint8Array(bufferObject) {
var arrayBuffer = new ArrayBuffer(bufferObject.length);
var typedArray = new Uint8Array(arrayBuffer);
for (var i = 0; i < bufferObject.length; ++i) {
typedArray[i] = bufferObject[i];
}
return typedArray;
}
function connectDanmu(roomId, token) {
const ws = new WebSocket("wss://tx-gz-live-comet-02.chat.bilibili.com/sub", {
origin: "https://live.bilibili.com",
});
ws.on("message", (payload) => {
console.log(payload);
const data = decodeData(payload);
console.log(data);
console.log(data.body);
});
ws.on("open", () => {
ws.send(
packageObject(7, {
uid: 0,
roomid: Number(roomId),
protover: 3,
platform: "web",
type: 2,
key: token,
})
);
// heartbeat packets
console.log("heartbeat");
ws.send(packageHeartbeat());
const heartbeat = setInterval(() => {
console.log("heartbeat");
ws.send(packageHeartbeat());
}, 30 * 1000);
});
ws.on("close", (code, reason) => {
console.log("close", code, reason);
});
ws.on("error", (err) => {
console.error(err);
});
}
function packageHeartbeat() {
const body = new TextEncoder().encode({});
return packageBinary(2, body);
}
function packageBinary(type, body) {
// console.log("packageBinary", type, body);
const tmp = new Uint8Array(16 + body.byteLength);
const headDataView = new DataView(tmp.buffer);
headDataView.setInt32(0, tmp.byteLength);
headDataView.setInt16(4, 16);
headDataView.setInt16(6, 1);
headDataView.setInt32(8, type); // verify
headDataView.setInt32(12, 1);
tmp.set(body, 16);
// console.log(tmp);
return tmp;
}
function packageObject(type, bufferObj) {
// console.log("packageObject", type, bufferObj);
return packageBinary(
type,
new TextEncoder().encode(JSON.stringify(bufferObj))
);
}
function decodeData(buffer) {
const arr = toUint8Array(buffer);
const dataView = new DataView(arr.buffer);
const result = {
body: [],
};
result.packetLen = dataView.getInt32(WS_CONSTANTS.WS_PACKAGE_OFFSET);
WS_BINARY_HEADER_LIST.forEach((header) => {
if (header.bytes === 4) {
result[header.key] = dataView.getInt32(header.offset);
}
if (header.bytes === 2) {
result[header.key] = dataView.getInt16(header.offset);
}
});
console.log(result);
if (
!result.op ||
(WS_CONSTANTS.WS_OP_MESSAGE !== result.op &&
result.op !== WS_CONSTANTS.WS_OP_CONNECT_SUCCESS)
) {
result.op &&
WS_CONSTANTS.WS_OP_HEARTBEAT_REPLY === result.op &&
(result.body = {
count: dataView.getInt32(WS_CONSTANTS.WS_PACKAGE_HEADER_TOTAL_LENGTH),
});
} else {
console.log("parsing non heartbeats");
for (
let cursor = WS_CONSTANTS.WS_PACKAGE_OFFSET,
end = result.packetLen,
start = "",
payload = "";
cursor < buffer.byteLength;
cursor += end
) {
(end = dataView.getInt32(cursor)),
(start = dataView.getInt16(cursor + WS_CONSTANTS.WS_HEADER_OFFSET));
try {
if (result.ver === WS_CONSTANTS.WS_BODY_PROTOCOL_VERSION_NORMAL) {
console.log(cursor, start, end);
var normalDecoded = new TextDecoder().decode(
buffer.slice(cursor + start, cursor + end)
);
payload =
0 !== normalDecoded.length ? JSON.parse(normalDecoded) : null;
} else if (
result.ver === WS_CONSTANTS.WS_BODY_PROTOCOL_VERSION_BROTLI
) {
var slice = buffer.slice(cursor + start, cursor + end),
brotliDecoded = BrotliDecode(toUint8Array(slice));
result.body = decodeData(Buffer.from(brotliDecoded)).body;
}
payload && result.body.push(payload);
} catch (err) {
console.error(
"decode body error:",
new Uint8Array(buffer),
result,
err
);
}
}
}
return result;
}
getRoomIdAndToken(process.env.ROOM_ID || "1367262").then(
({ roomId, token }) => {
console.log(roomId, token);
connectDanmu(roomId, token);
}
);
我JS苦手请不要介意。
在一般使用时有时候弹幕滚动速度太快无法准确获取观众的信息,因此我想将一些带有关键词的弹幕筛选出来,我明白需要添加一层条件判断,但是说实话我没有搞懂bilichat如何读取并输出弹幕信息的,请大神指点一下,谢谢
提供更细的参数控制,如礼物可见的下限金额
不再直接使用bilibili的icon,避免法律问题
Q1:Comen是否后续会增加自动翻译到日语/英语的功能(采用公开API进行翻译)。示例:隔壁项目:https://github.com/xfgryujk/blivechat
Q2:Comen未来会有气泡类型的样式制作器吗?或者说更多元化类型的样式制作器。
rt,Bilichat的dockfile好像不太好使?
不知道本项目是在哪个授权协议下开源出来的呢?
因为自家VTuber做B限直播时想要感谢礼物,单因为弹幕姬流动太快无法回看,网页端的礼物界面太过复杂不好教学。所以想问问能不能添加一个仅显示礼物信息的功能,像油管的驻留上位chat,或者简单的文字信息也行。
随着工具的推广,多语言功能也显得必要了。
现在已有完善的弹幕及礼物信息接收功能,请问能否实现TwiTch中的礼物及订阅展示,开放两个端口,其中一个为弹幕展示,另一个为礼物及订阅特效展示,订阅特效及礼物可使用GIF或HTML5模板来进行更换或定义。详细可以邮件交流:[email protected]
https://github.com/3Shain/BiliChat/blob/0249e971ad1740cf76231e339a508a10f846a305/bilichat.js#L47
https://github.com/3Shain/BiliChat/blob/0249e971ad1740cf76231e339a508a10f846a305/bilichat.js#L50
Fixed by adding fs.
before existsSync
and readFile
.
首先
GET https://api.bilibili.com/x/space/app/index?mid={USERID}
请求时注意去掉Referer
然后解析json在data->info->face
就能拿到头像url
似乎没发现什么限制
rt,无用的垃圾issue,即开即关
话说俺本地的弹幕工具也可以删了,商业化的弹幕工具1g大小太深井冰了8
发现如果往 api 服务器的 http 请求失败了流就断了,弹幕就不显示了
尝试修复了一下,不大清楚RxJS用法,就不直接PR了→_→
https://github.com/simon300000/BiliChat/tree/api-catchError
https://github.com/3Shain/BiliChat/compare/master...simon300000:api-catchError?expand=1
(Archived)
这里是bilichat讨论交流群的群号。如果有使用方面的问题可以进群提问,确定有issue或者enhancement的时候请使用issues或pr。
bilichat交流群:906600901
协议逆向
后端接口
前端ws消息处理
前端礼物信息处理
新的图标
评论有时会两条一起出来?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.