Provider 服务提供者

你可以在 provider 目录内看到两个已经写好的 Provider,它们分别是订阅地址和自己维护的节点列表。

需要注意的是文件名即为该 Provider 的名称,后面在定义 Artifact 时会用到。

支持写异步函数 新特性

为了满足更多定制化的场景,支持通过异步函数的模式挂载 Provider

async function getProvider() {
  const myNodeList = await someAsyncFunction();
  return {
    type: 'custom',
    nodeList: myNodeList,
  };
}

module.exports = getProvider;

1
2
3
4
5
6
7
8
9
10

目前 Surgio 支持两种 Provider 类型:

类型描述备注
shadowsocks_json_subscribe针对 Windows 客户端的 Shadowsocks 订阅地址通常命名为 gui-config.json
shadowsocks_subscribe通用的 Shadowsocks 订阅地址
shadowsocksr_subscribe通用的 Shadowsocksr 订阅地址
v2rayn_subscribeV2rayN 订阅地址协议open in new window
custom 推荐自己维护的节点支持 Shadowsocks, Shadowsocksr, Snell, HTTPS, HTTP, Vmess, Socks5
clash 推荐Clash 配置支持 Shadowsocks, Shadowsocksr, Snell, HTTPS, HTTP, Vmess
ssdSSD 订阅支持 Shadowsocks

shadowsocks_json_subscribe

module.exports = {
  type: 'shadowsocks_json_subscribe',
  url: '',
  udpRelay: true,
};
1
2
3
4
5

url

  • 类型: string
  • 默认值: undefined
  • 必须

若机场没有提供这种订阅地址,推荐使用 Fndroid 的 接口open in new window 进行转换。

注意

udpRelay

  • 类型: boolean
  • 默认值: false

由于这种订阅协议不支持定义 UDP 转发的支持情况,所以单独出来进行配置。UDP 转发可以应用在 Surge 中。

shadowsocks_subscribe

module.exports = {
  type: 'shadowsocks_subscribe',
  url: '',
  udpRelay: true,
};
1
2
3
4
5

注意

  1. Surgio 支持读取 obfs-localv2ray-plugin 两种 SIP003 插件配置;
  2. 仅支持 v2ray-plugin 的 WebSocket 模式;

url

  • 类型: string
  • 默认值: undefined
  • 必须

注意

udpRelay

  • 类型: boolean
  • 默认值: false

由于这种订阅协议不支持定义 UDP 转发的支持情况,所以单独出来进行配置。UDP 转发可以应用在 Surge 中。

shadowsocksr_subscribe

module.exports = {
  type: 'shadowsocksr_subscribe',
  url: '',
};
1
2
3
4

url

  • 类型: string
  • 默认值: undefined
  • 必须

v2rayn_subscribe

module.exports = {
  type: 'v2rayn_subscribe',
  url: '',
};
1
2
3
4

url

  • 类型: string
  • 默认值: undefined
  • 必须

注意

  • Quantumult 的订阅格式和 V2rayN 的订阅格式有差异,不可以混用;
  • 如果你正在使用 DlerCloudopen in new window,可以使用「通用」类型的订阅地址;

compatibleMode

  • 类型: boolean
  • 默认值: false

部分机场提供的订阅地址不符合标准,提供一个兼容模式进行解析。

udpRelay

  • 类型: boolean
  • 默认值: false

由于这种订阅协议不支持定义 UDP 转发的支持情况,所以单独出来进行配置。

skipCertVerify

  • 类型: boolean
  • 默认值: false

由于这种订阅协议不支持定义跳过证书验证,所以单独出来进行配置。

tls13

  • 类型: boolean
  • 默认值: false

强制开启节点的 TLS 1.3。

clash 推荐

注意

  1. Surgio 支持读取 obfs-localv2ray-plugin 两种 SIP003 插件配置;
  2. 仅支持 v2ray-plugin 的 WebSocket 模式;

url

  • 类型: string
  • 默认值: undefined
  • 必须

udpRelay

  • 类型: boolean
  • 默认值: false

我们发现部分机场的 Clash 订阅并没有设定 udp,所以你可以通过配置这个属性来强制设定节点的 UDP 转发支持情况。如果订阅节点中包含 udp 字段,则该配置无效。

tls13

  • 类型: boolean
  • 默认值: false

强制开启节点的 TLS 1.3。

ssd v2.0.0

注意

  1. Surgio 支持读取 simple-obfsv2ray-plugin 两种 SIP003 插件配置;
  2. 仅支持 v2ray-plugin 的 WebSocket 模式;

url

  • 类型: string
  • 默认值: undefined
  • 必须

udpRelay

  • 类型: boolean
  • 默认值: false

你可以通过配置这个属性来强制设定节点的 UDP 转发支持情况。

custom 推荐

module.exports = {
  type: 'custom',
  nodeList: [],
};
1
2
3
4

nodeList

  • 类型: NodeConfig[]
  • 默认值: undefined
  • 必须

不同的类型的节点 NodeConfig 结构有一些不同,下面是所有支持的节点类型:

Shadowsocks

{
  type: 'shadowsocks',
  nodeName: '🇺🇸US',
  hostname: 'us.example.com',
  port: 10000,
  method: 'chacha20-ietf-poly1305',
  password: 'password',
  obfs: 'tls', // tls, http, ws, wss
  'obfs-host': 'gateway-carry.icloud.com',
  'obfs-uri': '/', // 当 obfs 为 ws 或 wss 时可配置
  'udp-relay': true,
  tfo: false, // TCP Fast Open
  tls13: false, // TLS 1.3,适用于 v2ray-plugin
  mux: false, // 目前仅 Clash + Shadowsocks + v2ray-plugin 可用
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

注意

  1. wswss 是通过服务端 v2ray-plugin 支持的;
  2. TLS 1.3 需要服务端支持

Shadowsocksr

{
  type: 'shadowsocksr',
  nodeName: '🇭🇰HK',
  hostname: 'hk.example.com',
  port: 10000,
  method: 'chacha20-ietf',
  password: 'password',
  obfs: 'tls1.2_ticket_auth',
  obfsparam: 'music.163.com',
  protocol: 'auth_aes128_md5',
  protoparam: '',
  'udp-relay': true,
  tfo: false, // TCP Fast Open
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Vmess

{
  nodeName: '🇭🇰HK',
  type: 'vmess',
  hostname: 'hk.example.com',
  method: 'auto', // 仅支持 auto/aes-128-gcm/chacha20-ietf-poly1305/none
  network: 'ws', // 仅支持 tcp/ws
  alterId: '64',
  path: '/',
  port: 8080,
  tls: false,
  host: 'example.com',
  uuid: '1386f85e-657b-4d6e-9d56-78badb75e1fd',
  tfo: false, // TCP Fast Open
  tls13: false, // TLS 1.3, TLS 开启时有效
  'udp-relay': true, // 开启 UDP 转发
  wsHeaders: {
    key: 'value',
  },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Snell

{
  type: 'snell',
  nodeName: '🇭🇰HK',
  hostname: 'hk.example.com',
  port: 10000,
  psk: 'RjEJRhNPps3DrYBcEQrcMe3q9NzFLMP',
  obfs: 'tls', // tls 或 http
  version: '2', // 可选
}
1
2
3
4
5
6
7
8
9

HTTPS

{
  type: 'https',
  nodeName: '🇭🇰HK',
  hostname: 'hk.example.com',
  port: 443,
  username: 'username',
  password: 'password',
  tls13: false, // TLS 1.3
}
1
2
3
4
5
6
7
8
9

HTTP

{
  type: 'http',
  nodeName: '🇭🇰HK',
  hostname: 'hk.example.com',
  port: 8080,
  username: 'username',
  password: 'password',
}
1
2
3
4
5
6
7
8

Trojan

{
  type: 'trojan',
  nodeName: '🇭🇰HK',
  hostname: 'hk.example.com',
  port: 443,
  password: 'password',
  sni: 'example.com', // 可选
  alpn: ['http/1.1'], // 可选
  skipCertVerify: true, // 可选
  'udp-relay': true, // 可选
  tls13: false, // TLS 1.3
}
1
2
3
4
5
6
7
8
9
10
11
12

Socks5

{
  type: 'socks5',
  nodeName: '🇭🇰HK',
  hostname: 'hk.example.com',
  port: 80,
  username: 'username', // 可选
  password: 'password', // 可选
  tls: true, // 可选
  skipCertVerify: true, // 可选
  'udp-relay': false, // 可选, 仅 Clash 支持
  sni: 'example.com', // 可选, 仅 Surge 支持
  tfo: true, // 可选, 仅 Surge 支持
  clientCert: 'item' // 可选, 仅 Surge 支持, 参考 https://github.com/Blankwonder/Surge-Manual/blob/master/release-note/surge-mac.md#version-250
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

公共属性

提示

公共属性可以定义在任何一种 Provider 中。

nodeConfig.enable

  • 类型: boolean
  • 默认值: true

单独关闭某个节点输出到配置中。若没有 enable 属性则默认打开。

{
  enable: false,
  type: 'shadowsocks',
  nodeName: '🇺🇸US',
  hostname: 'us.example.com',
  port: '10000',
  method: 'chacha20-ietf-poly1305',
  password: 'password',
}
1
2
3
4
5
6
7
8
9

nodeConfig.tfo

  • 类型: Boolean
  • 默认值: false

是否为该节点开启 TFO(TCP Fast Open)。

nodeConfig.mptcp

  • 类型: Boolean
  • 默认值: false

是否为该节点开启 Multipath TCP。目前仅 Surge 支持这一特性。

nodeConfig.tls13

  • 类型: Boolean
  • 默认值: false

为 TLS 节点开启 TLS 1.3 支持。

注意

  1. TLS 1.3 需要服务端支持;
  2. 支持 TLS 的节点类型有 Shadowsocks with v2ray-plugin(tls), Vmess(tls), HTTPS;
  3. 如果你使用 Surge,

nodeConfig.skipCertVerify

  • 类型: Boolean
  • 默认值: false

关闭 TLS 节点的证书检查。

注意

  1. 支持 TLS 的节点类型有 Shadowsocks with v2ray-plugin(tls), Vmess(tls), HTTPS;
  2. 请不要随意将证书检查关闭;

nodeConfig.underlyingProxy v2.2.0

  • 类型: String
  • 默认值: undefined

可以通过一个代理跳板使用另一个代理,可以无限嵌套使用。目前仅 Surge 支持该特性。

注意

Surgio 不会验证名称是否有效

nodeConfig.testUrl v2.8.0

  • 类型: String
  • 默认值: undefined

在新版的 Surge 中支持针对某个 Proxy 设置测试的地址。你可以通过这个参数来设置改地址。

注意

  1. Surgio 不会验证名称是否有效;
  2. 目前仅 Surge 支持该特性;

provider.nodeFilter

  • 类型: Function
  • 入参: NodeConfig
  • 返回值: boolean

有一些俗称「外贸机场」的服务商提供很多诸如马来西亚、土耳其的节点,不需要这些国家节点的朋友每次都要在数十个节点中寻找自己想要的。我们可以用这个方法把这些节点过滤掉。

const { utils } = require('surgio');

module.exports = {
  // 过滤出名字中包含土耳其和马来西亚的节点
  nodeFilter: utils.useKeywords(['土耳其', '马来西亚']),
};
1
2
3
4
5
6

提示

关于过滤器的自定义和其它进阶使用方法,请阅读 「自定义过滤器」

provider.netflixFilter

  • 类型: Function
  • 入参: NodeConfig
  • 返回值: boolean

该方法会覆盖 Surgio 内置的 netflixFilter。用于过滤出支持 Netflix 的节点。对于那些每一个节点都解锁流媒体的机场,也可以单独过滤出部分你喜欢的节点。

内置 netflixFilter 的解释

module.exports = {
  // 过滤出名字中包含 HK(大小写不敏感)的节点
  netflixFilter: utils.useKeywords(['hk', 'HK']),
};
1
2
3
4

provider.youtubePremiumFilter

  • 类型: Function
  • 入参: NodeConfig
  • 返回值: boolean

该方法会覆盖 Surgio 内置的 youtubePremiumFilter。用于过滤出支持 Youtube Premium 的节点。

内置 youtubePremiumFilter 的解释

provider.customFilters

  • 类型: object
  • 默认值: undefined

自定义 Filter。关于自定义 Filter 的用法,请阅读 进阶 - 自定义 Filter

提示

你现在可以定义 全局的过滤器 了!

provider.startPort

  • 类型: Number

在调用 getSurgeNodes 时会强制要求设置该值。建议大于 10000。

在生成 Surge 的 Shadowsocksr 和 Vmess 配置文件时,本地监听端口会根据此配置递增。这样做的好处是切换配置文件时不会遇到端口冲突。同一个 Provider 被用在不同的 Artifact 中也会进行递增。

provider.addFlag

  • 类型: Boolean
  • 默认值: false

在节点名称前加国旗 Emoji。需要注意的是,Surgio 是根据有限的节点名关键词判断位置的,如果无法匹配则会保留原节点名。你可以在所有的过滤器中检索国旗 Emoji。

provider.removeExistingFlag v2.5.0

  • 类型: Boolean
  • 默认值: false

去除订阅中的国旗 Emoji。可以在不开启 addFlag 时使用,这时会输出没有 Emoji 的节点名称。

provider.tfo

  • 类型: Boolean
  • 默认值: false

是否为该订阅强制开启 TFO(TCP Fast Open)。部分机场虽然支持 TFO 但是没有在订阅中开启,你可以通过这个配置强制打开。

provider.mptcp

  • 类型: Boolean
  • 默认值: false

是否为该订阅强制开启 Multipath TCP。目前仅 Surge 支持这一特性。

provider.renameNode

  • 类型: Function
  • 默认值: undefined

更改节点名。如果你对机场的奇葩命名有意见,可以在这里把他们替换掉。

module.exports = {
  renameNode: name => {
    if (name === '社会主义') {
      return '资本主义';
    }
    return name;
  },
};
1
2
3
4
5
6
7
8

注意

  1. nodeFilter 只对原始名称有效;
  2. 其它内置过滤器和自定义过滤器仅对新名称有效;
  3. 如果你开启了 addFlag,那国家地区判定仅对新名称有效;
  4. 这个方法不一定要在末尾 return 内容,如果没有返回内容则保留原名称;

provider.relayUrl

  • 类型: Boolean|String
  • 默认值: undefined

开启订阅地址转发。由于部分机场禁止 AWS 等公有云服务器访问,所以面板无法获取订阅内容。开启后会使用一个免费并且安全的转发服务进行获取。

从 v2.4.0 开始,你可以指定一个字符串来自定义转发服务。设置的方法如下:

  1. URL 中插入原始的订阅连接:
module.exports = {
  relayUrl: 'https://proxy.example.com/%URL%',
};
1
2
3
  1. URL 中插入 URL encoded 后的订阅连接:
module.exports = {
  relayUrl: 'https://proxy.example.com/?url=%%URL%%',
};
1
2
3

如果 relayUrl 是一个布尔值,则使用内置的服务进行转发。