最近在知乎上看到这个话题,感觉很有趣,自己实验了,果然可以,特此分享: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;
}

获取斗鱼直播间的弹幕信息相关推荐

  1. python 模拟浏览器selenium_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...

    本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...

  2. python采集直播间数据_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...

    本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...

  3. 利用Python爬虫爬取斗鱼直播间信息,以及直播的实际人数!

    首先我准备利用mysql来存储我爬取的信息,建一个host表如下: 然后下载pymysql ,利用它与数据库链接,因为在这里我只涉及到写入的操作: Unit_Mtsql 然后就是使用Beautiful ...

  4. 使用scrapy爬取斗鱼直播间信息

    目录 1. 谷歌抓包工具的使用 1.1 打开Chrome开发者工具的方法 1.2 开发者工具的结构 1.3 network模块 2. 使用谷歌抓包工具抓取斗鱼数据 3. 使用scrapy爬取斗鱼直播间 ...

  5. python 爬虫抓取斗鱼直播间弹幕

    这个嘛方法有很多,但市面上流行的方法也就两种 第一种就是通过斗鱼直播间的那个协议 第二种吗简单的我想骂人(前一种学些了贼多时间,简直了) 就是利用第三方库danmu 安装的方法依旧是如此的简单,打开终 ...

  6. 利用斗鱼api学习爬取斗鱼直播间信息

    python爬取斗鱼房间的弹幕 斗鱼弹幕服务api:https://open.douyu.com/source/api/63 基本步骤: 连接斗鱼api服务器 构造登录请求 进入房间并构造获取弹幕请求 ...

  7. 实时爬取斗鱼直播时的弹幕消息

    最近想爬取实时消息,上网查了下,所以爬取斗鱼直播的弹幕消息做了下练习,这个开源的代码有很多,但是具体是怎么爬取到的还是要仔细地研究下.想爬取斗鱼的弹幕消息,按照常用的做法是打开网页用抓包工具抓包,但是 ...

  8. 快手直播间实时弹幕发言API

    请求地址 HTTPGET https://www.youwk.cn/api/dm/kuaishou 请求参数 参数名 参数说明 key 用户请求密钥,可在 密钥管理页面 申请 id 快手直播间live ...

  9. Python+爬虫技术获取斗鱼直播图片(整理)

    核心内容: 1.爬虫的基本原理 2.利用Python爬取数据的方法(使用urllib爬取数据) 3.从斗鱼直播平台爬取图片 最近因为工作的原因,要利用爬虫的相关技术,获取html网页相关的数据,特意总 ...

  10. 【unity3D】直播间滚动式弹幕效果

    新时代总会有新产物,比如直播.直播的特色就在于实时互动.将原本的视频聊天一对一,变成主播和评论区聊天的一对多. 直播的特色也很明显,底部摄像机渲染实时画面:在左下角叠上一层弹幕滚动实时显示评论,右下角 ...

最新文章

  1. java多线程系列1:Sychronized关键字
  2. 采样次数不同平均值不一样_不同的真石漆装饰效果也是不一样的
  3. html打开网页过场动画_轻松教你学会网页设计
  4. java xml 解析 列表_用Java解析高级XML
  5. element的日期选择使用value-format之后表单验证报错
  6. notepad++反向查找/向上查找
  7. sqlserver大批量数据插入 BULK INSERT
  8. 在Vue项目中引入 ECharts 3D 路径图 Flights GL(需安装echarts、echarts-gl、jQuery依赖,已踩坑)
  9. 用计算机计算教学反思,《用计算器计算》的教学反思
  10. 芯片后端的APR指什么?
  11. android实现微信付款功能,Android实现微信支付功能详解
  12. 大专什么专业学c语言,大专专业计算机网络技术学不学编程
  13. 随手写了一段C++访问LDAP, 并且获取sid的代码
  14. 华为畅享二十Android是,华为畅享20 pro开箱小晒
  15. 羽毛球之混双战术要点
  16. WIN7截图工具灵活使用
  17. 区块链的核心价值就在去中心化
  18. 夜光:Java成神之路(九)擅长的语言
  19. java 画图 graphics
  20. 一段式、两段式和三段式状态机

热门文章

  1. 一元二次方程组的简单解法
  2. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年11月份最新版)
  3. 全网通工业无线路由器多网口工业路由器
  4. 找不到系统指定路径的解决思路
  5. 给ImageView做圆角处理
  6. 如何抓取图片php,PHP网络爬虫之图片抓取
  7. 《常用控制电路》学习笔记——数控直流恒流源电路
  8. idea禁用双击shift、double shift 快捷键
  9. 在线latex 网址
  10. 计算机硬件的五大部分由谁提出,存储程序原理是由谁于1946年提出的,它明确了计算机硬件组成的五大部分() - 问答库...