KOP-XIAO / QuantumultX

2.72k stars 614 forks source link

添加sfilter和srename #9

Closed Peng-YM closed 4 years ago

Peng-YM commented 4 years ago

允许使用脚本对订阅节点进行筛选和重命名,引入了以下两个新的参数:

  1. sfilter参数可以传入一段base64编码的脚本,用于过滤订阅节点。
  2. srename参数可以传入一段base64编码的脚本,用于重命名订阅节点。

相比于使用正则或者关键字进行过滤和重命名,脚本可以实现几乎所有的需求,但是复杂度也随之提升。如果你不具备JavaScript的基础知识,不建议使用此特性

用法

1. sfilter

sfilter参数里面的脚本只能有一个名为filter的函数:

function filter(nodes) {}

其中nodes参数有以下两个key:

filter函数的核心思想是:根据nodes输出一个布尔数组,其中true代表选择该节点,false代表去掉该节点`。

在此解析器中,提供了一些基础的API方便过滤,这些API统一使用$调用。对于sfilter,提供的API有:

另外,对于一些复杂的需求,提供了三个布尔运算符AND, OR, NOT

理解了这些之后,我们来看个例子:比如说对于一个订阅:

我们的需求是:

  • 只保留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足以应付几乎各种奇奇怪怪的需求。

2. srename

与上面类似,我们需要写一个名为rename的函数。解析器提供的API有:

例如:

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只是辅助,你完全可以实现更加复杂、更加个性化的需求。

chyzp commented 3 years ago

QuanX目前好像有url长度限制,参数较长的时候会被截断?