Script Configuration
Adding Scripts
WARNING
Script Configuration,EnableSequential,。 ConfigurationModifyNeedEnable,(Configuration Disable Enable ,Can 🔥 )。

Script Instructions
- The script language is
javascript, usingboa_engineas the executor. - The program entry point is the
mainfunction, which accepts aparamsparameter (parameter name is not restricted) and returns the modified parameter. paramsis of typeobject, where property values areobjectobjects corresponding to theyamlconfiguration file content converted toJSON.
javascript
function main(params) {
return params;
}Supported APIs
The following APIs are supported in the scope. Network IO and file IO operations are not supported.
| API Type | API Scope |
|---|---|
| Constants | Infinity、NaN、undefined |
| Basic Functions and Objects | Function、Object、Math、JSON、Array、Proxy |
| Data Types and Arrays | ArrayBuffer、SharedArrayBuffer、BigInt、Boolean、Date、DataView、Map、TypedArray、Int8Array、Uint8Array、Uint8ClampedArray、Int16Array、Uint16Array、Int32Array、Uint32Array、BigInt64Array、BigUint64Array、Float32Array、Float64Array |
| Strings, Regular Expressions, and Symbols | String、RegExp、Symbol |
| Error Objects | Error、RangeError、ReferenceError、TypeError、SyntaxError、EvalError、URIError、AggregateError |
| Reflection and Async | Reflect、Promise |
| Encoding and Decoding | encodeURI、encodeURIComponent、decodeURI、decodeURIComponent |
| Weak References | WeakRef、WeakMap、WeakSet |
| Atomic Operations | Atomics |
| Console Output | console |
Script Examples
Loyalsoldier Rules Script Script Examples()。
INFO
You can add your own rules under // Custom Rules in the script. For rule configuration, please refer to the Rule Configuration Documentation.
javascript
// Domestic DNS Servers
const domesticNameservers = [
"https://dns.alidns.com/dns-query", // Alibaba Cloud Public DNS
"https://doh.pub/dns-query", // Tencent DNSPod
"https://doh.360.cn/dns-query", // 360 Secure DNS
];
// Foreign DNS Servers
const foreignNameservers = [
"https://1.1.1.1/dns-query", // Cloudflare (Primary)
"https://1.0.0.1/dns-query", // Cloudflare (Backup)
"https://208.67.222.222/dns-query", // OpenDNS (Primary)
"https://208.67.220.220/dns-query", // OpenDNS (Backup)
"https://194.242.2.2/dns-query", // Mullvad (Primary)
"https://194.242.2.3/dns-query", // Mullvad (Backup)
];
// DNS Configuration
const dnsConfig = {
dns: true,
listen: 1053,
ipv6: true,
"use-hosts": true,
"cache-algorithm": "arc",
"enhanced-mode": "fake-ip",
"fake-ip-range": "198.18.0.1/16",
"fake-ip-filter": [
"+.lan",
"+.local",
"+.msftconnecttest.com",
"+.msftncsi.com",
],
"default-nameserver": ["223.5.5.5", "114.114.114.114", "1.1.1.1", "8.8.8.8"],
nameserver: [...domesticNameservers, ...foreignNameservers],
"proxy-server-nameserver": [...domesticNameservers, ...foreignNameservers],
"nameserver-policy": {
"geosite:private,cn,geolocation-cn": domesticNameservers,
"geosite:google,youtube,telegram,gfw,geolocation-!cn": foreignNameservers,
},
};
// Rule Provider Common Configuration
const ruleProviderCommon = {
type: "http",
format: "yaml",
interval: 86400,
};
// Rule Provider Configuration
const ruleProviders = {
reject: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt",
path: "./rulesets/loyalsoldier/reject.yaml",
},
icloud: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt",
path: "./rulesets/loyalsoldier/icloud.yaml",
},
apple: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt",
path: "./rulesets/loyalsoldier/apple.yaml",
},
google: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt",
path: "./rulesets/loyalsoldier/google.yaml",
},
proxy: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt",
path: "./rulesets/loyalsoldier/proxy.yaml",
},
direct: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt",
path: "./rulesets/loyalsoldier/direct.yaml",
},
private: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt",
path: "./rulesets/loyalsoldier/private.yaml",
},
gfw: {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt",
path: "./rulesets/loyalsoldier/gfw.yaml",
},
"tld-not-cn": {
...ruleProviderCommon,
behavior: "domain",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt",
path: "./rulesets/loyalsoldier/tld-not-cn.yaml",
},
telegramcidr: {
...ruleProviderCommon,
behavior: "ipcidr",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt",
path: "./rulesets/loyalsoldier/telegramcidr.yaml",
},
cncidr: {
...ruleProviderCommon,
behavior: "ipcidr",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt",
path: "./rulesets/loyalsoldier/cncidr.yaml",
},
lancidr: {
...ruleProviderCommon,
behavior: "ipcidr",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt",
path: "./rulesets/loyalsoldier/lancidr.yaml",
},
applications: {
...ruleProviderCommon,
behavior: "classical",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt",
path: "./rulesets/loyalsoldier/applications.yaml",
},
};
// Rules
const rules = [
// CustomRules
"DOMAIN-SUFFIX,googleapis.cn,Proxy Select", // Google Services
"DOMAIN-SUFFIX,gstatic.com,Proxy Select", // Google Static Resources
"DOMAIN-SUFFIX,xn--ngstr-lra8j.com,Proxy Select", // Google Play Download Service
"DOMAIN-SUFFIX,github.io,Proxy Select", // GitHub Pages
"DOMAIN,v2rayse.com,Proxy Select", // V2rayse Node Tool
// Loyalsoldier Rules
"RULE-SET,reject,Ad Filter",
"RULE-SET,icloud,Microsoft Services",
"RULE-SET,apple,Apple Services",
"RULE-SET,google,Google Services",
"RULE-SET,proxy,Proxy Select",
"RULE-SET,gfw,Proxy Select",
"RULE-SET,tld-not-cn,Proxy Select",
"RULE-SET,applications,Global Direct",
"RULE-SET,private,Global Direct",
"RULE-SET,direct,Global Direct",
"RULE-SET,lancidr,Global Direct,no-resolve",
"RULE-SET,cncidr,Global Direct,no-resolve",
"RULE-SET,telegramcidr,Telegram Messages,no-resolve",
// Rules
"GEOIP,LAN,Global Direct,no-resolve",
"GEOIP,CN,Global Direct,no-resolve",
"MATCH,Final Match",
];
// Proxy Group Common Configuration
const groupBaseOption = {
interval: 300,
timeout: 3000,
url: "https://www.google.com/generate_204",
lazy: true,
"max-failed-times": 3,
hidden: false,
};
// Program Entry Point
function main(config) {
const proxyCount = config?.proxies?.length ?? 0;
const proxyProviderCount =
typeof config?.["proxy-providers"] === "object"
? Object.keys(config["proxy-providers"]).length
: 0;
if (proxyCount === 0 && proxyProviderCount === 0) {
throw new Error("No proxies found in configuration file");
}
// ConfigurationDNS Configuration
config["dns"] = dnsConfig;
// Override proxy groups in original config
config["proxy-groups"] = [
{
...groupBaseOption,
name: "Proxy Select",
type: "select",
proxies: ["URL Test", "Fallback", "Load Balance (Hash)", "Load Balance (Round Robin)"],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/adjust.svg",
},
{
...groupBaseOption,
name: "URL Test",
type: "url-test",
tolerance: 100,
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/speed.svg",
},
{
...groupBaseOption,
name: "Fallback",
type: "fallback",
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/ambulance.svg",
},
{
...groupBaseOption,
name: "Load Balance (Hash)",
type: "load-balance",
strategy: "consistent-hashing",
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/merry_go.svg",
},
{
...groupBaseOption,
name: "Load Balance (Round Robin)",
type: "load-balance",
strategy: "round-robin",
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/balance.svg",
},
{
...groupBaseOption,
name: "Google Services",
type: "select",
proxies: [
"Proxy Select",
"URL Test",
"Fallback",
"Load Balance (Hash)",
"Load Balance (Round Robin)",
"Global Direct",
],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/google.svg",
},
{
...groupBaseOption,
name: "",
type: "select",
proxies: [
"Proxy Select",
"URL Test",
"Fallback",
"Load Balance (Hash)",
"Load Balance (Round Robin)",
"Global Direct",
],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/youtube.svg",
},
{
...groupBaseOption,
name: "Telegram Messages",
type: "select",
proxies: [
"Proxy Select",
"URL Test",
"Fallback",
"Load Balance (Hash)",
"Load Balance (Round Robin)",
"Global Direct",
],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/telegram.svg",
},
{
...groupBaseOption,
name: "Microsoft Services",
type: "select",
proxies: [
"Global Direct",
"Proxy Select",
"URL Test",
"Fallback",
"Load Balance (Hash)",
"Load Balance (Round Robin)",
],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/microsoft.svg",
},
{
...groupBaseOption,
name: "Apple Services",
type: "select",
proxies: [
"Proxy Select",
"URL Test",
"Fallback",
"Load Balance (Hash)",
"Load Balance (Round Robin)",
"Global Direct",
],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/apple.svg",
},
{
...groupBaseOption,
name: "Ad Filter",
type: "select",
proxies: ["REJECT", "DIRECT"],
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/bug.svg",
},
{
...groupBaseOption,
name: "Global Direct",
type: "select",
proxies: [
"DIRECT",
"Proxy Select",
"URL Test",
"Fallback",
"Load Balance (Hash)",
"Load Balance (Round Robin)",
],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/link.svg",
},
{
...groupBaseOption,
name: "Global",
type: "select",
proxies: ["REJECT", "DIRECT"],
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/block.svg",
},
{
...groupBaseOption,
name: "Final Match",
type: "select",
proxies: [
"Proxy Select",
"URL Test",
"Fallback",
"Load Balance (Hash)",
"Load Balance (Round Robin)",
"Global Direct",
],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/fish.svg",
},
];
// ConfigurationRules
config["rule-providers"] = ruleProviders;
config["rules"] = rules;
// BackModifyConfiguration
return config;
}