0. 前言
之前只知道B站是点播的,很多up主可以上传自己的视频,也没看过B站的直播,现在来抓一下它的直播源。我们依然从浏览器分析,授人以鱼不如授人以渔
,教大家如何去爬取直播源,就算失效了也不怕。
1. 直播源查找
打开其中一个直播间,F12
先查看地址是否是请求的页面带入的,搜索发现没有(m3u8/flv
),那么就是ajax来的了:
来检查下ajax
,发现第一个ajax
返回了地址:
经测试,只需要将 host
和 base_url
的前半部分拼接起来就行了,不需要后面的参数,用在线m3u8测试网站测试播放成功:
https://d1--cn-gotcha204.bilivideo.com/live-bvc/711838/live_222103174_4331333_1500/index.m3u8
2. 浏览器请求过程分析及思路
既然找到了请求,那么模拟就方便了,先来看下请求地址和参数:
Request Method: GET
(挺奇怪的,它这里是GET请求)
Request URL: https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo
Query String:
- room_id: 8178490
- no_playurl: 0
- mask: 1
- qn: 0
- platform: web
- protocol: 0,1
- format: 0,2
- codec: 0,1
一眼看过去除了room_id
其他的都是固定的就行了,这个太简单了。
先用Postman测试一下,完全OK:
3. 模拟实现
服务器源码(PHP):
<?php
header('Content-Type:application/json; 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');
$params = [
"room_id" => $_POST["room_id"],
"no_playurl" => 0,
"mask" => 0,
"qn" => 0,
"platform" => "web",
"protocol" => "0,1",
"format" => "0,2",
"codec" => "0,1",
];
$res = file_get_contents('https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?' . http_build_query($params));
echo $res;
exit;
前端H5:
$.ajax({
type: 'post',
url: 'http://xxx/player/bilibli/url.php',
data: {
room_id: 8178490,
},
success: function(res){
var data = res.data.playurl_info.playurl.stream[1].format[0].codec[1];
var url = data.url_info[0].host + data.base_url.split("?")[0];
console.log(url);
}
});
控制台就打印出了直播源地址:https://d1--cn-gotcha204.bilivideo.com/live-bvc/481520/live_222103174_4331333_1500/index.m3u8
4. 整合播放器
这个大家参照前几篇自行处理吧,可以使用ckplayer
、videojs
等,我测试的播放器加载很慢,还是直接使用VLC media player
最快
5. 总结
B站的直播源不是很难,参数也没有加密的,比其他网站简单,关键是找到直播源的位置,其他就好办了。