[wordpress]什么! B站外链直接可以看高清视频

示例

原理(需要登录)

使用b站API,获取真实播放链接, 以及用户验证信息, 然后替换iframe

可改进

用户自己上传验证信息, 或者融入到油猴脚本里, 那么外链视频都可以随便看了

使用方法

替换下面获取真实视频地址里的 $headers

其中SESSDATA 和 bill_jct 都可以在 F12控制台-> 应用 -> Cookies里找到

[wordpress]什么! B站外链直接可以看高清视频

接着找到你主题的 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;

给TA充电
共{{data.count}}人
人已充电
杂记

油猴脚本入门教程与相关准备

2023-1-22 22:16:20

杂记

[windows]如何找到我的鼠标

2023-6-19 10:36:59

7 条回复 A文章作者 M管理员
  1. jason龍

    接着找到你主题的 the_content(), 替换一下即可 我想问下这个the_content()在那个文件夹里面的啊?

    • 月离离

      b2的话,在 TempParts/Single/content.php

  2. jason龍

    现在不能用了?

  3. jason龍

    源码要放在 content.php文件里面?替换the_content()么? 不太明白这个源码要放在哪里

    • 月离离

      上面不是回你了么, b2的话,在 TempParts/Single/content.php

    • jason龍

      路径位置我知道的了。就是你提供的源码是直接将:改为

  4. jason龍

    我想问下你贴出来的那个源码是单独放一个文件然后引用过去content.php吗?然后the_content()直接替换为: 这样吗?

个人中心
今日签到
搜索