浏览器抓取真实直播源地址

  • 0. 前言
  • 1. 直播源查找
  • 2. 浏览器请求过程分析及思路
  • 3. 模拟实现
  • 4. 整合播放器
  • 5. 【附】真实源地址
  • 6. 总结

网上搜索各种平台的直播源地址都是满天飞,但是经常会有失效的时候,因为官方也会定期的升级系统修改各种参数或链接让直播源不能永久,所以敝人一直崇尚的是授人以鱼不如授人以渔,与其给直播源别人,不如教大家如何去爬取直播源,就算失效了也不怕。

0. 前言

继虎牙直播后,网上说斗鱼的直播源是最难抓的,哦?
在抓取之前,需要了解视频直播源的分类和区别,可以自行了解hls,flv,m3u8等知识。

Tips: 本教程只是教大家如何利用前端调试技巧和爬虫基本操作,不作为商业用途,各位童鞋耗子尾汁。

所用工具:

  • 浏览器
  • Postman
  • WebStorm
  • VLC media player

所用技术:

  • 前端
  • PHP

1. 直播源查找

先打开斗鱼的一个直播间,当然先看电影频道啦:

在页面的请求中搜一下.flv.m3u8 竟然找不到:

那么地址显然不是直接从后台带来的,那么就是ajax请求来的,从ajax请求中找到了一个请求:

很显然,这里有个地址,使用VLC播放一下,额。。。不好意思,刚好电影放完。但至少这个地址是可用的。

2. 浏览器请求过程分析及思路

Request URL: https://m.douyu.com/api/room/ratestream
Form Data:

  • v: 250120210110
  • did: 5533423942ce86e564901f2200001631
  • tt: 1610256007
  • sign: 00121038e82b65413972da17c6fdaa1d
  • ver: 22011191
  • rid: 3637778
  • rate: -1

多打开几个直播间,可以发现有几个参数是固定的:didverrid是直播间id、v是"2501"加当前日期、tt是当前时间戳、sign是签名、rate是清晰度(-1是默认的)。
那么现在就只有sign是比较麻烦的,它和当前时间戳是相关联的,后面解析可以看到。

找到发ajax请求的位置,在请求参数data那一行打一个断点,然后再刷新页面或者切换清晰度即可开始调试:

选择window[(0, s.default)(256042, "9f4f419501570ad13334")]然后右键Evaluate selected text in console,在控制台可以看到一个函数ub98484234,经测试这个函数名是固定的,但是函数体里的内容不是固定的,所以复制出函数没有用。然后r,o,c分别是直播间ID、did、时间戳,后面"&ver=" + u.VERSION + "&rid=" + r + "&rate=" + e + (f ? "&aid=" + f : "")都是固定的。

断点进到这个函数里面去看,可以看到这个函数是在页面请求回来的,而每个直播间的这个函数体都是不同的,里面还有个变量需要保存,而这个变量名也不是固定的,但是仔细一看,这个变量和这个函数的三个参数形参名是有关系的,仔细看下(是不是很像):

搜一下,这个变量就在这个函数的下面,是个数组:

思路就有了:

  1. get请求直播间,获取ub98484234函数和变量代码
  2. 运行这个函数获取ratestream请求的参数
  3. 发送post请求获取直播源地址

3. 模拟实现

服务器代码(PHP版):

room.php

<?php
// 加以下代码是为了防止跨域不能访问
header('Content-Type: text/html;charset=utf-8');
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin');$page = file_get_contents('https://m.douyu.com/'.$_GET['rid']);$patt1 = '/function ub98484234([\w\W]*?)function k927cea2d4369/';
preg_match_all($patt1, $page, $rs);echo str_replace("function k927cea2d4369","",$rs[0][0]);

url.php

<?php
// 加以下代码是为了防止跨域不能访问
header('Content-Type: text/html;charset=utf-8');
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin');$post = array("v" => $_POST['v'],"did" => 'b9f39b4e631b7973c103209800001631',"tt" => $_POST['tt'],"sign" => $_POST['sign'],"ver" => 22011191,"rid" => $_POST['rid'],"rate" => -1
);$data = curl_post('https://m.douyu.com/api/room/ratestream',$post);
echojson($data);function curl_post($url,$post_data){$ch = curl_init();$headers = array('Accept'    => '*/*','User-Agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/87.0.4280.88','Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Content-Type'    => 'application/x-www-form-urlencoded');curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_IPRESOLVE, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);$output = curl_exec($ch);curl_close($ch);return $output;
}function getParam($key, $default=''){return trim($key && is_string($key) ? (isset($_POST[$key]) ? $_POST[$key] : (isset($_GET[$key]) ? $_GET[$key] : $default)) : $default);
}function echojson($data){header('Content-type: application/json');$callback = getParam('callback');if($callback){die(htmlspecialchars($callback).'('.$data.')');} else {die($data);}
}

前端html

<script src="node_modules/crypto-js/crypto-js.js"></script>
<script src="node_modules/jquery/dist/jquery.js"></script>
<script>let rid = 3637778; // 房间号let did = "b9f39b4e631b7973c103209800001631";let tt = parseInt((new Date).getTime() / 1e3, 10);let rate = -1;$.ajax({type: 'get',url: 'https://xxx.com/player/douyu/room.php',data: {rid:rid},success: function(res){eval(res);let param = ub98484234(rid, did, tt) + "&ver=22011191&rid=" + rid + "&rate=" + rate ;$.ajax({type: 'post',url: 'https://xxx.com/player/douyu/url.php',data: param,success: function(res){console.log(res);}});}});
</script>

php文件放到自己的服务器,然后前端就可以请求到直播源地址:

4. 整合播放器

这里使用的是ckpayer,官网:https://www.ckplayer.com/

<script type="text/javascript" src="ckplayer/ckplayer/ckplayer.js" charset="utf-8" data-name="ckplayer"></script><div class="video" style="width: 600px;height: 400px;"></div><script type="text/javascript">//定义一个变量:videoObject,用来做为视频初始化配置var videoObject = {container: '.video', //“#”代表容器的ID,“.”或“”代表容器的classvariable: 'player', //播放函数名称,该属性必需设置,值等于下面的new ckplayer()的对象html5m3u8: true,video: 'http://hlstct.douyucdn2.cn/dyliveflv1a/3637778raLSXdOdu_2000.m3u8?txSecret=0a8093b41cbff59ba0a56bc4ac39ebce&txTime=5ffacfc5&token=h5-douyu-0-3637778-8fe14247bbe00e18529094c5dcf70532&did=b9f39b4e631b7973c103209800001631&origin=tct&vhost=play2',playbackRate: false};var player = new ckplayer(videoObject);//初始化播放器</script>

秋名山车神来了!

至于整合就很简单,在ajax获取真实地址后,把url设置到ckplayer就好啦!

5. 【附】真实源地址

这里再提一句,真实无加密源地址的链接其实很短,如下:
http://tx2play1.douyucdn.cn/live/空白替换.flv?uuid=
空白部分就是加密地址的一部分,如加密地址是:http://hlstct.douyucdn2.cn/dyliveflv1a/3637778raLSXdOdu_2000.m3u8?txSecret=bc08048624cbe33fe6492c981a21f415&txTime=5ffadd7c&token=h5-douyu-0-3637778-f9f6e2e79ab5b1ba10762fe2412c8c6b&did=b9f39b4e631b7973c103209800001631&origin=tct&vhost=play2,那么空白部分就是3637778raLSXdOdu,结合起来就是:

http://tx2play1.douyucdn.cn/live/3637778raLSXdOdu.flv?uuid=

Tips: 直播间关播后需要重新获取,关闭播放后也需要(否则会报错时间校验出错)。而真实地址是不需要,但是官方也可能修改。

6. 总结

找到直播源很简单,关键是调试并实现它,不要怕麻烦,本人能力有限,斗鱼直播源花了三个晚上吧,各位如有更好的方法请留言讨论,多多指教。

【斗鱼直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)相关推荐

  1. 【Bilibili直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)

    浏览器分析B站直播的直播源地址 0. 前言 1. 直播源查找 2. 浏览器请求过程分析及思路 3. 模拟实现 4. 整合播放器 5. 总结 0. 前言 之前只知道B站是点播的,很多up主可以上传自己的 ...

  2. 【浏览器直播源抓取】浏览器抓取真实直播源地址(2022/11/16)

    距离上次抓取直播源已经过去一年了,最近发现官方已更新了,以前的方法并不适用了,于是再来一波解析,小伙伴们准备好发车了吗? 一.版本回顾 之前直播源解析是从H5版本入手,直接从H5页面拿到全局变量liv ...

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

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

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

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

  5. 使用wireshark抓取bilibili直播的真实地址

    使用wireshark抓取bilibili直播的真实地址 一. 概述 我之前测试过bilibili的直播(主播使用OBS-studio推送),延迟是相当低,大概就是3s-4s延迟,所以猜测网上说的直播 ...

  6. python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  7. 网络爬虫pyppeteer、selenium模拟浏览器抓取数据

    项目场景: 1.抓取数据时,响应状态码为412,即状态码412含义为:Precondition Failed,服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个.这个状态码允许客户端 ...

  8. php好趣网抓取_PHP抓取卫视直播源

    以下代码只用于个人娱乐,请勿用于商业用途,否则后果自负. 由于业余爱好,花了点时间用php+simple_html_dom 类库,简单实现了抓取好趣网的各卫视等直播源,simpleHtmlDOM类请至 ...

  9. BiliBili直播 弹幕信息抓取

    写在前面 最近由于自己在B站直播的原因,对B站本身提供的实时弹幕不太满意,于是自己抓包写了一个bilibili的弹幕协议,但还有一部分没有完成.留下的坑以后再慢慢填吧. socket包获拦截工具:Wi ...

  10. B_zhan直播间弹幕抓取

    前两天研究了一下B_zhan的直播间,其实B_zhan的用户体量很少.我最近几个月一直在搞B站,几乎B_zhan能pa的都被我试过.其中还包括包括私信,大批量的私信.不过再三声明哈,我本人是为了学习, ...

最新文章

  1. 修改值类型的实例方法 mutating
  2. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow 3.1PlayGround
  3. Django rest framework 基础
  4. Spring AOP编程-传统基于aspectJ切点AOP开发
  5. linux cp 目录不存在自动创建,Linux运维知识之Linux:复制并创建目标目录,如果它不存在...
  6. c语言读入文件排序,帮忙-如何对文件排序啊
  7. LeetCode 1229. 安排会议日程(双指针)
  8. hadoop 生态圈
  9. sublime 插件(持续更新)
  10. 信息学奥赛系列教程:C++程序基本结构
  11. curl怎么输出赋值_伺服电动缸怎么控制?
  12. Linux 系统升级蝉道
  13. VTN泛读【Video Transformer Network】
  14. openwrt 19 overlay 空间不足_新桥胡同拆除19处违建!背街小巷“瘦身”后宽敞多了...
  15. Echarts经典颜色搭配
  16. DSP TMS320C6455 中断解析
  17. CC1310空中升级笔记04 WSN OAD Example
  18. 【Unity ASE学习笔记】
  19. 拉升股价套利为饵狂骗157万 广州邦臣机械气化炉警方:防理财诈骗
  20. 解决金仓数据库安装时安装VC++2013报错问题:不受信任提供程序信任的根证书中终止

热门文章

  1. SM74HC595D电路级联教程
  2. Linux学习(一)
  3. 使用canvas给页面添加文字水印
  4. 智能家居-斐讯N1安装篇
  5. 关于计算机的科学思维方法有哪些特点,数学一种科学思维方法有哪些
  6. 虹膜数据集_虹膜数据集的聚类分析
  7. 我对“渗透性测试”的理解
  8. Android下WPS打开Excel2007版也有问题
  9. dex字符串解密_Dex加密(上)
  10. 一分钟读懂dB、dBm、dBw的区别