效果预览

首先来看看引入后的效果吧!

和一般地使用iframe引入360p的视频不同,通过这种方法引入的b站视频是1080p的,而且获取外链的方式也很简单,以下,教程开始。

使用方法

刚写这篇文章的时候还没发现,使用API获得的视频外链是有时间限制的,大约一天过后就会过期。所以直接使用获得的链接是要不得的。最终的方案是修改播放器源码,使用js向API发送同步请求的方式来获得视频的动态链接。具体思路请参照最终方案。

最终方案

这里以我使用的播放器ckplayer为例,给出修改播放器js代码的过程。(ckplayer的使用见下文)。

image-20220512141942884

如上图,步骤概括为:

  1. 在ckpalyer文件夹下面,找到js/ckplayer.js

  2. 找到loadlanguage函数。

  3. 添加如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    console.log(vars["video"]);
    var xmlhttp = new XMLHttpRequest();
    var temp_url = "https://tenapi.cn/bilivideo/?url=https://www.bilibili.com/video/" + vars["video"];
    var type = "GET"; //方法
    xmlhttp.open(type, temp_url, false); //方法,接口,同步
    xmlhttp.send(); //发送请求

    var result = JSON.parse(xmlhttp.response); //获取到的json数据
    vars['video'] = result["url"];
    console.log(vars['video']);

    (麻了,不会写js。python代码早就已经可以了,结果翻译成js代码搞了半天……还好最后成功了。

最终只需要按照下面这种方式向文章中引入视频就行了:

1
2
3
4
5
6
7
8
9
<div class="video" style="height: 442px;"></div>
<script type="text/javascript">
var videoObject = {
container: '.video',
plug:'flv.js',
video: 'BV18Y411V7tC',
};
var player = new ckplayer(videoObject);
</script>

现在video内填写的是视频的bvid,而不是外链了。因为我们通过上面的代码使用bvid动态地解析到了视频外链。

另外,现在用到的API是一个免费良心的API:(下面方法一的API有账号次数限制)

下面的方法大家就看看就行了,也许会给你提供更多的思路。

方法一:使用API

最近在网上闲逛的时候发现了这个API:

使用这API,只需要传入base64加密的视频URL作为url这个查询变量的值,即可解析出视频外链来,返回的json数据格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"code": 1,
"msg": "数据返回成功!",
"data": {
"title": "小超梦:你觉得哥的火龙诺手会因为你满血就放过你吗?",
"desc": "小超梦直播间:https://www.huya.com/257085\n求三连",
"cover": "http://i1.hdslb.com/bfs/archive/c6e8def2035a8c52969e94afd3acbb289933afb7.jpg",
"list": [
{
"title": "201",
"duration": 333,
"durationFormat": "00:05:33",
"width": 1920,
"height": 1080,
"accept": [
"高清 1080P"
],
"url": "https://upos-sz-mirrorkodo.bilivideo.com/upgcxcode/46/41/439354146/439354146-1-208.mp4?e=ig8euxZM2rNcNbhjnWdVhwdlhzTHhwdVhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1636644051&gen=playurlv2&os=kodobv&oi=837344524&trid=05332e5cdbe9487f8e2ba071110dbc07T&platform=html5&upsig=de7a47b59909e092b1d56e80b7f3017b&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&bvc=vod&nettype=0&bw=369013&orderid=0,1&logo=80000000"
}
]
}
}

所以,最后只需要将json格式的数据转化为字典info_dict后,输出info_dict["data"]["list"][0]["url"]即可获得视频外链。当然,如果想要获得其他信息,按照字典的格式输出即可。

按照这个思路,编写的python脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
import base64
import requests
import json

i = "https://www.bilibili.com/video/BV1nr4y1H7DB?spm_id_from=333.851.b_7265636f6d6d656e64.1"
i_en = base64.b64encode(i.encode("utf-8"))
_url = str(i_en,"utf-8")

info_json=requests.get("https://www.mxnzp.com/api/bilibili/video?url=%s&app_id=bpljvqghigmnioem&app_secret=RjVQUE12SGJXc1grVlplaHQyRW1Gdz09"%(_url))
info_dict=json.loads(info_json.content.decode())
print("视频外链:")
print(info_dict["data"]["list"][0]["url"])

运行结果如下,输出的就是视频外链,可以直接嵌入到<video></video>标签中。

image-20220511200129163

这样确实方便,写个for循环还可以批量处理,但是缺点是短时间请求次数过多会失效,输出无效的链接:

image-20220511200313014

对比可以看出,有效的链接三级域名为upos-sz-mirrorhw,而无效的链接三级域名为cn-hljheb-dx-v-04。所以要注意一次性不要请求太多了。

方法二:使用别人的

已经有大佬使用这个api搭建好了在线解析的网站,而且比方法一的API稳定(付费玩家)。所以可以到那里解析好,复制视频的链接即可。

image-20220511200807622

使用上面两种方法获取的视频外链都是一样的。且只能解析UP主的视频,番剧是不能解析的。

播放器

你问我用的是什么播放器?不妨在视频不妨界面右键一下,就会看到:ckplayer。

ckplayer的仓库在gitee上,链接如下:

要将ckplayer应用到hexo(butterfly主题)也很简单:

  1. 下载仓库文件。
  2. 将文件夹下面的ckplayer文件夹放到butterfly主题页面下的source里面
  3. 在md里面通过下面的方式引入即可:
1
2
3
4
5
6
7
8
9
10
<link type="text/css" rel="stylesheet" href="/ckplayer/css/ckplayer.css" />
<script type="text/javascript" src="/ckplayer/js/ckplayer.js" charset="UTF-8"></script>
<div class="video" style="height: 442px;"></div>
<script type="text/javascript">
var videoObject = {
container: '.video',
video: '视频外链',
};
var player = new ckplayer(videoObject);
</script>

由于不是每篇文章都需要嵌入视频,所以就不全局引入css和js,而是最好在需要引入的文章内引入。


reference

[1] 毒评论.月影养蜥 https://www.bilibili.com/video/BV18Y411V7tC

[2] Bilibili视频解析下载 https://www.mxnzp.com/doc/detail?id=30

[3] 萤火虫哔哩哔哩解析 https://bilibili.syyhc.com/

[4] ckplayer https://gitee.com/niandeng/ckplayer