抖音直播间弹幕rpc学习

news2024/12/25 0:30:48

目标url

随便找个直播间即可。
https://live.douyin.com/198986091107

接口分析

首先并没有在xhr下找到对应的接口
在这里插入图片描述
因为采用了websocket来传输信息。切换到ws即可看到
在这里插入图片描述
消息下,可以看到16进制的数据在源源不断地增加。
在这里插入图片描述

那么我们只要找到反序列化后的数据,再发送到本地的socket服务,就可以直接拿到弹幕消息了。

定位的过程

首先点击发起程序,跟进最近调用的js文件。
在这里插入图片描述
格式化后搜索new websocket,因为使用js来创建socket服务必须要实例化websocket类。如下
在这里插入图片描述
接着大概将断点断在5549行处,可以发现,马上就触发断点了
在这里插入图片描述
我们来看一下这个代码,this.client就是websocket的一个实例,当接收到message就会触发blind这个函数。接着跟进。
在这里插入图片描述
这里r变量接收了反序列化后的数据,然后看看r的去向
在这里插入图片描述
可以看到后面会走emit这个方法,接着有个调试的技巧就是在经过的函数或者return的地方下个断点。
在这里插入图片描述
其实这里的r也能做为代码注入的地方,但是为了省力,需要继续跟一下。
在这里插入图片描述
继续调试
可以看到再反序列一次,已经拿到我们想要的弹幕消息了
在这里插入图片描述

js注入,rpc主动调用

可以使用chrome自带的overrides进行注入,如果浏览器崩溃,然后刷新依然失效的话,可以用fidder等工具来进行注入。

下面是注入代码和python启动websocket的代码

//代码注入
window.data  = i.toString();
!function(){
   var res = window.data ;
   if (window.flag){
          window.ws.send(JSON.stringify(res));
   }
   else{
          var ws = new WebSocket("ws://127.0.0.1:9999");
          window.ws  = ws;
          window.flag  =true;
          ws.open = function(evt){};
          ws.onmessage = function(evt){
              ws.send(JSON.stringify(res));
 }}
}();
# !/usr/bin/env python
# -*- coding: utf-8 -*-

# @author: yjp
# @software: PyCharm
# @file: main.py
# @time: 2022-08-08 16:49
import asyncio
# https://live.douyin.com/538509161829?cover_type=1&enter_from_merge=web_live&enter_method=web_card&game_name=%E7%BB%8F%E5%85%B8%E5%A4%A9%E9%BE%99%E5%85%AB%E9%83%A8&is_recommend=1&live_type=game&more_detail=all&request_id=20230101140342B8DB1AEE29D2135E5175&room_id=7183543025027648315&stream_type=horizontal&title_type=1&web_live_page=game_4627&web_live_tab=more

import websockets
import json

async def check_permit(websocket):
    send_text = '114514'
    await websocket.send(send_text)
    return True


async def recv_msg(websocket):
    while 1:
        recv_text = await websocket.recv()
        try:
            print(recv_text)
        except:
            with open('其他.txt','w',encoding='utf-8') as f:
                f.write(recv_text)


async def main_logic(websocket, path):
    await check_permit(websocket)
    await recv_msg(websocket)


start_server = websockets.serve(main_logic, '127.0.0.1', 9999)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

最终结果

在这里插入图片描述
在这里插入图片描述
这里由于gbk编码,print会出错,我把不能直接打印的文本存入了txt里
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在wsl下开发T113的主线linux(4)-编译kernel

接下来编译kernel,编译过程可能会出现缺少命令的报错,大概是下面这几个 sudo apt update sudo apt install flex bison bc libncurses-dev 目前linux主线的最新版本并没有适配t113的相关外设驱动,虽然能启动并串口打印,但其他的…

在单选按钮上实现双击效果

如果想让你的用户体验更加极致,可以考虑在对话框上的单选按钮上实现双击效果,以此作为”选中 确定”(或者是选中 下一页,或者是选中 完成等)的快捷方式。 看看我们需要怎么做 下面是一个对话框模板以及它对应的对…

3.服务注册和远程调用-Nacos[作为注册中心]

1.SpringCloud Alibaba-Nacos[作为注册中心] Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境 Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html 下载 nacos-server https://…

HCIA作业整理(2022.12.29)

一、特殊的ip地址: 1.环回地址:127.0.0.1-127.255.255.254 2.受限广播地址:255.255.255.255 3.直接广播地址:主机位全为1、192.168.1.X/24 --- 192.168.1.255 4.网段:主机位全0 --- 192.168.1.X/24 --- 192.168.1…

STL剖析(一):体系结构概览

一.什么是STL? STL全称是Standard Template Library,它属于泛型编程的范畴(泛型编程的代表性作品),泛型编程旨在编写独立于数据类型的代码,也就是说代码中的数据类型只有在编译的时候才会确定,否则为一个…

网络协议(一):基本概念、计算机之间的连接方式

网络协议系列文章 网络协议(一):基本概念、计算机之间的连接方式 目录一、网络互联模型二、计算机之间的通信基础1、计算机之间的连接方式 - 网线直连2、计算机之间的连接方式 - 同轴电缆(Coaxial)3、计算机之间的连接方式 - 集线器(Hub)4、计算机之间的连接方式 -…

vue3 antd项目实战——Form表单的重置与重置【resetFields重置表单未生效(手写重置函数)】

vue3 antd项目实战——resetFields重置表单无效【手写重置函数重置表单数据】关于form表单的文章合集场景复现原因分析解决方案(手写清空函数)关于form表单的文章合集 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.20…

Hadoop高手之路5-MapRreduce

文章目录Hadoop高手之路5-MapReduce分布式计算框架一、MapReduce概述1.MapReduce核心思想2.MapReduce编程模型3.MapReduce编程实例——词频统计二、MapReduce的工作原理1. MapReduc的工作过程1) 分片、格式化数据源2) 执行MapTask3) 执行Shuffle4) 执行ReduceTask5) 写入文件2.…

5_虚拟机栈

虚拟机栈概述 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指…

QML教程(一)

目录 一、导入 二、对象声明 三、对象属性 1.声明对象属性 2.信号属性 3.方法属性 4.附加属性略 5.枚举属性 6.对象属性赋值 四、自定义对象 一、导入 模块导入 语法&#xff1a; import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>…

【文献阅读】能源受限的无人机和移动充电站进行持续监控的稳健规划

标题&#xff1a;Robust Planning for Persistent Surveillance With Energy-Constrained UAVs and Mobile Charging Stations 作者&#xff1a;Xiaoshan Lin, Yasin Yazıcıo˘glu , and Derya Aksaray 来源&#xff1a;IEEE ROBOTICS AND AUTOMATION LETTERS 摘要 本文考虑…

DO 语句

DATA MYCLASS;SET SASHELP.CLASS;IF WEIGHT<120 THEN NOTE Normal;ELSE DO;NOTE Heavy;/* 赋值成缺失值 */WEIGHT.;END; RUN;PROC PRINT; RUN; DATA B;DO k 11 TO 0 BY -3;IF k < 5 THEN i k;ELSE i k - 1;OUTPUT;END; RUN;PROC PRINT; RUN; DO WHILE:只要条件满足&am…

Python异常处理(七)

python学习之旅(七) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.什么是异常 程序运行的过程中出现了错误 定义&#xff1a;在程序运行中,检测到一个错误&#xff0c;程序中止运行并且出现了一些错误的提示,也称作BUG 例如&#xff1a;读取一个不存在的文件f…

[操作系统]进程

目录1.进程的概念2.如何管理进程3.进程的调度4.并行和并发5.进程调度需要使用的属性6.进程之间的通信7.进程和线程的区别操作系统是一个软件,对下要管理好各种硬件设备,对上要给各种软件提供稳定的运行环境.这篇博客主要讲解操作系统如何管理进程。 1.进程的概念 进程就是跑起…

Golang - 时间处理总结

Golang - 时间处理总结1 获取时间对象1.1 获取当前对象对象1.2 根据指定时间返回 time.Time 类型1.2 获取当前年月日时分秒、星期几、一年中的第几天等操作1.3 日期字符串解析成 time.Time 类型解析的时候需要特别注意时区的问题&#xff1a;2 时间对象转时间字符串3 时区4 时间…

严格模式和高阶函数

1、什么是严格模式 JavaScript 除了提供正常模式外&#xff0c;还提供了严格模式&#xff08;strict mode&#xff09;。 ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式&#xff0c;即在严格的条件下运行 JS 代码。 严格模式在 IE10 以上版本的浏览器中才会被支…

【C++】-- C++11 - 右值引用和移动语义(上万字详细配图配代码从执行一步步讲解)

目录 左值引用和右值引用 右值引用使用场景和意义 移动语义 传值返回问题 移动构造 移动赋值 总结 解决传值插入问题 完美转发 模板中的&&万能引用 完美转发std::forward 完美转发实际中的使用场景 左值引用和右值引用 其实在C11之前&#xff0c;C没有左右…

系统管理员喜欢 systemd 的 5 个理由

导读systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。 系统管理员知道&#xff0c;在一台运行着的现代计算机上会发生很多事情&#xff1a;应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前&#xff0c;不同的进程可…

为什么深度神经网络这么难训练

目录 1、深度网络训练困难的原因&#xff1a; 2、消失的梯度问题 3、不稳定的梯度问题 参考文章&#xff1a;为什么很难训练深度神经网络&#xff1f; - 腾讯云开发者社区-腾讯云 1、深度网络训练困难的原因&#xff1a; 训练速度慢 在深度网络中&#xff0c;不同的层学习…