获取斗鱼直播间的弹幕信息
最近在知乎上看到这个话题,感觉很有趣,自己实验了,果然可以,特此分享:https://www.zhihu.com/question/29027665
实验准备:Wireshark、Linux、Chrome
实验步骤:
1、打开Chrome,进入一个弹幕比较丰富的直播间,比如22519号房间,获取server_config
F12审查元素,然后 Ctrl+F 查找 server_config,如果找不到查找 server 即可:
2、解码 server_config
双击选中 server_config (上图中红框中的内容)复制,在线解码:http://www.convertstring.com/EncodeDecode/UrlDecode
3、打开Wireshark监视网卡,并刷新斗鱼房间
点此查看Wireshark npf没有启动的解决方法
点击Wireshark左上角的 Interface List ,选择当前联网的网卡:
4、监听指定端口,找到gid
tcp.port==8053||tcp.port==8075||tcp.port==8019||tcp.port==8069||tcp.port==8049||tcp.port==8056||tcp.port==8005||tcp.port==8026||tcp.port==8074||tcp.port==8054
这里的端口都是上面根据 server_config 解码得到的
我们看到数据包的最上面几条,三次握手之后的第三条接收的数据里面就有gid:
这里看到gid=10
5、下载源代码,编译运行
源码在github上:https://github.com/fishioon/douyu/blob/master/danmu.cc
我们下载后放在linux下用 g++ 编译:
g++ danmu.cc -o danmu
然后运行:
./danmu 25519 10
上面的25519是主播的房间号,10是上面获取的gid
运行结果:
6、源代码解释:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define BUFFER_SIZE 1024
#define DANMU_PORT 8601 //服务器弹幕发送端口
#define DANMU_IP "125.88.176.8" //弹幕服务器
#define USERNAME "username" //默认用户名
#define PASSWORD "passwd" //默认密码typedef struct { //数据包结构体int len;int code;int magic;char content[BUFFER_SIZE];
}MsgInfo;//连接服务器
int sock_conn(int port, const char* addr) {int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr;memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(port);servaddr.sin_addr.s_addr = inet_addr(addr);if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {fprintf(stderr, "connect socket failed, port:%d, addr:%s\n", port, addr);return -1;}return sockfd;
}int sock_close(int sockfd) {close(sockfd);return 0;
}//弹幕处理
int process_danmu(int msg_len, MsgInfo* msg) {if (msg_len <= 12 || msg->len <= 8) {printf("msg_len:%d\n", msg_len);return -1;}char* p = strstr(msg->content, "content@=");if (!p) return -1;char* content = p + sizeof("content@=")-1;p = strchr(content, '/');if (!p) return -1;*p++ = 0;char* snick = p + sizeof("snick@=")-1;p = strchr(snick, '/');if (!p) return -1;*p++ = 0;printf("%s:\t%s\n", snick, content);return 0;
}//收发弹幕数据包
int douyu_danmu(int sockfd, const char* username,const char* passwd, int room_id, int group_id) {MsgInfo msg;//登陆请求int ct_len = snprintf(msg.content, sizeof(msg.content),"type@=loginreq/username@%s=/password@=%s/roomid@=%d/ct@=2/",username, passwd, room_id);msg.len = ct_len + 1 + sizeof(msg.code) + sizeof(msg.magic);msg.code = msg.len;msg.magic = 0x2b1;//第一次握手send(sockfd, &msg, msg.len+sizeof(msg.len), 0);//第二次握手recv(sockfd, &msg, sizeof(msg), 0);//输出数据包内容printf("recv:%s\n", msg.content);ct_len = snprintf(msg.content, sizeof(msg.content),"type@=joingroup/rid@=%d/gid@=%d/", room_id, group_id);msg.len = ct_len + 1 + sizeof(msg.code) + sizeof(msg.magic);msg.code = msg.len;msg.magic = 0x2b1;//第三次握手send(sockfd, &msg, msg.len+sizeof(msg.len), 0);int ret = 0;while (true) {//接收弹幕ret = recv(sockfd, &msg, sizeof(msg), 0);//处理弹幕if (process_danmu(ret, &msg) == -1) {send(sockfd, &msg, 0, 0);}}return 0;
}int main(int argc, char** argv) {if (argc < 2) {printf("usage: danmu room_id group_id\n");return 0;}//可以不需要用户名和密码const char* username = ((argc == 4) ? argv[3] : USERNAME);const char* passwd = ((argc == 4) ? argv[4] : PASSWORD);//第一个参数是ridint room_id = atoi(argv[1]);//第二个参数是gidint group_id = atoi(argv[2]);//打开连接int sockfd = sock_conn(DANMU_PORT, DANMU_IP);//收发弹幕包douyu_danmu(sockfd, username, passwd, room_id, group_id);return 0;
}
获取斗鱼直播间的弹幕信息相关推荐
- python 模拟浏览器selenium_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...
本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...
- python采集直播间数据_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...
本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...
- 利用Python爬虫爬取斗鱼直播间信息,以及直播的实际人数!
首先我准备利用mysql来存储我爬取的信息,建一个host表如下: 然后下载pymysql ,利用它与数据库链接,因为在这里我只涉及到写入的操作: Unit_Mtsql 然后就是使用Beautiful ...
- 使用scrapy爬取斗鱼直播间信息
目录 1. 谷歌抓包工具的使用 1.1 打开Chrome开发者工具的方法 1.2 开发者工具的结构 1.3 network模块 2. 使用谷歌抓包工具抓取斗鱼数据 3. 使用scrapy爬取斗鱼直播间 ...
- python 爬虫抓取斗鱼直播间弹幕
这个嘛方法有很多,但市面上流行的方法也就两种 第一种就是通过斗鱼直播间的那个协议 第二种吗简单的我想骂人(前一种学些了贼多时间,简直了) 就是利用第三方库danmu 安装的方法依旧是如此的简单,打开终 ...
- 利用斗鱼api学习爬取斗鱼直播间信息
python爬取斗鱼房间的弹幕 斗鱼弹幕服务api:https://open.douyu.com/source/api/63 基本步骤: 连接斗鱼api服务器 构造登录请求 进入房间并构造获取弹幕请求 ...
- 实时爬取斗鱼直播时的弹幕消息
最近想爬取实时消息,上网查了下,所以爬取斗鱼直播的弹幕消息做了下练习,这个开源的代码有很多,但是具体是怎么爬取到的还是要仔细地研究下.想爬取斗鱼的弹幕消息,按照常用的做法是打开网页用抓包工具抓包,但是 ...
- 快手直播间实时弹幕发言API
请求地址 HTTPGET https://www.youwk.cn/api/dm/kuaishou 请求参数 参数名 参数说明 key 用户请求密钥,可在 密钥管理页面 申请 id 快手直播间live ...
- Python+爬虫技术获取斗鱼直播图片(整理)
核心内容: 1.爬虫的基本原理 2.利用Python爬取数据的方法(使用urllib爬取数据) 3.从斗鱼直播平台爬取图片 最近因为工作的原因,要利用爬虫的相关技术,获取html网页相关的数据,特意总 ...
- 【unity3D】直播间滚动式弹幕效果
新时代总会有新产物,比如直播.直播的特色就在于实时互动.将原本的视频聊天一对一,变成主播和评论区聊天的一对多. 直播的特色也很明显,底部摄像机渲染实时画面:在左下角叠上一层弹幕滚动实时显示评论,右下角 ...
最新文章
- java多线程系列1:Sychronized关键字
- 采样次数不同平均值不一样_不同的真石漆装饰效果也是不一样的
- html打开网页过场动画_轻松教你学会网页设计
- java xml 解析 列表_用Java解析高级XML
- element的日期选择使用value-format之后表单验证报错
- notepad++反向查找/向上查找
- sqlserver大批量数据插入 BULK INSERT
- 在Vue项目中引入 ECharts 3D 路径图 Flights GL(需安装echarts、echarts-gl、jQuery依赖,已踩坑)
- 用计算机计算教学反思,《用计算器计算》的教学反思
- 芯片后端的APR指什么?
- android实现微信付款功能,Android实现微信支付功能详解
- 大专什么专业学c语言,大专专业计算机网络技术学不学编程
- 随手写了一段C++访问LDAP, 并且获取sid的代码
- 华为畅享二十Android是,华为畅享20 pro开箱小晒
- 羽毛球之混双战术要点
- WIN7截图工具灵活使用
- 区块链的核心价值就在去中心化
- 夜光:Java成神之路(九)擅长的语言
- java 画图 graphics
- 一段式、两段式和三段式状态机