引言

之前写过一篇用港澳台vps搭建反代服务器实现哔哩哔哩港澳台番剧解析,但并非所有人都有港澳台vps,加上我最近把香港vps换成美国vps,就研究了一下其他解析方法,然后在github上发现了阿里云函数免费解析。github原教程地址

有兴趣用自己的港澳台vps搭建解析服务器的可以点击这里

因为自己是第一次经营博客,在图片使用方法把持不了度,用多了文章打开速度慢,所以这篇文章尽量以少图和外链形式呈现。

过程

1.打开阿里云函数后台并注册登录

如果是新注册的阿里云账号请进行实名认证

进入了函数计算控制台后点击左上角阿里云logo旁的倒三角将地区换成香港

网站示例
就像这样⬆️

2.打开【服务及函数】新建一个函数

3.选HTTP函数,下一步

4.函数名称随便填,运行环境选PHP7.2,其他的都可不管,选择【新建】

5.将index.php的内容换成下列代码 github原文件

<?php

use RingCentral\Psr7\Response;
/*
To enable the initializer feature (https://help.aliyun.com/document_detail/89029.html)
please implement the initializer function as below:
function initializer($context) {
    echo 'initializing' . PHP_EOL;
}
*/

function handler($request, $context): Response
{
    /*
    $body       = $request->getBody()->getContents();
    $queries    = $request->getQueryParams();
    $method     = $request->getMethod();
    $headers    = $request->getHeaders();
    $path       = $request->getAttribute('path');
    $requestURI = $request->getAttribute('requestURI');
    $clientIP   = $request->getAttribute('clientIP');
    */
    /* Config */

    $upstream_pc_url = 'https://api.bilibili.com/pgc/player/web/playurl';
    $upstream_app_url = 'https://api.bilibili.com/pgc/player/api/playurl';
    $timeout = 5; // seconds


    /* Read incoming request */
    $request_method = $request->getMethod();
    $request_query = stristr($request->getAttribute("requestURI"), '?');
    $req_referer = $request->getHeaderLine('referer');;
    $request_headers = $request->getHeaders();
    $request_body = $request->getBody()->getContents();



    /* Forward request */
    $ch = curl_init();

    //清理相关header
    array_splice($request_headers, array_search('HOST', $request_headers));
    array_splice($request_headers, array_search('User-Agent', $request_headers));
    array_splice($request_headers, array_search('Referer', $request_headers));


    $headers = array();
    foreach ($request_headers as $key => $value) {
        $headers[] = $key . ': ' . $value;
    }
    //判断使用pc还是app接口
    if (substr_count($request_query, 'platform=android') != 0) {
        $url = $upstream_app_url . $request_query;
        curl_setopt($ch, CURLOPT_USERAGENT, 'Bilibili Freedoooooom/MarkII');
    } else {
        $url = $upstream_pc_url . $request_query;
        curl_setopt($ch, CURLOPT_REFERER, $req_referer);
    }
    //curl配置
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request_method);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    $header = array();

    if ($response === false) {
        $header['Content-Type'] = 'text/plain';
        return new Response(
            502,
            $header,
            'Upstream host did not respond.'
        );
    } else {
        $header_length = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $curl_response_headers = explode("\n", substr($response, 0, $header_length));
        $response_body = substr($response, $header_length);

        foreach ($curl_response_headers as $header_string) {
            $header_tmp = explode(': ', $header_string, 2);
            if (count($header_tmp) == 2) {
                $header[$header_tmp[0]] = trim($header_tmp[1]);
            }
        }

        curl_close($ch);
        // 这行用于调试请求信息
        // return new Response(200, array(), json_encode(array('header' => $header, 'body' => $response_body, 'url' => $url, 'response'=>$response, 'curl_headers'=>$curl_response_headers)));
        return new Response(
            200,
            $header,
            $response_body
        );
    }
}

/*tool*/
//某个字符串在另一个字符串第N此出现的下标
function str_n_pos($str, $find, $n)
{
    $pos_val = 0;
    for ($i = 1; $i <= $n; $i++) {
        $pos = strpos($str, $find);
        $str = substr($str, $pos + 1);
        $pos_val = $pos + $pos_val + 1;
    }
    $count = $pos_val - 1;
    return $count;
}

6.复制【测试HTTP触发器】下面的连接

URL示例
红色涂掉的内容就是

7.添加到脚本/插件中

  • 电脑浏览器(Chrome等)

添加到油猴脚本【哔哩哔哩区域解锁】的自定义代理服务器中即可 记得添加https://段

  • 安卓端

添加至哔哩漫游(关于哔哩漫游是什么,点击这里)中即可 记得去掉url前段的https://

服务器设置示例
一定要去除https:// 否则解析不了

8.enjoy

写在最后

如果觉得URL太长可以用自定义域名换成自己的域名,不过记得添加https支持

不过不知道为啥,我的ssl证书添加上去就提示格式不对,所以我用的是nginx+http重定向(需要自备vps)

问题解答

阿里云函数完全免费吗?

并非完全免费,官方只提供每月几十万次的免费解析,不过足够一个人一个月的用量了

支持泰国吗?

1.阿里云函数本身没有泰国节点(本人写文章时没有) 需要泰国节点的话可以考虑其他云函数
2.文里的php文件访问的api仅限于大陆和港澳台地区,泰国区的api有些不同,可能不通用


给岁月以文明,给时光以生命!