『B站API学习』不使用插件下载B站视频 您所在的位置:网站首页 build视频下载 『B站API学习』不使用插件下载B站视频

『B站API学习』不使用插件下载B站视频

2023-12-17 03:23| 来源: 网络整理| 查看: 265

声明:仅作技术交流,严禁用于盗视频

前言

前几天,发了个演示不用插件只用浏览器和aria2c下载器下载视频的视频。

发这个纯粹是装个B,之所以标题里写着不包会,是因为我自己知道这个方法是有bug的。关键是https://api.bilibili.com/x/player/playurl这个接口的可被条抓取件。

但是它是可以输入地址调用,大会员不是必须条件,不登录帐号也是可以。

在浏览器的地址栏直接输入:

不换行(专栏系统会莫名其妙加分号,所以图片)

也可以获取到视频的下载链接信息。

“?”后面是请求的各种参数,并以“&”分割,下面来解释下如何手动构造这个请求URL。

下载视频分几步?

在我看来这个过程有以下的步骤:(已知BV号或av的情况下)

通过BV号或者av号获取稿件的P数,以及每P视频的cid

通过BV号或者av号加上画质参数(qn)来组合playurl接口的参数,来获取视频的下载地址。

将下载地址导入下载器,添加referer请求标头,下载。

CID是个啥?咋获取?

av号和bv号我们都很熟悉,但它们是稿件的唯一编号。

一个视频稿件可能不会只有一个视频(多P),你只告诉服务器av号或bv号,服务器其实并不知道你要获取哪个视频。于是就需要另一种编号来指定视频,这就是cid。

cid不会在正常访问时查看到,于是也需要调用特定接口来获取。

https://api.bilibili.com/x/web-interface/view

这个接口使用很简单,只有一个参数:aid(av号)或bvid(BV号)二选一。

范例(bv号要包含BV)

其返回的json数据(使用开发者模式查看)

示例

从中你可以看到该稿件的很多信息:BV号av号(可以用作两者在线互转)、UP主、封面图……

pages中存有稿件每一个P的信息,cid就保存在这里,择其一。

构建playurl接口请求

好了现在就有了能够指定视频的两个最重要的参数了

这个时候你可以直接在接口地址后跟上两个参数。

这里av号对应avid,bv号对应bvid

返回数据:

durl-url里的链接就是视频下载链接了,这里由于其他参数缺省,获取到的是flv封装的720p视频地址,包含音视频。

如果要其他画质呢?那就是qn参数所确定的事了。

加上qn参数:

之前的没高画质,换个视频举例qn参数值对应表

返回同上,参数设定你会获取到1080p+画质的flv视频,如果视频没有对应画质选项,那么它会在大会员画质中选择对应数值小于112且最大的,比如一个60帧视频,qn=112,返回720p60。

当然这个请求会依赖于cookie,也就是它需要验证浏览器登录的帐号是否有大会员,没有则只会返回1080p画质。如果没有登录,则只有480p(也就是无账号游客可观看的最高画质)。

(所以说白嫖是不可能的啦……)

如果想要4K画质的视频,按上面的方法(qn取120)是无法获取的,这时候需添加参数fourk=1。

qn也要取120

这时候获取到的是4K分辨率的flv视频。

下载视频

通过以上的一通操作,我们现在已经有了视频的下载链接。

链接有时效

这时候,直接用浏览器访问该链接会报403。

这是因为缺少请求referer标头。referer内容是啥?从抓播放视频时浏览器的请求记录可知它就是播放页的地址。(av号也可以)

https://www.bilibili.com/video/BV17p4y1D7dA

多P稿件需指定P的标号:(BV1Yv411z7q3 的2P)

https://www.bilibili.com/video/BV1Yv411z7q3?p=2

下载工具我使用aria2c,这是一个命令行(本体无图形界面)的开源多协议多线程下载器。功能类似IDM,但还支持种子以及磁链的下载。使用它一是因为我还算比较熟悉使用,二是它可以在添加下载任务时手动加入标头。

aria2c下载:https://github.com/aria2/aria2/releases

aria2c命令 (aria2c已加入Windows环境变量,示例下载位置为“C:\User\ZHY”)

下载即可得到flv视频,包含音视频。

进阶篇

下载dash源以及H265视频

最开始从浏览器抓下来的接口调用的参数好像不止以上的bvid(或avid)、cid、qn、fourk,之前的视频中我是音视频分开下载再后期合并。

其实这些参数中有些是不必要手动输入(对于达成我们的目的来说)fnval算是一个有点用的参数,这里就取值16

返回的数据结构就与之前的相比差异比较大了。

这里获取的是当前网页端以及APP端所使用的dash源视频,特点是音视频是分开的,并且下载到的文件扩展名为m4s,如果你经常在安卓APP上缓存视频,并查看过下载的文件,扩展名是一样的,且音视频都是分开的。dash下的audio和video分别就是音视频,展开获得链接,下载方法与上面相同。

你应该也发现了视频video中每个id对应着画质,qn设定为120却获取到了所有的画质级别,并且每种画质都有两条。

这两条分别对应着传统H264的视频源,以及新式的H265的视频源

h265H264 AVC

HEVC的规格为8bit,这个格式目前在WEB端没有使用,APP在用。(不是所有视频都有)

Aria2c 简单使用方法

从GitHub可以直接下载编译好的windows版本。

解压后只有一个可执行程序 aria2c.exe 这个是本体了。

你可以选择添加到环境变量,shell cmd中可以快速调用,也可以直接拖到Powershell或cmd中,后面空格加上命令参数

Python 编程实现

有了上面思路步骤,基本上就可以依靠request模块的get()以及json模块来发起GET请求调用接口解析数据了,下载通过subprocess模块调用aria2c下载以及ffmpeg合并音视频。

在get()的使用上,添加了header(请求标头包含cookie以实现下载大会员视频)

执行效果:

源代码:https://github.com/Daniel2022/bilibili_own_tools (本人的帐号cookie已剔除)

延伸

dash源不是所有时候都返回所有画质的链接

何为DASH

H265格式触发的个人推测

API调用简单实战

参考资料

https://segmentfault.com/a/1190000017511459 【关于bilibili视频下载的一些小思路 原作者:shabby】

头图PID:69606244



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有