秋名山直播php源码,【斗鱼直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...
瀏覽器抓取真實(shí)直播源地址
0. 前言
1. 直播源查找
2. 瀏覽器請求過程分析及思路
3. 模擬實(shí)現(xiàn)
4. 整合播放器
5. 【附】真實(shí)源地址
6. 總結(jié)
網(wǎng)上搜索各種平臺的直播源地址都是滿天飛,但是經(jīng)常會有失效的時候,因?yàn)楣俜揭矔ㄆ诘纳壪到y(tǒng)修改各種參數(shù)或鏈接讓直播源不能永久,所以敝人一直崇尚的是授人以魚不如授人以漁,與其給直播源別人,不如教大家如何去爬取直播源,就算失效了也不怕。
0. 前言
繼虎牙直播后,網(wǎng)上說斗魚的直播源是最難抓的,哦?
在抓取之前,需要了解視頻直播源的分類和區(qū)別,可以自行了解hls,flv,m3u8等知識。
Tips: 本教程只是教大家如何利用前端調(diào)試技巧和爬蟲基本操作,不作為商業(yè)用途,各位童鞋耗子尾汁。
所用工具:
瀏覽器
Postman
WebStorm
VLC media player
所用技術(shù):
前端
PHP
1. 直播源查找
先打開斗魚的一個直播間,當(dāng)然先看電影頻道啦:
在頁面的請求中搜一下.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
多打開幾個直播間,可以發(fā)現(xiàn)有幾個參數(shù)是固定的:did、ver、rid是直播間id、v是"2501"加當(dāng)前日期、tt是當(dāng)前時間戳、sign是簽名、rate是清晰度(-1是默認(rèn)的)。
那么現(xiàn)在就只有sign是比較麻煩的,它和當(dāng)前時間戳是相關(guān)聯(lián)的,后面解析可以看到。
找到發(fā)ajax請求的位置,在請求參數(shù)data那一行打一個斷點(diǎn),然后再刷新頁面或者切換清晰度即可開始調(diào)試:
選擇window[(0, s.default)(256042, "9f4f419501570ad13334")]然后右鍵Evaluate selected text in console,在控制臺可以看到一個函數(shù)ub98484234,經(jīng)測試這個函數(shù)名是固定的,但是函數(shù)體里的內(nèi)容不是固定的,所以復(fù)制出函數(shù)沒有用。然后r,o,c分別是直播間ID、did、時間戳,后面"&ver=" + u.VERSION + "&rid=" + r + "&rate=" + e + (f ? "&aid=" + f : "")都是固定的。
斷點(diǎn)進(jìn)到這個函數(shù)里面去看,可以看到這個函數(shù)是在頁面請求回來的,而每個直播間的這個函數(shù)體都是不同的,里面還有個變量需要保存,而這個變量名也不是固定的,但是仔細(xì)一看,這個變量和這個函數(shù)的三個參數(shù)形參名是有關(guān)系的,仔細(xì)看下(是不是很像):
搜一下,這個變量就在這個函數(shù)的下面,是個數(shù)組:
思路就有了:
get請求直播間,獲取ub98484234函數(shù)和變量代碼
運(yùn)行這個函數(shù)獲取ratestream請求的參數(shù)
發(fā)送post請求獲取直播源地址
3. 模擬實(shí)現(xiàn)
服務(wù)器代碼(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);
}
});
}
});script>
php文件放到自己的服務(wù)器,然后前端就可以請求到直播源地址:
4. 整合播放器
這里使用的是ckpayer,官網(wǎng):https://www.ckplayer.com/
div>var videoObject = {
container: '.video', //“#”代表容器的ID,“.”或“”代表容器的class
variable: 'player', //播放函數(shù)名稱,該屬性必需設(shè)置,值等于下面的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獲取真實(shí)地址后,把url設(shè)置到ckplayer就好啦!
5. 【附】真實(shí)源地址
這里再提一句,真實(shí)無加密源地址的鏈接其實(shí)很短,如下:
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,結(jié)合起來就是:
http://tx2play1.douyucdn.cn/live/3637778raLSXdOdu.flv?uuid=
Tips: 直播間關(guān)播后需要重新獲取,關(guān)閉播放后也需要(否則會報錯時間校驗(yàn)出錯)。而真實(shí)地址是不需要,但是官方也可能修改。
6. 總結(jié)
找到直播源很簡單,關(guān)鍵是調(diào)試并實(shí)現(xiàn)它,不要怕麻煩,本人能力有限,斗魚直播源花了三個晚上吧,各位如有更好的方法請留言討論,多多指教。
總結(jié)
以上是生活随笔為你收集整理的秋名山直播php源码,【斗鱼直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Azkaban简介及安装教程
- 下一篇: 【机器学习】opencv-人脸识别