[娱乐][代理][CF] 使用cloudflare worker反向代理codeforces,支持登录和提交代码评测

作为一个退役的ACM选 (蒟)手(蒻),偶尔也会回codeforces上做做题娱乐娱乐。。

但是codeforces作为一个外国网站,在国内访问的话速度十分感人,你懂的。

虽然绝大多数 业内人士 都有不可描述的方法让自己访问到国外的网站,但是还是有一些刚接触比赛的同学需要一个比较快的访问途径。当然国内之前也有一些dalao自制的codeforces镜像,例如 https://codeforc.es/ 等。

我这里提供一种免费自行搭建codeforces反向代理的方法,借用了cloudflare免费提供的serveless服务:workers。关于workers的简单介绍可以参见官方的blog:

Cloudflare Workers的名称来自Web Workers,更具体地说是Service Workers,一个用于在web浏览器后台运行并拦截HTTP请求的脚本的W3C标准API。Cloudflare Workers是针对相同的标准API编写的,但是是在Cloudflare的服务器上运行,而不是在浏览器中运行。
以下是您可以使用的工具:
– 使用最新的标准语言功能执行任意JavaScript代码。
– 拦截和修改HTTP请求和响应URL,状态,标头和正文内容。
– 直接从您的Worker响应请求,或将其转发到其他地方。
– 将HTTP请求发送到第三方服务器。
– 以串行或并行方式发送多个请求,并使用响应组成对原始请求的最终响应。
– 在响应已经返回到客户端之后发送异步请求(例如,用于记录或分析)。
– 控制其他Cloudflare功能,例如缓存行为。
– 显然我们要达到反向代理的目的只需要处理两件事:
– 处理客户端的请求,修改参数之后发送给真正的服务端(codeforces.com)
– 处理codeforces.com返回的响应,修改参数后发给客户端

反向代理的话相当于是我们的节点代替codeforces接受了客户端的请求,所以其实我们只需要做两件事:

  1. 接收客户端的请求,对其进行必要的修改之后发送给真正的服务端(codeforces.com)。这些修改主要是针对一些headers的设置,包括替换Host地址,允许任意源头资源共享(access-control-allow-origin: *)等,具体见代码。
  2. 接收服务端的响应,同样地我们需要对响应的内容做一些修改再发送给客户端的浏览器。这部分主要是把响应中所有的codeforces.com出现的部分改换成workers站点的url,否则我们的客户端就获取这些信息之后下一次就会直接访问codeforces源站了。这一步可以通过简单的文本查找和替换来实现,我们可以维护一个替换对字典,对响应的内容进行正则查找替换后把响应发送给客户端。

之前我部署过一个基于workers的js脚本,今天看了下原作者的repo半年来已经更新了很多内容,甚至名字都换了,也完善了很多东西。但我并没有用他的最新的版本,而是简单地修改了一下他原来的脚本直接拿来用了。原先的脚本里有个问题是只支持GET方法,POST的时候没有因为把数据附上就会出错。具体的代码放在了GitHub上:

https://github.com/itewqq/codeforces-reverse-proxy

需要注意的是codeforces使用了cfassets和stacf这两个cdn服务器的子域名,所以还要再开两个worker部署这两个服务,并且在主站的替换字典中加入两个cdn网址的替换映射。

const replace_dict = {
    '$upstream': '$custom_domain',
    'sta.cf.<YOUR-SUBDOMAIN>.workers.dev':'stacf.<YOUR-SUBDOMAIN>.workers.dev',
    'assets.cf.<YOUR-SUBDOMAIN>.workers.dev':'cfassets.<YOUR-SUBDOMAIN>.workers.dev'
}

具体的替换部分代码逻辑很简单,读者可自行阅读github上的源码。

以上就是这个简单的白嫖代理的应用了。

比较扯淡的是我后来发现在我的网络环境下,连接cloudflare的节点的速度甚至比直接访问codeforces还慢 ( ̄_ ̄|||) 所以这个东西就成为一个纯自娱自乐的操作了 ┑( ̄Д  ̄)┍ 害,自己开心就好

本文同步发布于本人知乎专栏 https://zhuanlan.zhihu.com/p/268653868

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据