DYBarrageSender
基于websocket的斗鱼弹幕发送客户端,实现无浏览器发送弹幕
声明
此项目只用于教育研究用途,其他用途后果自负
使用方法
所需环境:python3.7 nodejs
1.下载并解压
2.pip3 install -r ../requirement.txt
3.npm install -g jsdom
4.修改cwd的值为自己nodejs全局安装目录的路径
11/29更新
添加了火力弹幕的一个demo和普通弹幕启动示例
普通弹幕
1.将需要的房间号、cookie放到main.py的第8,9行
2.python3 main.py
火力弹幕demo
由于douyu的检测机制没有搞懂,火力跳转每天最多80次,有了解检测机制的可以提issue
1.将跳转次数,cookie放到75-77行
2.python3 demo.py
项目描述
这个项目只是大概写了一个基于websocket的发送弹幕的模块,只实现了连接发弹幕服务器,发送弹幕,维持连接的功能,作为一个发送弹幕的基础接口,利用这个接口可以实现弹幕抽奖,火力弹幕,答谢礼物等等功能,由于可能会造成一些问题,一些功能的实现就不展示了(我也还没写)。当然本身还存在很多不足,例如自己对js不够熟悉,一些参数的加密原理搞不明白,而选择了execjs来调用加密js。有能力的老哥可以教一下我,大致计算如果不调用js参数的加密可能会快上一秒左右。还存在一些小bug,由于自己可以用了,就没有太在意研究。
感谢
由于是第一次研究python的websocket,参考了市面上很多的项目,也寻求了一些人的帮助。
感谢斗鱼胖头鱼的机器人,过程中给予了很多的帮助。
感谢油猴脚本斗鱼薅羊毛神器(日进万丸+概率红包),最初的灵感也来源于此。
感谢一些python的websocket库,写的过程参考了好几个websocket库,最终确定了websocket-client。
最后感谢github上无数的关于弹幕获取的项目,由于参考的确实很多,就不一一列出了。
造轮子历程
以下内容属于自己过程中的一些收获及对斗鱼websocket弹幕系统的一些分析,没有什么实质内容,大家不用看。
从开始行动到完成历时3天3夜,总计用在项目身上可能有近50小时。每天早上9点干到凌晨3点,期间枯燥乏味,一度想要放弃,当成功利用python脚本发出自己的弹幕时,感觉这几天没白干。
初心
利用python发送弹幕是我很早之前就想实现的功能,由于自己的笔记本过于陈旧,通过浏览器一些脚本来实现一些功能过于占用资源。前两天,在发现火力弹幕脚本之后,决定开始行动。
Day1
在确定斗鱼弹幕系统是基于websocket后,开始分析每个请求,大致流程是发送登录请求loginreq
、加入组h5ckreq
(这一步我也没搞懂实现之后的为了什么,只是在登录之后加上了)、发送心跳包keeplive
、发送弹幕chatmessage
。
由于和获取弹幕的服务器过程请求并不相同,在参考网上一些获取弹幕的例子发现并不一样,我抓包研究了web、pc、app的每个客户端上的弹幕请求,走了一些弯路,最后确定在web端上研究。获取弹幕可以用socket,而发送只能是websocket。
理清大致流程之后,我开始逐一分析每个请求的参数,通过f12一步一步的跟js,找到了一些参数的构造方式,大体说几个重要参数:
loginreq
中最重要的是vk
参数,具体构造方式在模块中已写明,这里就不说了
h5ckreq
这个请求没有认真研究他的作用,只是找到了他的构造方式 type@=h5ckreq/rid@=房间号/ti@=220120191119/
ti
参数来源于房间页面里一个script中的参数vdwdae325w_64we
晚上跟了很久关于发弹幕请求chatmessage
,干到3点也没搞定。。。
Day2
由于chatmessage
卡壳中,开始分析心跳包keeplive,大致请求如下
type@=keeplive/vbw@=0/cdn@=/tick@=时间戳/kd@=/
这是第一次的请求,后面的请求中会存在kd
的值。当然到目前也发现了其中的一个小bug,正常的心跳包流程是发送kd
值为空的请求——收到响应——获取响应中的kd
的值——对响应中kd
的值进行加密——45秒后再次发送请求包含加密后的kd
的值。
实际过程发现每次发送kd
为空,依旧算是心跳连接,这里是后面才发现,没有长时间测试,只是大致猜想。
kd加密的js函数来源于房间页面中的一个混淆后的函数,通过echo输出就可以看到,具体实现方法见脚本。
由于kd的加密所需函数不大,后面决定直接调用。
到目前除了发送弹幕未实现,其他请求的构造都已完成,期间需求斗鱼资深大佬胖头鱼的机器人,分析关于chatmessage
中dmvv
的构造,很多地方都已经明白,可惜最关键的加密一直没搞定。
到晚上睡觉前,只实现了一个基于websocket的长连接。。。
Day3
dmvv的构造函数是_sub_dms_(房间号,时间戳,登录响应中的dmva
),分析了很久的加密过程,几千行的代码看了一个遍,各种方式都试了,还是搞不明白,最后实在没办法决定python调用执行js,由于代码量过大,对js缩减了很多,成功利用execjs运行了js。到现在,所有构造方式都解决了,开始利用python实现。
python的websocket很多种,最开始选用的韦世东大佬的aiowebsocket,异步很方便,在第一版的脚本维持连接很稳定,因为需要加入发弹幕的函数,再利用这个就很难实现多线程的操作,可能是我对异步、多线程这块太新手,没有达到我的预想,开始选择其他的库。
过程之中参考了github上无数websocket例子,造了一晚上的轮子,写了无数个版本之后,在寻求胖头鱼的机器人老哥的帮助下,决定采用websocket-client,期间关于获取响应中的参数传递到请求包中,利用全局变量来解决,折腾了两个多小时。
睡觉前,大体功能已实现。
早上起来,发现自己的代码有问题,全局变量kd
没有传参,这里发现前面关于kd为空发送心跳的问题。有时间在琢磨琢磨。搞定之后,最后把代码模块化,方便其他功能调用。
最后,再次感谢一下胖头鱼的机器人老哥。