代理链
Clash Nyanpasu
继承了 Clash Verge
的代理链功能,可以通过 Script
或 Merge
两种 链 类型来实现代理链。本节内容引自并改编自 Clash Verge
的文档[1]。
什么是代理链?
未来,我们会将代理链划分为 基于 Profile、全局 的两种类型。
- 每个配置拥有自己独自的代理链,这种代理链称为
Profile
代理链。- 全局代理链是一个全局的代理链,它会影响所有的配置。
目前我们计划在
1.6.0
中实现这个功能。
所谓代理链,即 Profile
的后处理的链式调用。一个 Profile 可以通过 A
、B
、C
甚至更多的链处理节点,生成出一个最终的代理配置。 因此,多个链处理节点的组合,就构成了代理链。您可以按照自己的需求,自由组合链处理节点,实现自己的代理链。
Merge(合并)处理
此处理节点提供了类似 OpenClash
的配置合并功能。它通过定义了以下规则,实现了对配置的覆盖。
注意
需要使用其他字段时,例如 dns
, tun
等,需要在设置页 - Clash 字段 里勾选对应的字段,不勾选的字段将被忽略。
prepend-rules
:类型和 Clashrules
配置一致,内容合并到rules
前append-rules
:类型和 Clashrules
配置一致,内容合并到rules
后prepend-proxies
:类型和 Clashproxies
配置一致,内容合并到proxies
前append-proxies
:类型和 Clashproxies
配置一致,内容合并到proxies
后prepend-proxy-groups
:类型和 Clashproxy-groups
配置一致,内容合并到proxy-groups
前append-proxy-groups
:类型和 Clashproxy-groups
配置一致,内容合并到proxy-groups
后- 其他 Clash 的字段:5 个默认使用的字段(
rules
,proxies
,proxy-groups
,proxy-providers
,rule-providers
)以及其他clash/clash meta支持的字段,直接设置这些字段将直接覆盖profile对应字段的内容。
我们计划在未来针对 Merge 的改进,譬如提供递归合并的功能,自定义
prepend-*
、append-*
的支持。
Script(脚本)处理
提示
- 目前基于
JavaScript
的脚本处理节点,尚不支持 ES Modules、Async/Await、Fetch 等特性。我们计划在未来支持这些特性。 - 我们计划在未来支持
Lua
脚本处理节点,并提供Fetch
、Async
的支持。
此处理节点目前提供了基于 QuickJS
的 JavaScript
脚本处理功能,类似于 CFW 提供的 Mixins
或 预处理 功能。
脚本接受一个方法签名为 function main(config: ClashConfig): ClashConfig
的方法,其中 ClashConfig
是 Clash 的配置类型。脚本的返回值将作为最终的配置。
以下是一个添加 proxies-provider
的脚本示例:
javascript
// Define the `main` function
function main(config) {
const extra = {
'rule-providers': {
reject: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt',
path: './ruleset/reject.yaml',
interval: 86400
},
icloud: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt',
path: './ruleset/icloud.yaml',
interval: 86400
},
apple: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt',
path: './ruleset/apple.yaml',
interval: 86400
},
google: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt',
path: './ruleset/google.yaml',
interval: 86400
},
proxy: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt',
path: './ruleset/proxy.yaml',
interval: 86400
},
direct: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt',
path: './ruleset/direct.yaml',
interval: 86400
},
private: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt',
path: './ruleset/private.yaml',
interval: 86400
},
gfw: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt',
path: './ruleset/gfw.yaml',
interval: 86400
},
greatfire: {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt',
path: './ruleset/greatfire.yaml',
interval: 86400
},
'tld-not-cn': {
type: 'http',
behavior: 'domain',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt',
path: './ruleset/tld-not-cn.yaml',
interval: 86400
},
telegramcidr: {
type: 'http',
behavior: 'ipcidr',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt',
path: './ruleset/telegramcidr.yaml',
interval: 86400
},
cncidr: {
type: 'http',
behavior: 'ipcidr',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt',
path: './ruleset/cncidr.yaml',
interval: 86400
},
lancidr: {
type: 'http',
behavior: 'ipcidr',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt',
path: './ruleset/lancidr.yaml',
interval: 86400
},
applications: {
type: 'http',
behavior: 'classical',
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt',
path: './ruleset/applications.yaml',
interval: 86400
}
}
}
const extra_rules = [
// 规则集合开始
'RULE-SET,applications,DIRECT',
'DOMAIN,clash.razord.top,DIRECT',
'DOMAIN,yacd.haishan.me,DIRECT',
'RULE-SET,icloud,DIRECT',
'RULE-SET,apple,Apple',
'RULE-SET,private,DIRECT',
'RULE-SET,reject,REJECT',
'RULE-SET,tld-not-cn,Proxies',
'RULE-SET,gfw,Proxies',
'RULE-SET,telegramcidr,Telegram',
'GEOIP,LAN,DIRECT',
'GEOIP,CN,DIRECT'
]
extra.rules = [...extra_rules, ...config.rules]
extra.dns = { ...config.dns, enable: false }
return { ...config, ...extra }
}