在网上找到了一份斗鱼弹幕服务器第三方接入协议v1.6.2,有了第三方接口,做起来就容易多了。

一、协议分析

斗鱼后台协议头设计如下:

这里的消息长度是我们发送的数据部分的长度和头部的长度之和,两个消息长度是一样。然后要注意的是该协议使用的是小端整数,所以我们要对数据进行处理后再发送,这里可以使用int.to_bytes()将整数转变成小端整数的形式。示例如下:

int.to_bytes(12,4,'little')   # b'\x0c\x00\x00\x00'

int.to_bytes(12,4,'big')     # b'\x00\x00\x00\x0c'

然后消息类型是689(689表示客户端发送给服务器,690表示服务器发送给客户端),加密字段和保留字段都是默认为0。这里由于消息类型是两个字节的,加密字段和保留字段都是一个字节,但是因为加密字段和保留字段都是0,所以这四个字节可以使用int.to_bytes(689,4,'little')来表示。最后该协议使用的是utf-8编码,所以我们需要对整个数据进行编码后再发送。

二、具体步骤

1、连接服务器

第三方客户端通过 TCP 协议连接到弹幕服务器(依据指定的 IP 和端口),其中IP 地址为openbarrage.douyutv.com,端口为8601,相关代码如下:

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostbyname("openbarrage.douyutv.com")

port = 8601

client.connect((host, port))

2、发送登录请求

客户端向弹幕服务器发送登录请求,登录弹幕服务器,格式如下:

type@=loginreq/roomid@=房间号/

3、发送加组请求

客户端收到登录成功消息后发送进入弹幕分组请求给弹幕服务器,格式如下:

type@=joingroup/rid@=房间号/gid@=-9999/

gid表示分组号,第三方平台建议选择-9999即海量弹幕模式。

4、接收广播消息

接收服务器发送的广播消息,包括用户发的弹幕和送的礼物信息,然后解析得到具体的内容。但这些数据里只有礼物的id而没有具体的礼物名称,然后我通过抓包找到了两个链接,里面包含了礼物id和名称的对应关系,相关代码如下:

1 gift_dict ={}2 headers ={3 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/68.0.3440.75 Safari/537.36"

4 }5 url1 = "https://webconf.douyucdn.cn/resource/common/gift/flash/gift_effect.json"

6 res1 = requests.get(url1, headers=headers)7 js1 = json.loads(res1.text.lstrip('DYConfigCallback(').rstrip(');'))8 gift_data1 = js1['data']['flashConfig'] 9 for i ingift_data1.keys():10 gift_dict[gift_data1[i]['id']] = gift_data1[i]['name']11

12 url2 = "https://webconf.douyucdn.cn/resource/common/prop_gift_list/prop_gift_config.json"

13 res2 = requests.get(url2, headers=headers)14 js2 = json.loads(res2.text.lstrip('DYConfigCallback(').rstrip(');'))15 gift_data2 = js2['data']16 for i ingift_data2.keys():17 gift_dict[int(i)] = gift_data2[i]['name']

5、发送心跳消息

客户端每隔45秒给服务器发送一次心跳消息,用于维护和服务器后台间的联系,格式如下:

keep_msg = "type@=keeplive/tick@=十位时间戳" # 旧版心跳消息

keep_msg = "mrkl/" # 新版心跳消息

6、核心代码

在发送数据的时候,有可能会出现一次无法发送完的情况,所以就需要多发送几次,确保把数据都发送出去:

1 msg = msg + '\0' #数据以'\0'结尾

2 msg = msg.encode('utf-8') #使用utf-8编码

3 length = len(msg) + 8 #消息长度

4 code = 689 #消息类型

5 #消息头部:消息长度+消息长度+消息类型+加密字段(默认为0)+保留字段(默认为0)

6 head = int.to_bytes(length, 4, 'little') + int.to_bytes(length, 4, 'little') + int.to_bytes(code, 4, 'little')7 #发送头部部分

8 client.send(head)9 #发送数据部分

10 sent =011 while sent

13 sent = sent + n

三、运行结果

运行截图:

进入数据库查看结果:

db.getCollection('DouYu-6039226').find({"data_type":"gift"})

结果如下:

还可以看看大家都发了什么弹幕:

db.getCollection('DouYu-6039226').find({"data_type":"chat"},{"user_name":1,"chat_txt":1,"_id":0})

结果如下:

完整代码已上传到GitHub!

python爬取斗鱼弹幕_【Python3爬虫】斗鱼弹幕爬虫相关推荐

  1. python爬取京东书籍_一个scrapy框架的爬虫(爬取京东图书)

    我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...

  2. python爬取路况信息_北京市交通管理局实时路况爬虫 | 学步园

    最近无人车项目需要用到交通管理局的实时路况信息,导师要求将实时路况信息爬下来. 我的想法是,因为路况信息是实时更新的,有最新的路况他们会更新,因此需要让程序隔一段时间运行一次,检查这次爬下的内容与上一 ...

  3. python爬取高德地图_爬虫实战:如何爬取高德地图?

    提起高德地图,咱们每一个人都不会陌生,高德地图是一款非常好用的地区服务软件,很多用户在出行的时候都会使用这款软件,日程用来导航,也可以用来打车,一次呼叫多种车型,用户可以在这里获得更好的服务,随时都可 ...

  4. python爬取地图地址_网络爬虫-python爬取高德地图地点

    python爬取你想要的数据,近期由于业务需求,用python爬取了高德地图一些地点的数据,爬出来数据大致情况如下: image 下面是基本流程: 2.安装网络爬取第三方库,主要是下面三个(pip i ...

  5. python爬取论坛图片_[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  6. python爬取携程网旅游_爬虫之携程网旅游信息爬取

    最近手又有点闲,闲着无聊就爬取了携程的信息,这个爬虫是我随手写的,各位可以看看. # -*- encoding=utf-8 -*- #爬取携程旅游信息 #2017/8/14 from bs4 impo ...

  7. python爬取bilibili数据_如何使用Python爬取bilibili视频(详细教程)

    Python爬取bilibili视频 摘要 为了解决PC端的bilibili无法下载视频的问题,使用python语言可以实现一个能够爬取bilibili某个视频资源(不包括会员视频)的程序.采用整个视 ...

  8. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  9. Python爬取哔哩哔哩实时直播弹幕

    用Python爬取哔哩哔哩直播弹幕,关键在于找到哔哩哔哩网站的一个POST网址,和应该POST的数据.代码不长,十分简单.关键在于浏览器开发者工具的使用.希望对于新入门的萌新有一定的借鉴意义. 1.找 ...

  10. python爬取百度搜索_使用Python + requests爬取百度搜索页面

    想学一下怎样用python爬取百度搜索页面,因为是第一次接触爬虫,遇到一些问题,把解决过程与大家分享一下 1.使用requests爬取网页 首先爬取百度主页www.baidu.com import r ...

最新文章

  1. 【iOS7开发笔记】tableview之通过代码自定义cell(cell的高度不一致)
  2. 学习如何用自己的 appender 来扩展 log4j 框架
  3. 操作多个表_3_查询两个表共同的行
  4. xmx java_为什么我的Java进程比Xmx消耗更多的内存?
  5. 在Payara Server和GlassFish中配置密码
  6. ] 求鉴定:《终于知道ramdisk 4g是如何使用4G以上内存了,慎用!》
  7. CodeMirror动态加载和表单提交
  8. SQL 增删改查(具体)
  9. 计算机软考网络工程师,软考之网络工程师总结
  10. android无效安装包,无效的apk文件是怎么回事_无效的apk文件问题解析
  11. 英雄联盟服务器维修中启动游戏失败,电脑登录英雄联盟失败的八种解决方法
  12. 友善之臂mini2440使用日志1
  13. java用线程做小球碰撞_多线程之碰撞小球
  14. ubuntu 安装java运行环境,Ubuntu 安装java环境搭建
  15. 能哄老婆睡觉的小故事
  16. 【算法】最直接的算法——穷举法详解
  17. QT+OSG/osgEarth编译之三十八:Snappy+Qt编译(一套代码、一套框架,跨平台编译,版本:Snappy-1.1.9)
  18. Operators in MXNet-Dropout
  19. 什么是GPRS,CMWAP,CMNET-移动网络介绍
  20. webStorm 3.0配置使用主题背景色等

热门文章

  1. java可视化编程软件有哪些_几款Java开发者必备常用的工具,准点下班不在话下...
  2. 恢复win7开机动画
  3. linux系统怎么改输入法,linux系统输入法怎么切换
  4. 申万一级行业日指数_2017年申万一级行业分类表
  5. linux运维零基础学习,没有基础怎么学习Linux运维?Linux学习
  6. Jmeter安装TPS插件
  7. DSP28335串口打印 printf
  8. C#建立手机号段全库
  9. 01-SQL基本语句
  10. 【MCM-2017】2017年数学建模美赛题目原文及翻译-A (个人思路)