Closed Peng-YM closed 4 years ago
允许使用脚本对订阅节点进行筛选和重命名,引入了以下两个新的参数:
sfilter
srename
相比于使用正则或者关键字进行过滤和重命名,脚本可以实现几乎所有的需求,但是复杂度也随之提升。如果你不具备JavaScript的基础知识,不建议使用此特性。
sfilter参数里面的脚本只能有一个名为filter的函数:
filter
function filter(nodes) {}
其中nodes参数有以下两个key:
nodes
names,包含了所有节点的tag。
names
tag
types,包含了所有节点的类型,可以为shadowsocks, vmess, http, trojan或者unknown。节点类型同样可以用于过滤或者重命名。
types
shadowsocks
vmess
http
trojan
unknown
filter函数的核心思想是:根据nodes输出一个布尔数组,其中true代表选择该节点,false代表去掉该节点`。
true
false
在此解析器中,提供了一些基础的API方便过滤,这些API统一使用$调用。对于sfilter,提供的API有:
$
$.filter(names, /(香港|HK|Hong Kong|/i, /台湾|TW|Taiwan/i)
另外,对于一些复杂的需求,提供了三个布尔运算符AND, OR, NOT。
AND
OR
NOT
AND([true, false, true], [false, true, true]) ==> [false, fasle, true]
OR([true, false, false], [false, true, false]) ==> [true, true, false]
理解了这些之后,我们来看个例子:比如说对于一个订阅:
我们的需求是: 只保留shadowsocks或者vmess类型的节点。 所有带有"NETFLIX"的节点。 只要IPLC和IEPL的节点。 去掉"印度","土耳其","加拿大"的节点,我们还需要保留NETFLIX节点。
我们的需求是:
我们可以这样写一个filter函数:
function filter(nodes) { const names = nodes.names; const types = $.filter(nodes.types, /shadowsocks|vmess/); const netflix = $.filter(names, /NETFLIX/i); //过滤出所有NETFLIX节点 const iplc = $.filter(names, /IPLC|IEPL/i); //过滤出含有IPLC和IEPL的节点 const kick = $.filter(names, /印度|土耳其/, /加拿大/); //过滤掉某些地区的节点,注意$.filter可以支持多个表达式 return AND(types, OR(netflix, AND(iplc, NOT(kick)))); }
可以看到sfilter足以应付几乎各种奇奇怪怪的需求。
与上面类似,我们需要写一个名为rename的函数。解析器提供的API有:
rename
$.replace(names, /regex/, newName)
$.delete(names, /regex1/, /regex2/, /regex3/)
$.trim(names)
例如:
function rename(nodes){ let names = nodes.names; names = $.delete(names, /IPLC|IEPL/i, /HULU|HBO|动画疯/i, /\d+(GBPS|MBPS)/i, /洛杉矶|圣塔克拉利塔|萨克拉门托|帕罗奥图/); names = $.trim(names); return names; }
当然,解析器提供的API只是辅助,你完全可以实现更加复杂、更加个性化的需求。
QuanX目前好像有url长度限制,参数较长的时候会被截断?
允许使用脚本对订阅节点进行筛选和重命名,引入了以下两个新的参数:
sfilter
参数可以传入一段base64编码的脚本,用于过滤订阅节点。srename
参数可以传入一段base64编码的脚本,用于重命名订阅节点。相比于使用正则或者关键字进行过滤和重命名,脚本可以实现几乎所有的需求,但是复杂度也随之提升。如果你不具备JavaScript的基础知识,不建议使用此特性。
用法
1. sfilter
sfilter
参数里面的脚本只能有一个名为filter
的函数:其中
nodes
参数有以下两个key:names
,包含了所有节点的tag
。types
,包含了所有节点的类型,可以为shadowsocks
,vmess
,http
,trojan
或者unknown
。节点类型同样可以用于过滤或者重命名。filter
函数的核心思想是:根据nodes
输出一个布尔数组,其中true
代表选择该节点,false
代表去掉该节点`。在此解析器中,提供了一些基础的API方便过滤,这些API统一使用
$
调用。对于sfilter
,提供的API有:$.filter(names, /(香港|HK|Hong Kong|/i, /台湾|TW|Taiwan/i)
,对于names
中包含任何一个正则表达式的元素,返回true
。另外,对于一些复杂的需求,提供了三个布尔运算符
AND
,OR
,NOT
。AND
可以合并多个布尔数组,表达的是逻辑和的关系AND([true, false, true], [false, true, true]) ==> [false, fasle, true]
。OR
类似于AND
,表达的是逻辑或的关系OR([true, false, false], [false, true, false]) ==> [true, true, false]
。NOT
用于反转一个布尔数组的所有元素理解了这些之后,我们来看个例子:比如说对于一个订阅:
我们可以这样写一个
filter
函数:可以看到
sfilter
足以应付几乎各种奇奇怪怪的需求。2. srename
与上面类似,我们需要写一个名为
rename
的函数。解析器提供的API有:$.replace(names, /regex/, newName)
,替换一个正则表达式为指定的名字。$.delete(names, /regex1/, /regex2/, /regex3/)
,删除包含匹配到任何一个正则的字段。$.trim(names)
,删除多余的空格。例如:
当然,解析器提供的API只是辅助,你完全可以实现更加复杂、更加个性化的需求。