示例
原理(需要登录)
使用b站API,获取真实播放链接, 以及用户验证信息, 然后替换iframe
可改进
用户自己上传验证信息, 或者融入到油猴脚本里, 那么外链视频都可以随便看了
使用方法
替换下面获取真实视频地址
里的 $headers
其中SESSDATA 和 bill_jct 都可以在 F12控制台-> 应用 -> Cookies里找到
接着找到你主题的 the_content(), 替换一下即可
源码
// 基于iframe src 获取 aid 或者 bvid
function get_aid_or_bvid($src)
{
$pattern = '/(bvid|aid)=([^&]+)/';
preg_match_all($pattern, $src, $matches);
$ids = array('aid' => null, 'bvid' => null);
if (!empty($matches[1]) && !empty($matches[2])) {
foreach ($matches[1] as $key => $value) {
if ($value === 'bvid') {
$ids['bvid'] = $matches[2][$key];
} elseif ($value === 'aid') {
$ids['aid'] = $matches[2][$key];
}
}
}
return $ids;
}
// 遍历 所有iframe
function parse_iframes($content)
{
// 将HTML内容包装在一个元素中
$html = '' . $content . '';
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
// 禁用libxml错误
libxml_use_internal_errors(true);
// 创建一个DOMDocument对象来解析HTML内容
$dom = new DOMDocument();
$dom->encoding = 'UTF-8';
$dom->loadHTML($html);
libxml_clear_errors();
$iframes = $dom->getElementsByTagName('iframe');
foreach ($iframes as $iframe) {
$src = $iframe->getAttribute('src');
$ids = get_aid_or_bvid($src);
$aid = $ids['aid'];
$bvid = $ids['bvid'];
// 如果没有, 说明不是b站视频, 跳过
if ($aid || $bvid) {
$cid = get_cid($aid, $bvid);
$realUrl = get_real_url($bvid, $cid);
if ($realUrl !== false) {
$iframe->setAttribute('src', $realUrl);
}
}
}
return $dom->saveHTML();
}
// 获取cid
function get_cid($avid, $bvid)
{
$params = [
'avid' => $avid,
'bvid' => $bvid,
];
$url = 'https://api.bilibili.com/x/web-interface/view?' . http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
return false;
} else {
$data = json_decode($response, true);
if (isset($data['data']['cid'])) {
return $data['data']['cid'];
} else {
return false;
}
}
curl_close($ch);
}
// 获取真实视频地址
function get_real_url($bvid, $cid)
{
$headers = [
'Cookie: SESSDATA=你的SESSDATA',
'bill_jct: 你的bill_jct'
];
$params = [
'bvid' => $bvid,
'cid' => $cid,
'qn' => '112',
'platform' => 'html5',
'high_quality' => '1'
];
$url = 'https://api.bilibili.com/x/player/playurl?' . http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
return false;
} else {
$data = json_decode($response, true);
if (isset($data['data']['durl'][0]['url'])) {
return $data['data']['durl'][0]['url'];
} else {
return false;
}
}
curl_close($ch);
}
$post_content = get_the_content();
$modified_content = parse_iframes($post_content);
echo $modified_content;
接着找到你主题的 the_content(), 替换一下即可 我想问下这个the_content()在那个文件夹里面的啊?
b2的话,在 TempParts/Single/content.php
现在不能用了?
源码要放在 content.php文件里面?替换the_content()么? 不太明白这个源码要放在哪里
上面不是回你了么, b2的话,在 TempParts/Single/content.php
路径位置我知道的了。就是你提供的源码是直接将:改为
我想问下你贴出来的那个源码是单独放一个文件然后引用过去content.php吗?然后the_content()直接替换为: 这样吗?