通过在JavaScript里面找到弹幕的原始消息,然后开启一个websocket链接向服务端发送数据,服务端即可获取到原始的弹幕消息。
一、找到弹幕消息的位置
我们都知道,某音的弹幕走的是websockets协议。既然是websockets协议,那么就必定有类似的代码段:
new WebSocket("ws://localhost:8080");
所以我们在开发者工具里面直接搜索new WebSocket。即可找到websockets开启的函数位置。
在这边打一个断点,网页就会停在这里。其中,r就是WebSocket 连接的地址。
二、根据WebSocket 的特性进行下一步的调试
当WebSocket建立之后,一般会走onMessage,所以我们就在当前js文件里面搜索onMessage。
值得注意的是:搜索onMessage之后有39的结果。但是我们只需要前5个即可。后面的都是没有价值的信息。给前5个都打上断点,刷新网页就会停在上图所示的位置。
具体的分析过程就忽略了,慢慢跟栈就能找到下图所示的位置:
控制台打印n的值,他的数据已经是明文的了。
三、自己重新写一个WebSocket
找到原始的数据之后,我们就可以插入以下代码:
for (let index = 0; index < r.msgs.length; index++) {
const payload = r.msgs[index];
const data = {};
switch (payload.method) {
case "WebcastChatMessage":
data.content = payload.payload.content;
data.user = payload.payload.user.desensitized_nickname;
data.user_id = payload.payload.user.display_id;
data.sec_uid = payload.payload.user.sec_uid;
data.user_follow = payload.payload.user.follow_info.following_count;
data.user_follower = payload.payload.user.follow_info.follower_count;
console.log(data);
break;
case "WebcastGiftMessage":
data.gift = payload.payload.common.describe;
data.user = payload.payload.user.desensitized_nickname;
data.user_id = payload.payload.user.display_id;
data.sec_uid = "https://www.douyin.com/user/" + payload.payload.user.sec_uid;
data.user_info = payload.payload.user.follow_info;
data.follow_count = data.user_info.following_count;
data.fans = data.user_info.follower_count;
console.log(data);
break;
default:
}
if (window.flag) {
window.ws1.send(JSON.stringify(data));
} else {
var ws = new WebSocket("ws://127.0.0.1:3000");
window.ws1 = ws;
window.flag = true;
ws.open = function (evt) {
};
ws.onmessage = function (evt) {
ws.send(JSON.stringify(data));
}
}
}
服务端代码(python)
async def handle_message(websocket, message):
room_data = json.loads(message)
if room_data:
if room_data.get("content"):
print(
f"用户详情: id:{room_data['user_id']},用户名称:{room_data['user']},粉丝数量:{room_data['user_follower']},关注数量:{room_data['user_follow']},发布内容:{room_data['content']}")
print(f"用户主页:https://www.douyin.com/user/{room_data['sec_uid']}")
if room_data.get("gift"):
print(
f"用户详情: id:{room_data['user_id']},用户名称:{room_data['user']},粉丝数量:{room_data['user_info']['follower_count']},关注数量:{room_data['user_info']['following_count']},发布内容:{room_data['gift']}")
print(f"{room_data['sec_uid']}")
四、总结
这种方式相比于其他的办法更简单粗暴一点,但是弊端太多,比如需要开启浏览器才行。要做成可执行文件exe就显得比较麻烦一些。后面我会写一篇专门讲使用python直接连接WebSocket链接的方法 直接获取弹幕信息。
与君相识,如沐春风细雨
如果你喜欢这篇文章 请多多点赞
🌏:For2018self 如果有不了解的地方欢迎咨询~