云樾
踏浪而来
云樾
使用Surgio让订阅转换更方便
使用Surgio让订阅转换更方便

Mac端一直都用Surge作为Proxy工具,也很稳定,但是唯独不支持酸酸乳(Vmess和Trojan都原生支持了) 可偏偏现在优秀的中转JC使用酸酸乳居多,故当前有如下两个需求:

  1. 让Surge也支持酸酸乳(并非采用前置代理的方式)
  2. 因为手头有多个JC,并不想一个个订阅配置,想整合多个JC的订阅

Surgio正好完美解决了我的需求,下面记录使用其解决需求的过程。

快速安装

surgio推荐使用now.sh在线托管服务,具体安装教程官方已经写的很详细了,这里直接搬运:

Surgio目录结构
Surgio目录结构

配置Provider

根目录下的surgio.conf.js是全局配置文件,我们找到artifacts,Surgio会根据Artifact的值来生成相应的配置文件,Artifact的基本格式如下:

{
  name: Surge_ziyong.conf,
  template: template_demo,
  provider: provider_demo,
}

其中templateprovider的值必须填写在templateprovider文件夹下切实存在的js文件。 我的目的是定制一个特殊的surge配置文件,所以我首先配置一个Provider:服务提供者。 在provider文件夹下创建一个clash_subscribe_demo.js,由于我的JC订阅链接是clash的,所以type选择clash,其他支持的订阅类别请参考下图:

image-20201026203825223
use strict;

const { utils } = require(surgio);

module.exports = {
  url: 此处填写你的订阅链接,
  // 我的JC订阅链接是clash
  type: clash,
  // 定义所有的节点都支持 udpRelay
  udpRelay: true,
  // 添加国旗 emoji
  addFlag: true,
  // 自定义过滤器,此处使用合并过滤,过滤出香港、台湾和新加坡的节点地址
  customFilters: {
    usCunstomFilter: utils.mergeFilters(
      [utils.hkFilter, utils.taiwanFilter, utils.singaporeFilter],
      false // true代表同时满足上述条件的地址; false代表只需满足一项
    ),
  },
};

自定义Template

配置完服务提供者后需要自定义一个template模板,此处我要自定义一个Surge的配置文件模板。 首先找到一个常规的配置文件,我使用了nzw9314收集的配置文件,这里自由选择不做限制。 然后在template文件夹下新建一个surge_ziyong.tpl文件(Surgio为了能够灵活定义模板而引入了 Nunjucks)。 此处以官方提供的surge_v3模板作为例子,如下:

#!MANAGED-CONFIG {{ downloadUrl }} interval=43200 strict=false

{% import './snippet/direct_rules.tpl' as direct_rules %}
{% import './snippet/apple_rules.tpl' as apple_rules %}
{% import './snippet/youtube_rules.tpl' as youtube_rules %}
{% import './snippet/us_rules.tpl' as us_rules %}
{% import './snippet/blocked_rules.tpl' as blocked_rules %}

[General]
# 日志等级: warning, notify, info, verbose (默认值: notify)
loglevel = notify
# 跳过某个域名或者 IP 段,这些目标主机将不会由 Surge Proxy 处理。(在 macOS
# 版本中,如果启用了 Set as System Proxy,  那么这些值会被写入到系统网络代理
# 设置中.)
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 100.84.0.0/10, localhost, *.local
# 强制使用特定的 DNS 服务器
dns-server = system, 119.29.29.29, 223.5.5.5, 1.1.1.1

# 将特定 IP 段跳过 Surge TUN,详见 Manual
bypass-tun = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# 是否截取并保存 HTTP 流量 (启用后将对性能有较大影响) (默认值: false)
replica = false
# 是否启动完整的 IPv6 支持 (默认值: false)
ipv6 = false

# 以下参数仅供 macOS 版本使用(多端口监听仅 Surge 3 支持)
http-listen = 0.0.0.0:6152
socks5-listen = 0.0.0.0:6153

# 测速地址
internet-test-url = {{ proxyTestUrl }}
proxy-test-url = {{ proxyTestUrl }}

# 其它
# external-controller-access = password@0.0.0.0:6170
show-primary-interface-changed-notification = true
proxy-settings-interface = Primary Interface (Auto)
menu-bar-show-speed = false
allow-wifi-access = true
hide-crashlytics-request = true

[Proxy]
{{ getSurgeNodes(nodeList) }}

[Proxy Group]
🚀 Proxy = select, {{ getNodeNames(nodeList) }}
🎬 Netflix = select, {{ getNodeNames(nodeList, netflixFilter) }}
📺 YouTube = select, 🚀 Proxy, US, HK
🍎 Apple = select, DIRECT, 🚀 Proxy, US, HK
🍎 Apple CDN = select, DIRECT, 🍎 Apple
US = url-test, {{ getNodeNames(nodeList, usFilter) }}, url = {{ proxyTestUrl }}, interval = 1200
HK = url-test, {{ getNodeNames(nodeList, hkFilter) }}, url = {{ proxyTestUrl }}, interval = 1200

[Rule]
{{ apple_rules.main('🚀 Proxy', '🍎 Apple', '🍎 Apple CDN', 'DIRECT', 'US') }}

{{ remoteSnippets.netflix.main('🎬 Netflix') }}

{{ remoteSnippets.hbo.main('🎬 Netflix') }}

{{ remoteSnippets.hulu.main('🚀 Proxy') }}

{{ youtube_rules.main('📺 YouTube') }}

{{ us_rules.main('US') }}

{{ remoteSnippets.telegram.main('🚀 Proxy') }}

{{ blocked_rules.main('🚀 Proxy') }}

{{ direct_rules.main('DIRECT') }}

# Rulesets
RULE-SET,SYSTEM,DIRECT

# LAN
RULE-SET,LAN,DIRECT

# GeoIP CN
GEOIP,CN,DIRECT

# Final
FINAL,🚀 Proxy,dns-failed

[URL Rewrite]
^https?://(www.)?g.cn https://www.google.com 302
^https?://(www.)?google.cn https://www.google.com 302

其中几个关键点说明:

  • {% import './snippet/direct_rules.tpl' as direct_rules %}:引入分流规则集,具体分流规则定义在./template/snippet下,import后使用{{ direct_rules.main('DIRECT') }}引入。
  • {{ getSurgeNodes(nodeList) }}:获取Surge格式的节点列表
  • {{ getNodeNames(nodeList, usFilter) }}:获取节点名称,第二个参数为使用的过滤器。

配置完template后,在surgio.conf.js中修改相应配置即可。

{
  name: Surge_ziyong.conf,
  template: surge_ziyong,
  provider: clash_subscribe_demo,
}

git提交后,在托管服务上可看到配置已经生成,可以下载和预览: now.sh托管服务看到配置文件已生成

如何打开酸酸乳支持

找到 surgio.conf.js,补充如下字段:

module.exports = {
  // ...
  binPath: {
    shadowsocksr: '/usr/local/bin/ssr-local',
    // v2ray: '/usr/local/bin/v2ray', v2ray已原生支持
  },
  surgeConfig: {
    // 添加该项后Surgio会在生成配置的时候解析域名
    resolveHostname: true,
  },
}

酸酸乳建议安装在/usr/local/bin/ssr-local下,使用下面命令安装即可:

curl -L https://github.com/tindy2013/shadowsocks-static-binaries/raw/master/shadowsocksr-libev/macos/ssr-local -o /usr/local/bin/ssr-local && chmod +x /usr/local/bin/ssr-local

如何让surge界面更简洁

如果整合了多家JC的订阅,surge for mac的代理界面是非常臃肿的,那么我们如何才能达到下面的简洁效果呢?

整合多机场订阅
简洁的surge代理界面

我们需要使用到policy-path,只需要在上述自定义模板中的[Proxy Group]下添加如下配置,在[Proxy]下删除{{ getSurgeNodes(nodeList) }}

JC1 = select, policy-path=[surge类型节点订阅地址], url = http://www.qualcomm.cn/generate_204, interval=300

有人说上述surge类型节点订阅地址不想通过第三方API来转换,那怎么办?

我们同样可以通过surgio来完成,新建一个模板文件surge_node_list.tpl,在其中输入:

{{ getSurgeNodes(nodeList, customFilters.usHkAndTwFilter) }}

然后同样用其生成一个artifact并获取相关地址,然后在policy-path后填入该地址即可,这样不用借助任何第三方订阅转换工具就能实现,是不是很方便?

云樾

文章作者

发表评论

textsms
account_circle
email

云樾

使用Surgio让订阅转换更方便
Mac端一直都用Surge作为Proxy工具,也很稳定,但是唯独不支持酸酸乳(Vmess和Trojan都原生支持了) 可偏偏现在优秀的中转JC使用酸酸乳居多,故当前有如下两个需求: 让Surge也支持酸酸…
扫描二维码继续阅读
2020-10-26