使用Vercel反代Leancloud国际版api以避免屏蔽

AI 摘要
该文讲述了作者使用Hexo主题Fluid,并使用了Leancloud实现的UV统计功能。然而,当通过大陆IP访问博客时,由于Leancloud的API拒绝连接,作者决定采取反代的方式解决这个问题。作者使用Vercel作为反代服务器,详细介绍了在Vercel上配置反代的步骤,并且还说明了如何替换Leancloud的地址以使其可全球访问。作者提醒使用此方法的用户需注意遵守Vercel的服务条款,并承担使用此方法可能违反条款的风险。
警告
本文最后更新于 2022-05-13,文中内容可能已过时。
叛变
已经叛变到twikoo的统计后端了,Leancloud这种号称对开发者友好的平台已经变味了

我用的Hexo主题为Fluid,它内置了用leancloud实现的UV统计功能。作为一位完全不想备案,想方设法逃避的博主,我当然不会选择leancloud国内版,国际版才是最优选!

然而,由于手机和电脑分流规则皆是“漏网之鱼”指向了代理,我也没有专门为我的网站设立规则,我一直没发现一个问题:通过大陆ip访问博客时,leancloud的api会拒绝连接!1

我分配到的leancloud api地址是ewtbugjp.api.lncldglobal.com,大陆直连时服务器会拒绝连接,其他地方访问才会出现404的返回。

不知道这是什么情况,我Google了好一会儿也没找到原因,没有任何人报告出现此问题。唉,无论是否是特例,我都得修好这个bug!

责任自负
此方法涉及到源代码修改,如果你用的是Serverless托管部署方案[^2],主题安装方式必须为releases包安装,而非npm install方式安装。 使用过程中请遵守Vercel TOS,违反TOS的一切后果由用户承担

既然直连不行,还有种方法叫“反代2”。通过一个不在大陆的服务器去反代这个api,是否就能躲开leancloud国际版对于大陆ip的屏蔽?

可是我的整套个人网站都是Serverless的,不存在后端去代理啊?🤔

事实上,serverless服务也可以作为反代服务器!有很多种办法达成目的。考虑到我现在主博客采用的Vercel部署,且延迟优秀、速度快,自然就想到了用Vercel来反代。

当然,Cloudflarr Worker也可以达到类似效果。教程可以在Google上面搜一下,估计一大堆。

首先,你得有一个Vercel的帐号。 这不是废话嘛

其次,你得有一个终端环境。推荐bash或zsh。

通过Debian系的sudo apt install npm或CentOS系的sudo yum install npm安装npm包管理器。

安装完成后,使用npm i -g vercel以安装Vercel CLI。

vercel login

这个过程中有很多种登录方式,这里就不细说了,看着英文指导来就可以。

新建一个文件夹当作部署的根目录,在文件夹下随便创建一个json文件。我的是ewtbugjp.api.lncldglobal.com.json

在json文件内写入

1
2
3
4
5
6
{
  "version": 2,
  "routes": [
      {"src": "/(.*)","dest": "https://ewtbugjp.api.lncldglobal.com/$1"}
  ]
}

上面的https://ewtbugjp.api.lncldglobal.com是我的api地址。可以在leancloud项目后台找到替换上去,或者通过appid获取:

https://app-router.leancloud.cn/2/route?appId=

将appid添加到上述地址后面访问,即可看到json格式的返回,其中最后一个api_server的值即为你的api服务器域名。

准备好反代文件后,就可以部署了。

vercel -A ewtbugjp.api.lncldglobal.com.json --prod

上面命令中的json文件名记得改为你记得的。

访问vercel,找到你刚刚部署的项目后,可以选择在设置中通过A记录或CNAME添加域名,也可以直接用vercel提供的域名。

记录下这个域名,我们开始替换leancloud.js内的地址。

以Fluid主题内的leancloud.js为例。

使用npm包安装、在vps或云服务器上运行的Hexo中,leancloud.js文件是node_modules/hexo-theme-fluid/source/js/leancloud.js

使用releases安装在themes文件夹,则leancloud.js是themes/fluid/source/js/leancloud.js

脚本内大约180多行处,有一处代码如下:

1
 var apiServer = serverUrl || `https://${appId.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;

将其改为:

1
  var apiServer = serverUrl || `https://leancloud.proxy.com`;

当然,此处的https://leancloud.proxy.com应该修改为你自己的反代网址。

推送部署后,你的api应该就能全球访问了。此行为不会影响“浏览人数”的数据。


  1. 官方没有任何关于此现象的信息,无法判断是否所有国际版api都有此问题。 ↩︎

  2. 即反向代理,与一般意义上代理不同,反向代理负责代理需要请求的资源再返回给客户端,于是被请求服务器只能得到反代服务器的IP及反代内容。 ↩︎