通过Cloudflare Workers自定义代理规则

一、背景

最近在使用微软的 copilot 时,发现如果梯子设置为「规则」模式,每次都打不开?之后就会出现下面的页面。

不用想都知道是梯子中的「规则」设置导致的,但有的时候我们就是想使用「规则」模式,毕竟“流量”贵如油嘛,而且手动频繁切换模式还是非常麻烦。

图示为Cl**h的【规则】界面:

额,那这个规则如何修改呢?

二、代理规则

在修改这个代理规则之前需要搞清楚这个规则是哪来的?像我这个工具是从一个远道而来(懂的都懂😂)的订阅地址来的,这个地址的内容就像下面这样:

port: ****
socks-port: ****
allow-lan: false
mode: Rule
log-level: silent
# 省略
rules:
  - DOMAIN-SUFFIX,ghcr.io,Proxy
# 省略

其中,rules 节点下面就是对应的规则😜,我简单列了下相关规则和含义:

规则类型含义
DOMAIN-KEYWORD域名关键字匹配,如果请求的域名中包含指定的关键字,则使用代理。例如 DOMAIN-KEYWORD,whatsapp,Proxy 表示如果请求的域名中包含 "whatsapp" 关键字,则使用代理。
DOMAIN-SUFFIX域名后缀匹配,如果请求的域名以指定的后缀结尾,则使用代理。例如 DOMAIN-SUFFIX,cl.ly,Proxy 表示如果请求的域名以 ".cl.ly" 结尾,则使用代理。
IP-CIDRIP 地址匹配,如果请求的 IP 地址位于指定的 IP 地址范围内,则使用代理。例如 IP-CIDR,192.168.1.0/24,Proxy 表示如果请求的 IP 地址在 "192.168.1.0/24" 范围内,则使用代理。
GEOIP地理位置匹配,如果请求的 IP 地址位于指定的地理位置,则使用代理。
SRC-IP源 IP 地址匹配,如果请求的来源 IP 地址符合条件,则使用代理。
URL-REGEXURL 正则表达式匹配,如果请求的 URL 符合正则表达式条件,则使用代理。
USER-AGENT用户代理匹配,如果请求的用户代理符合条件,则使用代理。
FORCE-PROXY强制使用代理,不论其他规则是否匹配。
DIRECT直连,不使用代理。

知道了这些,我们就大概清楚了要修改哪个位置了。那有没有廉价且方便的修改方式呢?

还真有!

三、使用Cloudflare Workers

Cloudflare Workers 是由 Cloudflare 提供的一项服务,它允许开发人员在全球范围内运行服务器端代码而无需自己管理服务器。Cloudflare Workers 利用全球分布的边缘节点,使开发者能够在云端部署代码,并在距用户更近的位置执行代码,从而提高性能并减少延迟。

重点是免费!!!

官网地址:https://www.cloudflare.com/zh-cn/

大致原理如下:

开干:

1、注册、登录

略(自行处理)。

2、找到 Workers 和 Pages

建议读一读这个文档:

额,不读也罢,傻瓜式操作。

3、Node.js 环境搭建

略(自行处理)。

4、使用 Cloudflare 脚手架创建工程

npm create cloudflare@latest

一路确认,最终它会为你创建一个 cloudflare 工程。 本地运行一下试试:

npx wrangler dev

没有问题的化就会打开:http://localhost:8787,页面会展示:

Hello World!

基础工程搞定!

注:随时关注官方文档,注意变化:https://developers.cloudflare.com/workers/get-started/guide/

5、编码实现修改规则

代码基本改动很少,因为要操作 yaml 文件,所以先安装相关插件:

npm install js-yaml

将 index.ts 代码替换成以下代码(注意,这是 TypeScript 代码,取决于你在创建工程时的选择):

import * as yaml from 'js-yaml';

export interface Env {
 API_URL: string;
}

export default {
 async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
  const url = env.API_URL;
  const init = {
  };
  const response = await fetch(url, init);
  const netConfig = await this.getNetConfig(response);
  const results = this.appendCustomRules(netConfig)

  return new Response(results, init);
 },

 async getNetConfig(response: Response) {
  const { headers } = response;
  const contentType = headers.get("content-type") || "";
  if (contentType.includes("application/json")) {
   return JSON.stringify(await response.json());
  }
  return response.text();
 },
 
 appendCustomRules(netConfig: string) {
  // 将字符串转换为对象
  var config = yaml.load(netConfig) as any;

  config.rules = config.rules.filter((item: string) => !item.includes("microsoft"));

  // 添加自定义规则
  config.rules.push('DOMAIN-KEYWORD,microsoft,Proxy');
  config.rules.push('DOMAIN-KEYWORD,copilot,Proxy');
  config.rules.push('DOMAIN-SUFFIX,microsofttranslator.com,Proxy');
  // 将对象转换回字符串
  var updatedConfigString = yaml.dump(config);
  return updatedConfigString;
 }
};

代码就不再细讲,主要就是将原来的针对microsoft的规则替换我们自己的规则。

需要注意的是,里面有环境变量API_URL需要额外配置下:

  • 开发态,在工程跟目录创建.dev.vars文件:

API_URL=[your url]
  • 发布态,在工程根目录找到wrangler.toml文件,修改[vars]处代码:

[vars]
API_URL = "[your url]"

环境变量相关的官方文档:https://developers.cloudflare.com/workers/configuration/environment-variables/。

6、发布到 Cloudflare

运行以下命令将在 Cloudflare 进行部署:

npx wrangler deploy

7、梯子工具修改订阅地址

将截图中的地址复制出来:

等待片刻,使用这个链接就会是修改规则的订阅地址了🍺。

8、看看成果😏

四、最后

这篇文章就到这里了,希望大家能够学到一些有用的知识,也欢迎你们在评论区留言交流。如果你觉得这篇文章有趣或者有帮助,不妨给我点个赞或者分享给你的朋友。感谢你们的阅读,我们下次再见!

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值