哔哩哔哩视频直链解析下载分析
首先,我们以随便一个视频为例子
这里不推荐大家选择合集的,那种太长了不便于分析,但其实合集和单个视屏都是通用的
随便打开一个视频获取到他的分享链接
https://b23.tv/aPWsr9s
请求一下之后他返回给我们了一个这个东西
<a href="https://www.bilibili.com/video/BV1AAQqBBELn?buvid=XU133DB15CC85600C3575E8A4B63CE6B04998&from_spmid=search.search-result.0.0&is_story_h5=false&mid=lkXE4YTrA1OKrolsDrxcDH8FTQ%2FSZMtL1rElX6M3iMo%3D&p=1&plat_id=116&share_from=ugc&share_medium=android&share_plat=android&share_session_id=c3dc52e1-cf21-4e6a-a36e-b10a64be74d0&share_source=COPY&share_tag=s_i&spmid=united.player-video-detail.0.0&timestamp=1774539667&unique_k=aPWsr9s&up_id=45008871">Found</a>.通过观察重定向地址我们就获取了他的bvid为BV1AAQqBBELn
通过调用b站的web端apihttps://api.bilibili.com/x/web-interface/view?bvid=你获取到的bvid
我们Post一下这个他返回了以下JSON
{
"code": 0,
"message": "OK",
"ttl": 1,
"data": {
"bvid": "BV1AAQqBBELn",
"aid": 116282917855109,
"videos": 1,
"tid": 183,
"tid_v2": 2017,
"tname": "",
"tname_v2": "",
"copyright": 1,
"pic": "http://i1.hdslb.com/bfs/archive/2f65a5cb7e839ff6fc55171898a9a11d7ab2ecb0.jpg",
"title": "【太阳之子】的MV曲换成【夜的第七章】",
"pubdate": 1774338043,
"ctime": 1774338044,
"desc": "-",
"desc_v2": [
{
"raw_text": "-",
"type": 1,
"biz_id": 0
}
],
"state": 0,
"duration": 253,
"mission_id": 4063253,
"rights": {
"bp": 0,
"elec": 0,
"download": 1,
"movie": 0,
"pay": 0,
"hd5": 0,
"no_reprint": 1,
"autoplay": 1,
"ugc_pay": 0,
"is_cooperation": 0,
"ugc_pay_preview": 0,
"no_background": 0,
"clean_mode": 0,
"is_stein_gate": 0,
"is_360": 0,
"no_share": 0,
"arc_pay": 0,
"free_watch": 0
},
"owner": {
"mid": 45008871,
"name": "Diao爆Yang",
"face": "https://i0.hdslb.com/bfs/face/56fe2de5c9c4b8ecf7f48a7feaee07ed60658852.jpg"
},
"stat": {
"aid": 116282917855109,
"view": 66191,
"danmaku": 251,
"reply": 379,
"favorite": 627,
"coin": 582,
"share": 1663,
"now_rank": 0,
"his_rank": 0,
"like": 2111,
"dislike": 0,
"evaluation": "",
"vt": 0
},
"argue_info": {
"argue_msg": "",
"argue_type": 0,
"argue_link": ""
},
"dynamic": "",
"cid": 36935959931,
"dimension": {
"width": 3840,
"height": 2160,
"rotate": 0
},
"premiere": null,
"teenage_mode": 1,
"is_chargeable_season": false,
"is_story": false,
"is_upower_exclusive": false,
"is_upower_play": false,
"is_upower_preview": false,
"enable_vt": 0,
"vt_display": "",
"is_upower_exclusive_with_qa": false,
"no_cache": false,
"pages": [
{
"cid": 36935959931,
"page": 1,
"from": "vupload",
"part": "【太阳之子】的MV曲换成【夜的第七章】",
"duration": 253,
"vid": "",
"weblink": "",
"dimension": {
"width": 3840,
"height": 2160,
"rotate": 0
},
"first_frame": "http://i1.hdslb.com/bfs/storyff/_000005sz7v823rv9a2uyjsg1rb45akb_firsti.jpg",
"ctime": 1774338044
}
],
"subtitle": {
"allow_submit": false,
"list": []
},
"is_season_display": false,
"user_garb": {
"url_image_ani_cut": ""
},
"honor_reply": {},
"like_icon": "",
"need_jump_bv": false,
"disable_show_up_info": false,
"is_story_play": 1,
"is_view_self": false
}
}在这一步我们就可以拿到视频的cid,多P视频会有多个不同的cid
得到了cid为36935959931我们就可以尝试调用api了
GET https://api.bilibili.com/x/player/playurl
?bvid=BV1AAQqBBELn
&cid=36935959931
&qn=120 // 画质: 120=4K, 116=1080P60, 112=1080P+, 80=1080P, 64=720P
&fnval=4048 // 功能标志位,4048 = 请求 DASH + HDR + 4K + AV1 + 8K
&fourk=1 // 允许4K我们编辑完成了如上请求后继续Post看一下
我们得到了这一长串json
但查看他的结构无非也就是这些
其中ID的值不同也就代表了所提供的下载地址的api分辨率和码率不一样
具体可以参考下表
画质ID对照表
| id | 分辨率 | 说明 | 需要登录 |
|---|---|---|---|
| 127 | 3840×2160 | 8K | 大会员 |
| 120 | 3840×2160 | 4K | 大会员 |
| 116 | 1920×1080 | 1080P 60帧 | 大会员 |
| 112 | 1920×1080 | 1080P 高码率 | 大会员 |
| 80 | 1920×1080 | 1080P | 登录 |
| 64 | 1280×720 | 720P | 登录 |
| 32 | 852×480 | 480P | 免登录 |
| 16 | 640×360 | 360P | 免登录 |
音质ID对照表
| id | 说明 |
|---|---|
| 30251 | Hi-Res 无损 |
| 30250 | 杜比全景声 |
| 30280 | 192K 高音质 |
| 30232 | 132K 中音质 |
| 30216 | 64K 低音质 |
但我们拿到下载地址由于b站CDN自身的鉴权是无法直接下载的
需要添加以下header
按照此格式进行请求
curl -o audio.m4s \
-H "Referer: https://www.bilibili.com" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
-H "Origin: https://www.bilibili.com" \
"下载地址"就会发现我们可以进行正确下载了
参考项目:
https://github.com/nilaoda/BBDown
https://github.com/kengwang/BiliDuang
哔哩哔哩视频直链解析下载分析
https://blog.snowfox.cc/index.php/archives/11/