Python | BilibiliParseAPI

之前分析了芒果TV的M3U8连接获取过程,并成功地搭载腾讯云函数实现了一个视频解析接口,最近有朋友让我帮忙下载B站的视频,我就在考虑是否把B站的视频解析接口也实现一下,因此有了今天这篇文章。

· 哔哩哔哩

根据大佬的分享,不必再费劲的去寻找接口信息了,前浪栽树,后浪乘凉。

https://github.com/nilaoda/BilibiliParser

http://api.bilibili.com/x/player/playurl

根据接口信息,并且通过多次测试,只需要cid、bvid和视频清晰度代码即可获取到下载链接。

那么问题来了,这三个参数怎么获取呢?

首先是bvid,其实就是BVxxxxx这个代码,大部分的视频都是直接在网址部分显示的,但有部分B站自制剧集是以/bangumi/play/epxxxxx或/bangumi/play/ssxxxxx的形式存在。

虽然并未在网址中显示bvid,但其实视频本身也是有bvid的,这时候就需要寻找bvid。我的解决方案也是很暴力,直接访问该网址,所返回的结果即为网页数据,包括待寻找的bvid,通过正则匹配,简单粗暴的获取bvid。

(我承认这种办法很傻,但他真的很好用)

在掌握了bvid参数之后,就该寻找cid参数了,老办法,F12+过滤关键字。

搜索cid,没得到什么有效文件,那就在搜索api试试,在茫茫文件之中,发现了如下接口https://api.bilibili.com/x/player/pagelist?bvid=xxxxx,返回的json文档中正好有cid参数。

而清晰度参数就是各清晰度代码,对B站熟悉一点的人应该都知道的。

至此,全部参数都已经集齐,组合一下,直接访问即可得到目标清晰度的下载链接。

但既然要制作一个接口,那么就应该有全清晰度下载链接以及视频名视频长度等信息,

我承认,我真是很菜,找了半天还是找不到有效的视频名接口,最后还是和寻找bvid的方法一样,暴力解决。

而视频时长的信息存在getSource接口返回的json文档中,

dict[‘data’][‘durl’][0][‘length’]。

至于获取全清晰度下载链接,还是先要知道视频支持哪些清晰度,这个信息同样是在getSource的接口中。所以我的解决方法同样暴力,先访问getSource接口,获取视频全清晰度,然后再通过循环控制,根据各清晰度的下载链接。

本以为到此就已经大功告成,但在后期的测试过程中,B站还有一种类型的视频网址格式,BVxxxxx?P=x,接口还应当根据p值正确识别是第几个视频。

通过接口测试,之前的pagelist接口可以返回各视频cid,通过p值获取正确的cid,匹配bvid,即可获取目标视频下载链接。

之后上云的过程就很easy了,详情参见上一篇文章就好。不过遇到了一个小问题,路径参数无法传入?之后的内容,我的解决方案是把?替换成-,当然也可以把参数通过其他方式传入,条条大路通罗马嘛。

这个接口在网页直接抓包的话,是无法找到的,所以还是要感谢nilaoda大佬

· 后记

用这种方法得到的视频链接是flv直链,在下载时千万记得

refer:https://www.bilibili.com

refer:https://www.bilibili.com

refer:https://www.bilibili.com

不然是会返回403Error的。

当然,和芒果TV的解析方法一样,以上所提及的方法,是需要伴随着哔哩哔哩大会员用户的Cookies完成的,想白嫖还是请见我的接口吧。

最后的最后,以上仅供交流学习,请勿用于非法用途,侵删。

  • 相关资料

GitHub开源代码

接口示意

腾讯云SCF

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注