节目源php代理_【斗鱼直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...
网上搜索各种平台的直播源地址都是满天飞,但是经常会有失效的时候,因为官方也会定期的升级系统修改各种参数或链接让直播源不能永久,所以敝人一直崇尚的是授人以鱼不如授人以渔,与其给直播源别人,不如教大家如何去爬取直播源,就算失效了也不怕。
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
多打开几个直播间,可以发现有几个参数是固定的:did、ver、rid是直播间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 : "")都是固定的。
断点进到这个函数里面去看,可以看到这个函数是在页面请求回来的,而每个直播间的这个函数体都是不同的,里面还有个变量需要保存,而这个变量名也不是固定的,但是仔细一看,这个变量和这个函数的三个参数形参名是有关系的,仔细看下(是不是很像):
搜一下,这个变量就在这个函数的下面,是个数组:
思路就有了:
get请求直播间,获取ub98484234函数和变量代码
运行这个函数获取ratestream请求的参数
发送post请求获取直播源地址
3. 模拟实现
服务器代码(PHP版):
room.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
// 加以下代码是为了防止跨域不能访问
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
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);
}
});
}
});
php文件放到自己的服务器,然后前端就可以请求到直播源地址:
4. 整合播放器
var videoObject = {
container: '.video', //“#”代表容器的ID,“.”或“”代表容器的class
variable: '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);//初始化播放器
秋名山车神来了!
至于整合就很简单,在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. 总结
找到直播源很简单,关键是调试并实现它,不要怕麻烦,本人能力有限,斗鱼直播源花了三个晚上吧,各位如有更好的方法请留言讨论,多多指教。
本文同步分享在 博客“zy1281539626”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
节目源php代理_【斗鱼直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...相关推荐
- 【Bilibili直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)
浏览器分析B站直播的直播源地址 0. 前言 1. 直播源查找 2. 浏览器请求过程分析及思路 3. 模拟实现 4. 整合播放器 5. 总结 0. 前言 之前只知道B站是点播的,很多up主可以上传自己的 ...
- 【浏览器直播源抓取】浏览器抓取真实直播源地址(2022/11/16)
距离上次抓取直播源已经过去一年了,最近发现官方已更新了,以前的方法并不适用了,于是再来一波解析,小伙伴们准备好发车了吗? 一.版本回顾 之前直播源解析是从H5版本入手,直接从H5页面拿到全局变量liv ...
- python 模拟浏览器selenium_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...
本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...
- python采集直播间数据_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...
本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Poo ...
- 使用wireshark抓取bilibili直播的真实地址
使用wireshark抓取bilibili直播的真实地址 一. 概述 我之前测试过bilibili的直播(主播使用OBS-studio推送),延迟是相当低,大概就是3s-4s延迟,所以猜测网上说的直播 ...
- php好趣网抓取_PHP抓取卫视直播源
以下代码只用于个人娱乐,请勿用于商业用途,否则后果自负. 由于业余爱好,花了点时间用php+simple_html_dom 类库,简单实现了抓取好趣网的各卫视等直播源,simpleHtmlDOM类请至 ...
- 最新python爬虫抓取新浪微博千万级数据,scrapy思路+架构+源码
一.前期工作... 3 1.1 爬取目标... 3 1.2 准备工作... 3 1.3 爬取思路... 3 1.4 爬取分析... 3 二.项目实战... 5 2.1 新建项目... 5 2.2 创建 ...
- selenium抓取_使用Selenium的网络抓取电子商务网站
selenium抓取 In this article we will go through a web scraping process of an E-Commerce website. I hav ...
- BiliBili直播 弹幕信息抓取
写在前面 最近由于自己在B站直播的原因,对B站本身提供的实时弹幕不太满意,于是自己抓包写了一个bilibili的弹幕协议,但还有一部分没有完成.留下的坑以后再慢慢填吧. socket包获拦截工具:Wi ...
- python爬取小说出现乱码_详解Python解决抓取内容乱码问题(decode和encode解码)
一.乱码问题描述 经常在爬虫或者一些操作的时候,经常会出现中文乱码等问题,如下 原因是源网页编码和爬取下来后的编码格式不一致 二.利用encode与decode解决乱码问题 字符串在Python内部的 ...
最新文章
- HDU4857拓扑排序模版题
- How to remove the dotted border on Active link state---移除链接激活时出现的虚线
- Java实现有向图的拓扑排序
- RelationTrack解读
- IE6-IE11兼容性问题列表及解决办法
- php 写入套节字,php – 写入套接字并处理损坏的管道
- 关于ADO.NET的困惑
- u9系统的使用方法仓库_用友ERP系统,U9操作流程图
- Oracle LiveLabs实验:Introduction to Oracle Spatial
- 华为HCIP(HCNP) RS路由交换认证考试学习心得体会(含考试内容和所占比例、ensp模拟器、221、222、223练习题下载)
- Echar的学习记录
- 利用手机基站获取位置
- 看完此篇文章可以快速熟悉Spring事务
- tdr上升时间什么设定_TDR的完整形式是什么?
- Hadoop安装与环境配置
- 输入一个字符串求出其中逆序数对
- android stl 3d模型,3D文件转化为STL文件 - 魔猴网
- 谭浩强C++ 第九章
- 零基础如何快速学习Java?Java基础入门秘诀
- 右键收藏,2021 Google 开发者大会怎么看?
热门文章
- 计算机主机有gpib接口吗,PC104模块与通用并行接口(GPIB)通讯的实现
- dsp2812 pmsm foc之中断初始化
- 单片机数码管万年历c语言,基于51单片机和数码管的万年历程序
- c1200 写频软件_金飞讯写频软件-金飞讯a66写频软件(金飞讯a66对讲机写频软件)1.0 一键安装版-东坡下载...
- 用C#分析华表插件表格数据
- 直流电压前馈控制数字逆变电源设计与实现
- 通用24CXXX读写程序(GCC),兼容24C系列存储器(24C01到24C1024),支持跨器件跨页读写,支持连续
- Redis更新数据的时候如何不重置过期时间
- linux的防火墙端口配置
- 如何利用python下载电影_一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接...