mirror of
https://github.com/asdlokj1qpi233/subconverter.git
synced 2025-10-28 20:32:42 +00:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22582a9bd5 | ||
|
|
55ad853a2c | ||
|
|
5594070657 | ||
|
|
550670006d | ||
|
|
b5e3763978 | ||
|
|
000dffce23 | ||
|
|
98599f3b61 | ||
|
|
7bbd9af989 | ||
|
|
4eda0edb26 | ||
|
|
9aa64c4132 | ||
|
|
908d8ec19d | ||
|
|
15a66609af | ||
|
|
27c3b10b04 | ||
|
|
5cd8827bd4 | ||
|
|
849483fd43 | ||
|
|
1b6e877724 | ||
|
|
6c2192b4f8 | ||
|
|
6ff431ef10 | ||
|
|
8fe8dcbe86 | ||
|
|
0eaec3a162 | ||
|
|
4958e30657 | ||
|
|
844c68df9a | ||
|
|
4dbb9ef983 | ||
|
|
5d144c32a4 | ||
|
|
8ed0a620fd | ||
|
|
24ef7f9e9e | ||
|
|
782caaf082 | ||
|
|
fa06e8def9 | ||
|
|
f01b7b6d2d | ||
|
|
9bf13e792b | ||
|
|
ac0dedecf0 | ||
|
|
c51affc3cc |
@@ -38,7 +38,7 @@ jobs:
|
||||
- name: "Linux x86_64 Build"
|
||||
services: docker
|
||||
script:
|
||||
- docker run -v $TRAVIS_BUILD_DIR:/root/workdir alpine:latest /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
|
||||
- docker run -v $TRAVIS_BUILD_DIR:/root/workdir multiarch/alpine:amd64-edge /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
|
||||
deploy:
|
||||
provider: releases
|
||||
token: "$GITHUB_OAUTH_TOKEN"
|
||||
@@ -49,8 +49,8 @@ jobs:
|
||||
tags: true
|
||||
- name: "Linux ARMHF Build"
|
||||
services: docker
|
||||
arch: arm64
|
||||
script:
|
||||
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||
- docker run --rm -v $TRAVIS_BUILD_DIR:/root/workdir multiarch/alpine:armhf-edge /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
|
||||
before_deploy:
|
||||
- mv subconverter_linux64.tar.gz subconverter_armhf.tar.gz
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
services: docker
|
||||
arch: arm64
|
||||
script:
|
||||
- docker run -v $TRAVIS_BUILD_DIR:/root/workdir alpine:latest /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
|
||||
- docker run -v $TRAVIS_BUILD_DIR:/root/workdir multiarch/alpine:aarch64-edge /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
|
||||
before_deploy:
|
||||
- mv subconverter_linux64.tar.gz subconverter_aarch64.tar.gz
|
||||
deploy:
|
||||
|
||||
32
README-cn.md
32
README-cn.md
@@ -7,6 +7,14 @@
|
||||
[](https://github.com/tindy2013/subconverter/releases)
|
||||
[](https://github.com/tindy2013/subconverter/blob/master/LICENSE)
|
||||
|
||||
---
|
||||
|
||||
**新增内容**
|
||||
|
||||
2020/03/02 添加 [进阶链接](#进阶链接) 中关于 `append_type` `append_info` `expand` `dev_id` `interval` `strict` 等参数的描述
|
||||
|
||||
---
|
||||
|
||||
- [subconverter](#subconverter)
|
||||
- [支持类型](#支持类型)
|
||||
- [简易用法](#简易用法)
|
||||
@@ -207,18 +215,24 @@ http://127.0.0.1:25500/sub?target=%TARGET%&url=%URL%&emoji=%EMOJI%····
|
||||
| target | 必要 | surge&ver=4 | 指想要生成的配置类型,详见上方 [支持类型](#支持类型) 中的参数 |
|
||||
| url | 可选 | https%3A%2F%2Fwww.xxx.com | 指机场所提供的订阅链接,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,**可选的前提是在 `default_url` 中进行指定**。也可以使用 data URI |
|
||||
| config | 可选 | https%3A%2F%2Fwww.xxx.com | 指远程 `pref.ini` (包含分组和规则部分),需要经过 [URLEncode](https://www.urlencoder.org/) 处理,可查看 [示例仓库](https://github.com/lzdnico/subconverteriniexample) 寻找灵感,默认加载本地设置文件 |
|
||||
| upload | 可选 | true / false | 指将生成的订阅文件上传至 `Gist`,需要填写`gistconf.ini`,默认为 false (即不上传) |
|
||||
| upload_path | 可选 | MySS.yaml | 指将生成的订阅文件上传至 `Gist` 后的名称,需要经过 [URLEncode](https://www.urlencoder.org/) 处理 |
|
||||
| emoji | 可选 | true / false | 指在节点名称前加入 Emoji,默认为 true |
|
||||
| group | 可选 | MySS | 指设置该订阅的组名,多用于 SSD/SSR |
|
||||
| tfo | 可选 | true / false | 指开启该订阅链接的 TCP Fast Open,默认为 false |
|
||||
| udp | 可选 | true / false | 指开启该订阅链接的 UDP,默认为 false |
|
||||
| scv | 可选 | true / false | 指关闭 TLS 节点的证书检查,默认为 false |
|
||||
| list | 可选 | true / false | 指输出 Surge Node List 或者 Clash Proxy Provider 或者 Quantumult (X) 的节点订阅 或者 解码后的 SIP002 |
|
||||
| sort | 可选 | true / false | 指对输出的节点或策略组进行再次排序,默认为 false |
|
||||
| upload | 可选 | true / false | 用于将生成的订阅文件上传至 `Gist`,需要填写`gistconf.ini`,默认为 false (即不上传) |
|
||||
| upload_path | 可选 | MySS.yaml | 用于将生成的订阅文件上传至 `Gist` 后的名称,需要经过 [URLEncode](https://www.urlencoder.org/) 处理 |
|
||||
| emoji | 可选 | true / false | 用于在节点名称前加入 Emoji,默认为 true |
|
||||
| group | 可选 | MySS | 用于设置该订阅的组名,多用于 SSD/SSR |
|
||||
| tfo | 可选 | true / false | 用于开启该订阅链接的 TCP Fast Open,默认为 false |
|
||||
| udp | 可选 | true / false | 用于开启该订阅链接的 UDP,默认为 false |
|
||||
| scv | 可选 | true / false | 用于关闭 TLS 节点的证书检查,默认为 false |
|
||||
| list | 可选 | true / false | 用于输出 Surge Node List 或者 Clash Proxy Provider 或者 Quantumult (X) 的节点订阅 或者 解码后的 SIP002 |
|
||||
| sort | 可选 | true / false | 用于对输出的节点或策略组进行再次排序,默认为 false |
|
||||
| include | 可选 | 详见下文中 `include_remarks` | 指仅保留匹配到的节点,支持正则匹配,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,会覆盖配置文件里的设置 |
|
||||
| exclude | 可选 | 详见下文中 `exclude_remarks` | 指排除匹配到的节点,支持正则匹配,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,会覆盖配置文件里的设置 |
|
||||
| filename | 可选 | MySS | 指定该链接生成的配置文件的文件名,可以在 Clash For Windows 等支持文件名的软件中显示出来 |
|
||||
| append_type | 可选 | true / false | 用于在节点名称前插入节点类型,如 [SS],[SSR] 等 |
|
||||
| append_info | 可选 | true / false | 用于输出包含流量或到期信息的节点, 默认为 true,设置为 false 则取消输出 |
|
||||
| expand | 可选 | true / false | 用于在 API 端处理或转换 Surge, QuantumultX 的规则列表,即不将规则全文置入配置文件中,默认为 false,设置为 true 则将规则全文写进配置文件 |
|
||||
| dev_id | 可选 | 92DSAFA | 用于设置 QuantumultX 的远程设备 ID, 以在某些版本上开启远程脚本 |
|
||||
| interval | 可选 | 43200 | 用于设置托管配置更新间隔,确定配置将更新多长时间,单位为秒 |
|
||||
| strict | 可选 | true / false | 如果设置为 true,则 Surge 将在上述间隔后要求强制更新 |
|
||||
|
||||
举个例子:
|
||||
|
||||
|
||||
@@ -11,9 +11,32 @@ curl http://localhost:25500
|
||||
# if you see `subconverter vx.x.x backend` then the container is up and running
|
||||
```
|
||||
|
||||
If you want to update `pref.ini` inside the docker, you can use the following command:
|
||||
If you want to update `pref` configuration inside the docker, you can use the following command:
|
||||
```bash
|
||||
# assume your configuration file name is `newpref.ini`
|
||||
curl -F "@data=newpref.ini" http://localhost:25500/updateconf?type=form&token=password
|
||||
curl -F "@data=newpref.ini" http://localhost:25500/updateconf?type=form\&token=password
|
||||
# you may want to change this token in your configuration file
|
||||
```
|
||||
|
||||
For those who want to use their own `pref` configuration and/or rules, snippets, profiles:
|
||||
```txt
|
||||
# you can save the files you want to replace to a folder, then copy it into to the docker
|
||||
# using the latest build of the official docker
|
||||
FROM tindy2013/subconverter:latest
|
||||
# assume your files are inside replacements/
|
||||
# subconverter folder is located in /base/, which has the same structure as the base/ folder in the repository
|
||||
COPY replacements/ /base/
|
||||
# expose internal port
|
||||
EXPOSE 25500
|
||||
# notice that you still need to use '-p 25500:25500' when starting the docker to forward this port
|
||||
```
|
||||
Save the content above to a `Dockerfile`, then run:
|
||||
```bash
|
||||
# build with this Dockerfile and tag it subconverter-custom
|
||||
docker build -t subconverter-custom:latest .
|
||||
# run the docker detached, forward internal port 25500 to host port 25500
|
||||
docker run -d -p 25500:25500 subconverter-custom:latest
|
||||
# then check its status
|
||||
curl http://localhost:25500
|
||||
# if you see `subconverter vx.x.x backend` then the container is up and running
|
||||
```
|
||||
|
||||
@@ -15,83 +15,78 @@ socks-port: 7891
|
||||
# 允许局域网的连接(可用来共享代理)
|
||||
allow-lan: true
|
||||
|
||||
# 仅在将allow-lan设置为true时适用
|
||||
# #"*": 绑定所有IP地址
|
||||
# #192.168.122.11: 绑定单个IPv4地址
|
||||
# #"[aaaa::a8aa:ff:fe09:57d8]": 绑定单个IPv6地址
|
||||
# bind-address: "*"
|
||||
|
||||
# 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
|
||||
mode: Rule
|
||||
|
||||
# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
|
||||
# 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
|
||||
# 5 个级别:silent / error / warning / info / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
|
||||
log-level: info
|
||||
|
||||
# Clash 的 RESTful API
|
||||
# Clash 的 RESTful API
|
||||
external-controller: '127.0.0.1:9090'
|
||||
|
||||
# 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `RESTful API/ui`
|
||||
# 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `RESTful API/ui`
|
||||
# 参数应填写配置目录的相对路径或绝对路径。
|
||||
# http://127.0.0.1:9090/ui/#/
|
||||
# external-ui: folder
|
||||
#external-ui: dashboard_yacd #yacd面板:https://github.com/haishanh/yacd
|
||||
external-ui: dashboard_Razord #Razord面板:http://clash.razord.top/#/proxies
|
||||
# yacd面板: https://github.com/haishanh/yacd
|
||||
# Razord面板:http://clash.razord.top/#/proxies
|
||||
# external-ui: dashboard
|
||||
|
||||
# RESTful API 的口令 (可选)
|
||||
# secret: ""
|
||||
|
||||
# 实验性功能
|
||||
experimental:
|
||||
ignore-resolve-fail: true # 忽略 DNS 解析失败,默认值为 true
|
||||
# interface-name: en0 # outbound interface name
|
||||
|
||||
# 本地 SOCKS5 / HTTP(S) 服务认证
|
||||
# authentication:
|
||||
# - "user1:pass1"
|
||||
# - "user2:pass2"
|
||||
|
||||
# 实验性功能
|
||||
experimental:
|
||||
ignore-resolve-fail: true # 忽略 DNS 解析失败,默认值为 true
|
||||
|
||||
# 代理组
|
||||
# 下面这3个不要引到订阅里去 要不会出错
|
||||
# Will be ignored after profile selection
|
||||
Proxy:
|
||||
- name: Shadowsocks
|
||||
type: socks5
|
||||
server: 127.0.0.1
|
||||
port: 1080
|
||||
Proxy Group:
|
||||
- name: Proxy
|
||||
type: select
|
||||
proxies:
|
||||
- Shadowsocks
|
||||
Rule:
|
||||
- 'MATCH,DIRECT'
|
||||
# 实验性功能 hosts, 支持通配符 (例如 *.clash.dev 甚至 *.foo.*.example.com)
|
||||
# 静态的域名 比 通配域名 具有更高的优先级 (foo.example.com 优先于 *.example.com)
|
||||
# 注意: hosts 在 fake-ip 模式下不生效
|
||||
#hosts:
|
||||
# '*.clash.dev': 127.0.0.1
|
||||
# 'alpha.clash.dev': '::1'
|
||||
|
||||
#dns:
|
||||
# enable: true
|
||||
# ipv6: false
|
||||
# listen: 0.0.0.0:53
|
||||
# enhanced-mode: redir-host # 模式:redir-host或fake-ip
|
||||
# # fake-ip-range: 198.18.0.1/16 # 如果你不知道这个参数的作用,请勿修改
|
||||
# # 实验性功能 hosts, 支持通配符 (例如 *.clash.dev 甚至 *.foo.*.example.com)
|
||||
# # 静态的域名 比 通配域名 具有更高的优先级 (foo.example.com 优先于 *.example.com)
|
||||
# # 注意: hosts 在 fake-ip 模式下不生效
|
||||
# hosts:
|
||||
# '*.clash.dev': 127.0.0.1
|
||||
# 'alpha.clash.dev': '::1'
|
||||
# nameserver:
|
||||
# - 223.5.5.5 # 阿里DNS
|
||||
# - 180.76.76.76 # 百度DNS
|
||||
# - 119.29.29.29 # 腾讯DNS
|
||||
# - 117.50.10.10 # ONE DNS纯净版
|
||||
# - 114.114.114.114 # 114DNS
|
||||
# fallback:
|
||||
# - 8.8.8.8 # 谷歌DNS
|
||||
# - 1.1.1.1 # Cloudflare DNS
|
||||
# - tls://dns.rubyfish.cn:853
|
||||
# - tls://1.0.0.1:853
|
||||
# - tls://dns.google:853
|
||||
# #- https://dns.rubyfish.cn/dns-query
|
||||
# #- https://cloudflare-dns.com/dns-query
|
||||
# #- https://dns.google/dns-query
|
||||
|
||||
# fallback-filter:
|
||||
# geoip: true # 默认
|
||||
# ipcidr: # 在这个网段内的 IP 地址会被考虑为被污染的 IP
|
||||
# - 240.0.0.0/4
|
||||
#enable: true # 是否启用dns false
|
||||
#ipv6: false
|
||||
#listen: 0.0.0.0:53
|
||||
#enhanced-mode: redir-host # 模式:redir-host或fake-ip
|
||||
#fake-ip-range: 198.18.0.1/16 #
|
||||
#fake-ip-filter: # fake ip 白名单列表,如果你不知道这个参数的作用,请勿修改
|
||||
#- '*.lan'
|
||||
#- localhost.ptlogin2.qq.com
|
||||
#nameserver:
|
||||
#- 223.5.5.5 # 阿里DNS
|
||||
#- 180.76.76.76 # 百度DNS
|
||||
#- 119.29.29.29 # 腾讯DNS
|
||||
#- 117.50.10.10 # ONE DNS纯净版
|
||||
#- 114.114.114.114 # 114DNS
|
||||
#fallback:
|
||||
#- 8.8.8.8 # 谷歌DNS
|
||||
#- 1.1.1.1 # Cloudflare DNS
|
||||
#- tls://dns.rubyfish.cn:853
|
||||
#- tls://1.0.0.1:853
|
||||
#- tls://dns.google:853
|
||||
#- https://dns.rubyfish.cn/dns-query
|
||||
#- https://cloudflare-dns.com/dns-query
|
||||
#- https://dns.google/dns-query
|
||||
#fallback-filter:
|
||||
#geoip: true # 默认
|
||||
#ipcidr: # 在这个网段内的 IP 地址会被考虑为被污染的 IP
|
||||
#- 240.0.0.0/4
|
||||
|
||||
# 1. clash DNS 请求逻辑:
|
||||
# (1) 当访问一个域名时, nameserver 与 fallback 列表内的所有服务器并发请求,得到域名对应的 IP 地址。
|
||||
@@ -111,6 +106,21 @@ Rule:
|
||||
# DoT: 以 tls:// 开头的 DNS 服务器。拥有更高的安全性和查询效率,但端口有可能被管制或封锁。
|
||||
# 若要了解更多关于 DoH/DoT 相关技术,请自行查阅规范文档。
|
||||
|
||||
# 代理组
|
||||
# 下面这3个不要引到订阅里去 要不会出错
|
||||
# Will be ignored after profile selection
|
||||
Proxy:
|
||||
- name: Shadowsocks
|
||||
type: socks5
|
||||
server: 127.0.0.1
|
||||
port: 1080
|
||||
Proxy Group:
|
||||
- name: Proxy
|
||||
type: select
|
||||
proxies:
|
||||
- Shadowsocks
|
||||
Rule:
|
||||
- 'MATCH,DIRECT'
|
||||
|
||||
# Clash for Windows
|
||||
# Proxies module latency test settings
|
||||
@@ -136,16 +146,27 @@ cfw-conn-break-strategy:
|
||||
# Run child process after CFW started
|
||||
# Refer: https://docs.cfw.lbyczf.com/contents/childprocess.html
|
||||
#cfw-child-process:
|
||||
# # 启动订阅转换程序,端口号7893
|
||||
# - command: "subconverter.exe" # run.cmd 程序名称subconverter.exe -cfw >>logs/run.log 2>&1
|
||||
# args:
|
||||
# - "-cfw" # 运行参数1
|
||||
# #- "abcdefghijk" # 运行参数2
|
||||
# options:
|
||||
# cwd: .\subconverter\ # 子进程工作目录
|
||||
# #detached: true # 子进程独立于其父进程运行
|
||||
# #shell: true # 则在 shell 中运行 command
|
||||
# windowsHide: true # 隐藏子进程的控制台窗口
|
||||
# 启动订阅转换程序,端口号7893
|
||||
#- command: "subconverter.exe" # run.cmd 程序名称 subconverter.exe -cfw >>logs/run.log 2>&1
|
||||
#args:
|
||||
#- "-cfw" # 运行参数1
|
||||
#- "-f" # 运行参数2
|
||||
#- "pref-acl4ssr.yml" # 运行参数3
|
||||
#options:
|
||||
#cwd: subconverter # 子进程工作目录
|
||||
#detached: true # 子进程独立于其父进程运行
|
||||
#shell: true # 则在 shell 中运行 command
|
||||
#windowsHide: true # 隐藏子进程的控制台窗口
|
||||
# 启动网易云,端口号3333
|
||||
#- command: "unblockneteasemusic.exe" # 启动网易云,端口号3333
|
||||
#args:
|
||||
#- "-p" # 运行参数1
|
||||
#- "3333" # 运行参数2
|
||||
#options:
|
||||
#cwd: unblockNeteaseMusic # 子进程工作目录
|
||||
#detached: true # 子进程独立于其父进程运行
|
||||
#shell: true # 则在 shell 中运行 command
|
||||
#windowsHide: true # 隐藏子进程的控制台窗口
|
||||
|
||||
# 系统代理跳过列表 cfw-bypass
|
||||
# System proxy will ignore these domains(or ipnet)
|
||||
@@ -232,6 +253,7 @@ cfw-bypass:
|
||||
- "*.aliapp.org"
|
||||
- "*.alibaba.com"
|
||||
- "*.alibabacloud.com"
|
||||
- "*.alibabausercontent.com"
|
||||
- "*.alicdn.com"
|
||||
- "*.aliexpress.com"
|
||||
- "*.aliimg.com"
|
||||
@@ -269,6 +291,7 @@ cfw-bypass:
|
||||
- "*.bcebos.com"
|
||||
- "*.bdimg.com"
|
||||
- "*.bdstatic.com"
|
||||
- "*.bdurl.net"
|
||||
- "*.hao123.com"
|
||||
- "*.hao123img.com"
|
||||
- "*.jomodns.com"
|
||||
@@ -279,8 +302,6 @@ cfw-bypass:
|
||||
- "*.b23.tv"
|
||||
- "*.biliapi.com"
|
||||
- "*.biliapi.net"
|
||||
- "*.bilibili.com"
|
||||
- "*.bilibili.tv"
|
||||
- "*.biligame.com"
|
||||
- "*.biligame.net"
|
||||
- "*.bilivideo.com"
|
||||
@@ -291,8 +312,8 @@ cfw-bypass:
|
||||
- "*.battlenet.com"
|
||||
- "*.blizzard.com"
|
||||
# ByteDance
|
||||
- "*.bytecdn.cn"
|
||||
- "*.bytedance.com"
|
||||
- "*.byteimg.com"
|
||||
- "*.feiliao.com"
|
||||
- "*.gifshow.com"
|
||||
- "*.huoshan.com"
|
||||
@@ -314,6 +335,10 @@ cfw-bypass:
|
||||
- "*.didialift.com"
|
||||
- "*.didiglobal.com"
|
||||
- "*.udache.com"
|
||||
# Douyu 斗鱼
|
||||
- "*.douyu.com"
|
||||
- "*.douyu.tv"
|
||||
- "*.douyutv.com"
|
||||
# Epic
|
||||
- "*.epicgames.com"
|
||||
- "*.helpshift.com"
|
||||
@@ -392,26 +417,22 @@ cfw-bypass:
|
||||
- "*.ydstatic.com"
|
||||
- "*.youdao.com"
|
||||
# PPTV、PPLive
|
||||
- "*.pplive.cn"
|
||||
- "*.pplive.com"
|
||||
- "*.pptv.com"
|
||||
# PDD 拼多多
|
||||
- "*.pinduoduo.com"
|
||||
- "*.yangkeduo.com"
|
||||
# Sina
|
||||
- "*.leju.com"
|
||||
- "*.miaopai.com"
|
||||
- "*.sina.cn"
|
||||
- "*.sina.com"
|
||||
- "*.sina.com.cn"
|
||||
- "*.sinaapp.com"
|
||||
- "*.sinaimg.cn"
|
||||
- "*.sinaimg.com"
|
||||
- "*.sinajs.cn"
|
||||
- "*.t.cn"
|
||||
- "*.weibo.com"
|
||||
- "*.weibocdn.com"
|
||||
- "*.xiaoka.tv"
|
||||
# Sohu Sogo
|
||||
- "*.go2map.com"
|
||||
- "*.itc.cn"
|
||||
- "*.sogo.com"
|
||||
- "*.sogou.com"
|
||||
- "*.sogoucdn.com"
|
||||
@@ -442,25 +463,22 @@ cfw-bypass:
|
||||
- "*.steamcdn-a.akamaihd.net"
|
||||
- "*.steamstat.us"
|
||||
# Tencent
|
||||
- "*.foxmail.com "
|
||||
- "*.gtimg.cn"
|
||||
- "*.foxmail.com"
|
||||
- "*.gtimg.com"
|
||||
- "*.idqqimg.com"
|
||||
- "*.igamecj.com"
|
||||
- "*.myapp.com"
|
||||
- "*.myqcloud.com"
|
||||
- "*.qlogo.cn"
|
||||
- "*.qpic.cn"
|
||||
- "*.qq.com"
|
||||
- "*.qqmail.com"
|
||||
- "*.qqurl.com"
|
||||
- "*.qtimg.cn"
|
||||
- "*.smtcdns.com"
|
||||
- "*.smtcdns.net"
|
||||
- "*.soso.com"
|
||||
- "*.tencent-cloud.net"
|
||||
- "*.tencent.com"
|
||||
- "*.tencentmind.com"
|
||||
- "*.tenpay.com "
|
||||
- "*.tenpay.com"
|
||||
- "*.weixin.com"
|
||||
- "*.weiyun.com"
|
||||
# Vip 唯品会
|
||||
@@ -468,6 +486,9 @@ cfw-bypass:
|
||||
- "*.appvipshop.com"
|
||||
- "*.vip.com"
|
||||
- "*.vipstatic.com"
|
||||
# Ximalaya 喜马拉雅
|
||||
- "*.ximalaya.com"
|
||||
- "*.xmcdn.com"
|
||||
# YYeTs 人人影视
|
||||
- "*.got001.com"
|
||||
- "*.jstucdn.com"
|
||||
@@ -483,6 +504,8 @@ cfw-bypass:
|
||||
- "*.zmzfile.com"
|
||||
# Private Tracker
|
||||
- "*.awesome-hd.me"
|
||||
- "*.beitai.pt"
|
||||
- "*.bittorrent.com"
|
||||
- "*.broadcasthe.net"
|
||||
- "*.chdbits.co"
|
||||
- "*.classix-unlimited.co.uk"
|
||||
@@ -490,34 +513,32 @@ cfw-bypass:
|
||||
- "*.gazellegames.net"
|
||||
- "*.hdchina.org"
|
||||
- "*.hdsky.me"
|
||||
- "*.hdtime.org"
|
||||
- "*.icetorrent.org"
|
||||
- "*.jpopsuki.eu"
|
||||
- "*.keepfrds.com"
|
||||
- "*.leaguehd.com"
|
||||
- "*.m-team.cc"
|
||||
- "*.madsrevolution.net"
|
||||
- "*.msg.vg"
|
||||
- "*.nanyangpt.com"
|
||||
- "*.ncore.cc"
|
||||
- "*.open.cd"
|
||||
- "*.ourbits.club"
|
||||
- "*.passthepopcorn.me"
|
||||
- "*.privatehd.to"
|
||||
- "*.pthome.net"
|
||||
- "*.redacted.ch"
|
||||
- "*.springsunday.net"
|
||||
- "*.tjupt.org"
|
||||
- "*.totheglory.im"
|
||||
- "*.msg.vg"
|
||||
- "*.hdtime.org"
|
||||
- "*.leaguehd.com"
|
||||
- "*.pthome.net"
|
||||
- "*.beitai.pt"
|
||||
# TeamViewer
|
||||
- "*.teamviewer.com"
|
||||
# Public Direct CDN 公共直连cdn
|
||||
- "*.ajax.aspnetcdn.com"
|
||||
- "*.baomitu.com"
|
||||
- "*.bootcss.com"
|
||||
- "*.cdnjs.cloudflare.com"
|
||||
- "*.code.jquery.com"
|
||||
- "*.jiasule.com"
|
||||
- "*.jsdelivr.net"
|
||||
- "*.staticfile.org"
|
||||
- "*.upaiyun.com"
|
||||
# Acceleratedirectsites
|
||||
@@ -527,9 +548,11 @@ cfw-bypass:
|
||||
- "*.360doc.com"
|
||||
- "*.36kr.com"
|
||||
- "*.3dmgame.com"
|
||||
- "*.51cto.com"
|
||||
- "*.51job.com"
|
||||
- "*.51jobcdn.com"
|
||||
- "*.56.com"
|
||||
- "*.8686c.com"
|
||||
- "*.abchina.com"
|
||||
- "*.abercrombie.com"
|
||||
- "*.acfun.tv"
|
||||
@@ -537,8 +560,11 @@ cfw-bypass:
|
||||
- "*.air-matters.io"
|
||||
- "*.aixifan.com"
|
||||
- "*.algocasts.io"
|
||||
- "*.apache.org"
|
||||
- "*.baomitu.com"
|
||||
- "*.babytree.com"
|
||||
- "*.babytreeimg.com"
|
||||
- "*.baicizhan.com"
|
||||
- "*.baidupan.com"
|
||||
- "*.baike.com"
|
||||
- "*.biqudu.com"
|
||||
- "*.biquge.com"
|
||||
- "*.bitauto.com"
|
||||
@@ -554,10 +580,12 @@ cfw-bypass:
|
||||
- "*.cibntv.net"
|
||||
- "*.clouddn.com"
|
||||
- "*.cloudxns.net"
|
||||
- "*.cmfu.com"
|
||||
- "*.cn163.net"
|
||||
- "*.cnbeta.com"
|
||||
- "*.cnbetacdn.com"
|
||||
- "*.cnblogs.com"
|
||||
- "*.cnki.net"
|
||||
- "*.cnmstl.net"
|
||||
- "*.coolapk.com"
|
||||
- "*.coolapkmarket.com"
|
||||
- "*.csdn.net"
|
||||
@@ -568,9 +596,6 @@ cfw-bypass:
|
||||
- "*.dilidili.wang"
|
||||
- "*.douban.com"
|
||||
- "*.doubanio.com"
|
||||
- "*.douyu.com"
|
||||
- "*.douyu.tv"
|
||||
- "*.douyutv.com"
|
||||
- "*.dpfile.com"
|
||||
- "*.duowan.com"
|
||||
- "*.dxycdn.com"
|
||||
@@ -630,6 +655,7 @@ cfw-bypass:
|
||||
- "*.kugou.com"
|
||||
- "*.lancdns.com"
|
||||
- "*.landiannews.com"
|
||||
- "*.lanzou.com"
|
||||
- "*.lemicp.com"
|
||||
- "*.letitfly.me"
|
||||
- "*.linkedin.com"
|
||||
@@ -652,6 +678,7 @@ cfw-bypass:
|
||||
- "*.mogujie.com"
|
||||
- "*.moji.com"
|
||||
- "*.moke.com"
|
||||
- "*.mozilla.org"
|
||||
- "*.mubu.com"
|
||||
- "*.myunlu.com"
|
||||
- "*.nruan.com"
|
||||
@@ -662,7 +689,7 @@ cfw-bypass:
|
||||
- "*.ourdvs.com"
|
||||
- "*.overcast.fm"
|
||||
- "*.paypal.com"
|
||||
- "*.pptv.com"
|
||||
- "*.polyv.net"
|
||||
- "*.qbox.me"
|
||||
- "*.qcloud.com"
|
||||
- "*.qcloudcdn.com"
|
||||
@@ -684,13 +711,14 @@ cfw-bypass:
|
||||
- "*.repaik.com"
|
||||
- "*.rrmj.tv"
|
||||
- "*.ruguoapp.com"
|
||||
- "*.runoob.com"
|
||||
- "*.sandai.net"
|
||||
- "*.sankuai.com"
|
||||
- "*.segmentfault.com"
|
||||
- "*.sf-express.com"
|
||||
- "*.shumilou.net"
|
||||
- "*.simplecd.me"
|
||||
- "*.sm.ms"
|
||||
- "*.smtcdns.net"
|
||||
- "*.smzdm.com"
|
||||
- "*.snwx.com"
|
||||
- "*.soufunimg.com"
|
||||
@@ -699,7 +727,6 @@ cfw-bypass:
|
||||
- "*.startssl.com"
|
||||
- "*.suning.com"
|
||||
- "*.taihe.com"
|
||||
- "*.tenpay.com"
|
||||
- "*.th-sjy.com"
|
||||
- "*.tianqi.com"
|
||||
- "*.tianqistatic.com"
|
||||
@@ -713,9 +740,10 @@ cfw-bypass:
|
||||
- "*.tudou.com"
|
||||
- "*.tuniu.com"
|
||||
- "*.tuniucdn.com"
|
||||
- "*.umengcloud.com"
|
||||
- "*.upyun.com"
|
||||
- "*.uxengine.net"
|
||||
- "*.v2ex.com"
|
||||
- "*.videocc.net"
|
||||
- "*.vmware.com"
|
||||
- "*.wandoujia.com"
|
||||
- "*.weather.com"
|
||||
@@ -724,19 +752,19 @@ cfw-bypass:
|
||||
- "*.weiphone.com"
|
||||
- "*.weiphone.net"
|
||||
- "*.womai.com"
|
||||
- "*.wscdns.com"
|
||||
- "*.xdrig.com"
|
||||
- "*.xhscdn.com"
|
||||
- "*.xiachufang.com"
|
||||
- "*.xiaohongshu.com"
|
||||
- "*.xiaojukeji.com"
|
||||
- "*.ximalaya.com"
|
||||
- "*.xinhuanet.com"
|
||||
- "*.xitek.com"
|
||||
- "*.xiumi.us"
|
||||
- "*.xmcdn.com"
|
||||
- "*.xslb.net"
|
||||
- "*.xueqiu.com"
|
||||
- "*.xunlei.com"
|
||||
- "*.yach.me"
|
||||
- "*.yangkeduo.com"
|
||||
- "*.yeepay.com"
|
||||
- "*.yhd.com"
|
||||
- "*.yihaodianimg.com"
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,rules/ACL4SSR/Clash/Microsoft.list
|
||||
surge_ruleset=🍎 苹果服务,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -30,7 +30,7 @@ custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🚀 中国代理,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=🎯 全球直连,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ProxyGFWlist.list
|
||||
surge_ruleset=🚀 中国代理,rules/ACL4SSR/Clash/ChinaIp.list
|
||||
surge_ruleset=🚀 中国代理,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🚀 中国代理,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🚀 中国代理,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -24,7 +24,7 @@ surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
custom_proxy_group=🚀 中国代理`select`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 中国代理`[]🎯 全球直连`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
30
base/config/ACL4SSR_Mini.ini
Normal file
30
base/config/ACL4SSR_Mini.ini
Normal file
@@ -0,0 +1,30 @@
|
||||
[custom]
|
||||
;不要随意改变关键字,否则会导致出错
|
||||
;acl4SSR规则
|
||||
|
||||
;去广告:支持
|
||||
;自动测速:支持
|
||||
;微软分流:不支持
|
||||
;苹果分流:不支持
|
||||
;增强中国IP段:不支持
|
||||
;增强国外GFW:不支持
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
|
||||
custom_proxy_group=🚀 节点选择`select`[]♻️ 自动选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
overwrite_original_rules=true
|
||||
31
base/config/ACL4SSR_Mini_Fallback.ini
Normal file
31
base/config/ACL4SSR_Mini_Fallback.ini
Normal file
@@ -0,0 +1,31 @@
|
||||
[custom]
|
||||
;不要随意改变关键字,否则会导致出错
|
||||
;acl4SSR规则
|
||||
|
||||
;去广告:支持
|
||||
;自动测速:支持
|
||||
;微软分流:不支持
|
||||
;苹果分流:不支持
|
||||
;增强中国IP段:不支持
|
||||
;增强国外GFW:不支持
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
|
||||
custom_proxy_group=🚀 节点选择`select`[]♻️ 自动选择`[]🔯 故障转移`[]🎯 全球直连`.*
|
||||
custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🔯 故障转移`fallback`.*`http://www.gstatic.com/generate_204`180
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`[]🔯 故障转移`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
overwrite_original_rules=true
|
||||
@@ -11,13 +11,13 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,rules/ACL4SSR/Clash/Microsoft.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -29,7 +29,7 @@ custom_proxy_group=📲 电报信息`select`[]🚀 节点选择`[]🎯 全球直
|
||||
custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点选择`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,rules/ACL4SSR/Clash/Microsoft.list
|
||||
surge_ruleset=🍎 苹果服务,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -29,7 +29,7 @@ custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,rules/ACL4SSR/Clash/Microsoft.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -28,7 +28,7 @@ custom_proxy_group=📲 电报信息`select`[]🚀 节点选择`[]🎯 全球直
|
||||
custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点选择`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -26,7 +26,7 @@ custom_proxy_group=🌍 国外媒体`select`[]🚀 节点选择`[]🎯 全球直
|
||||
custom_proxy_group=📲 电报信息`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🍎 苹果服务,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -28,7 +28,7 @@ custom_proxy_group=📲 电报信息`select`[]🚀 节点选择`[]🎯 全球直
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Microsoft.list
|
||||
surge_ruleset=🍎 苹果服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -30,7 +30,7 @@ custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
62
base/config/ACL4SSR_Online_Full.ini
Normal file
62
base/config/ACL4SSR_Online_Full.ini
Normal file
@@ -0,0 +1,62 @@
|
||||
[custom]
|
||||
;不要随意改变关键字,否则会导致出错
|
||||
;acl4SSR规则
|
||||
|
||||
;去广告:支持
|
||||
;自动测速:支持
|
||||
;微软分流:支持
|
||||
;苹果分流:支持
|
||||
;增强中国IP段:支持
|
||||
;增强国外GFW:支持
|
||||
|
||||
;设置规则标志位
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 广告拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanAD.list
|
||||
surge_ruleset=🍃 应用净化,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软云盘,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/OneDrive.list
|
||||
surge_ruleset=🍎 苹果服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list
|
||||
surge_ruleset=📲 电报消息,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Telegram.list
|
||||
surge_ruleset=📹 油管视频,https://raw.githubusercontent.com/lhie1/Rules/master/Surge/Surge%203/Provider/Media/YouTube.list
|
||||
surge_ruleset=🎥 奈飞视频,https://raw.githubusercontent.com/lhie1/Rules/master/Surge/Surge%203/Provider/Media/Netflix.list
|
||||
surge_ruleset=📺 巴哈姆特,https://raw.githubusercontent.com/lhie1/Rules/master/Surge/Surge%203/Provider/Media/Bahamut.list
|
||||
surge_ruleset=🌏 亚洲媒体,https://raw.githubusercontent.com/lhie1/Rules/master/Surge/Surge%203/Provider/AsianTV.list
|
||||
surge_ruleset=🌍 国外媒体,https://raw.githubusercontent.com/lhie1/Rules/master/Surge/Surge%203/Provider/GlobalTV.list
|
||||
surge_ruleset=🔰 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyGFWlist.list
|
||||
;surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaIp.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Download.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
;设置规则标志位
|
||||
|
||||
;设置分组标志位
|
||||
custom_proxy_group=🔰 节点选择`select`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🚀 手动切换`[]DIRECT
|
||||
custom_proxy_group=🚀 手动切换`select`.*
|
||||
custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=📲 电报消息`select`[]🔰 节点选择`[]♻️ 自动选择`[]🇸🇬 狮城节点`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🚀 手动切换`[]DIRECT
|
||||
custom_proxy_group=📹 油管视频`select`[]🔰 节点选择`[]♻️ 自动选择`[]🇸🇬 狮城节点`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🚀 手动切换`[]DIRECT
|
||||
custom_proxy_group=🎥 奈飞视频`select`[]🎥 奈飞节点`[]🚀 手动切换`[]DIRECT
|
||||
custom_proxy_group=📺 巴哈姆特`select`[]🇨🇳 台湾节点`[]🔰 节点选择`[]🚀 手动切换`[]DIRECT
|
||||
custom_proxy_group=🌍 国外媒体`select`[]🔰 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🚀 手动切换`[]DIRECT
|
||||
custom_proxy_group=🌏 亚洲媒体`select`[]DIRECT`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🚀 手动切换
|
||||
custom_proxy_group=Ⓜ️ 微软云盘`select`[]DIRECT`[]🔰 节点选择`[]🇺🇲 美国节点`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🚀 手动切换
|
||||
custom_proxy_group=🍎 苹果服务`select`[]DIRECT`[]🔰 节点选择`[]🇺🇲 美国节点`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🚀 手动切换
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT`[]🔰 节点选择`[]♻️ 自动选择
|
||||
custom_proxy_group=🛑 广告拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🔰 节点选择`[]♻️ 自动选择`[]DIRECT`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🚀 手动切换
|
||||
custom_proxy_group=🇭🇰 香港节点`url-test`(港|HK)`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🇨🇳 台湾节点`url-test`(台|新北|彰化|TW)`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🇸🇬 狮城节点`url-test`(新加坡|坡|狮城|SG)`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🇯🇵 日本节点`url-test`(日本|川日|东京|大阪|泉日|埼玉|沪日|深日|JP)`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🇺🇲 美国节点`url-test`(美|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|US)`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🎥 奈飞节点`select`(NF|解锁|Netflix|NETFLIX)
|
||||
;设置分组标志位
|
||||
|
||||
enable_rule_generator=true
|
||||
overwrite_original_rules=true
|
||||
|
||||
clash_rule_base=https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/GeneralClashConfig.yml
|
||||
|
||||
;luck
|
||||
30
base/config/ACL4SSR_Online_Mini.ini
Normal file
30
base/config/ACL4SSR_Online_Mini.ini
Normal file
@@ -0,0 +1,30 @@
|
||||
[custom]
|
||||
;不要随意改变关键字,否则会导致出错
|
||||
;acl4SSR规则-在线版
|
||||
|
||||
;去广告:支持
|
||||
;自动测速:支持
|
||||
;微软分流:不支持
|
||||
;苹果分流:不支持
|
||||
;增强中国IP段:不支持
|
||||
;增强国外GFW:不支持
|
||||
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanAD.list
|
||||
surge_ruleset=🛑 全球拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
|
||||
custom_proxy_group=🚀 节点选择`select`[]♻️ 自动选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
overwrite_original_rules=true
|
||||
31
base/config/ACL4SSR_Online_Mini_Fallback.ini
Normal file
31
base/config/ACL4SSR_Online_Mini_Fallback.ini
Normal file
@@ -0,0 +1,31 @@
|
||||
[custom]
|
||||
;不要随意改变关键字,否则会导致出错
|
||||
;acl4SSR规则-在线版
|
||||
|
||||
;去广告:支持
|
||||
;自动测速:支持
|
||||
;微软分流:不支持
|
||||
;苹果分流:不支持
|
||||
;增强中国IP段:不支持
|
||||
;增强国外GFW:不支持
|
||||
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanAD.list
|
||||
surge_ruleset=🛑 全球拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=🚀 节点选择,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
|
||||
custom_proxy_group=🚀 节点选择`select`[]♻️ 自动选择`[]🔯 故障转移`[]🎯 全球直连`.*
|
||||
custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🔯 故障转移`fallback`.*`http://www.gstatic.com/generate_204`180
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`[]🔯 故障转移`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
overwrite_original_rules=true
|
||||
@@ -11,13 +11,13 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Microsoft.list
|
||||
surge_ruleset=🍎 苹果服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -29,7 +29,7 @@ custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
@@ -12,14 +12,14 @@
|
||||
;设置规则标志位
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,rules/ACL4SSR/Clash/Microsoft.list
|
||||
surge_ruleset=🍎 苹果服务,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyLite.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaIp.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
|
||||
@@ -31,7 +31,7 @@ custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,rules/ACL4SSR/Clash/Microsoft.list
|
||||
surge_ruleset=🍎 苹果服务,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyGFWlist.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaIp.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -31,7 +31,7 @@ custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/LocalAreaNetwork.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ACL4SSR/Clash/BanAD.list
|
||||
surge_ruleset=⛔ 应用拦截,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🍃 应用净化,rules/ACL4SSR/Clash/BanProgramAD.list
|
||||
surge_ruleset=Ⓜ️ 微软服务,rules/ACL4SSR/Clash/Microsoft.list
|
||||
surge_ruleset=🍎 苹果服务,rules/ACL4SSR/Clash/Apple.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
surge_ruleset=🚀 节点选择,rules/ACL4SSR/Clash/ProxyGFWlist.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaDomain.list
|
||||
surge_ruleset=🎯 全球直连,rules/ACL4SSR/Clash/ChinaCompanyIp.list
|
||||
surge_ruleset=🎯 全球直连,[]GEOIP,CN
|
||||
surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
@@ -30,7 +30,7 @@ custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🚀 节点
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🚀 节点选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=⛔ 应用拦截`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT
|
||||
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
|
||||
enable_rule_generator=true
|
||||
|
||||
@@ -52,6 +52,6 @@ clash_rule_base=base/forcerule.yml
|
||||
;emoji=(流量|时间|应急),🏳️🌈
|
||||
;emoji=阿根廷,🇦🇷
|
||||
|
||||
;Optims for filtering nodes
|
||||
;Options for filtering nodes
|
||||
;include_remarks=
|
||||
;exclude_remarks=
|
||||
|
||||
9
base/generate.ini
Normal file
9
base/generate.ini
Normal file
@@ -0,0 +1,9 @@
|
||||
[test]
|
||||
path=output.conf
|
||||
target=surge
|
||||
ver=4
|
||||
url=ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpwYXNzd29yZA@www.example.com:1080#Example
|
||||
|
||||
[test_profile]
|
||||
path=output.yml
|
||||
profile=profiles/example_profile.ini
|
||||
@@ -19,13 +19,16 @@ common:
|
||||
|
||||
userinfo:
|
||||
stream_rule:
|
||||
- {match: "^剩余流量:(.*?)\\|总流量:(.*)$", replace: "total=$2&left=$1"}
|
||||
- {match: "^剩余流量:(.*?) (.*)$", replace: "total=$1&left=$2"}
|
||||
- {match: "^Bandwidth: (.*?)/(.*)$", replace: "used=$1&total=$2"}
|
||||
- {match: "^.*剩余(.*?)(?:\\s*?)@(?:.*)$", replace: "total=$1"}
|
||||
- {match: "^.*?流量:(.*?) 剩:(?:.*)$", replace: "total=$1"}
|
||||
time_rule:
|
||||
- {match: "^过期时间:(\\d+)-(\\d+)-(\\d+) (\\d+):(\\d+):(\\d+)$", replace: "$1:$2:$3:$4:$5:$6"}
|
||||
- {match: "^到期时间:(\\d+)-(\\d+)-(\\d+)$", replace: "$1:$2:$3:0:0:0"}
|
||||
- {match: "^到期时间(:|:)(\\d+)-(\\d+)-(\\d+)$", replace: "$1:$2:$3:0:0:0"}
|
||||
- {match: "^Smart Access expire: (\\d+)/(\\d+)/(\\d+)$", replace: "$1:$2:$3:0:0:0"}
|
||||
- {match: "^.*?流量:(?:.*?) 剩:(.*?)天$", replace: "left=$1d"}
|
||||
|
||||
node_pref:
|
||||
udp_flag: false
|
||||
@@ -78,6 +81,7 @@ server:
|
||||
port: 25500
|
||||
|
||||
advanced:
|
||||
log_level: info
|
||||
print_debug_info: false
|
||||
max_pending_connections: 10240
|
||||
max_concurrent_threads: 2
|
||||
|
||||
@@ -52,16 +52,19 @@ append_proxy_type=false
|
||||
;Rules to extract stream data from node
|
||||
;Format: full_match_regex|new_format_regex
|
||||
;where new_format_regex should be like "total=$1&left=$2&used=$3"
|
||||
stream_rule=^剩余流量:(.*?)\|总流量:(.*)$|total=$2&left=$1
|
||||
stream_rule=^剩余流量:(.*?) (.*)$|total=$1&left=$2
|
||||
stream_rule=^Bandwidth: (.*?)/(.*)$|used=$1&total=$2
|
||||
stream_rule=^\[.*?\]剩余(.*?)@(?:.*)$|total=$1
|
||||
stream_rule=^.*?流量:(.*?) 剩:(?:.*)$|total=$1
|
||||
|
||||
;Rules to extract expire time data from node
|
||||
;Format: full_match_regex|new_format_regex
|
||||
;where new_format_regex should follow this example: yyyy:mm:dd:hh:mm:ss
|
||||
time_rule=^过期时间:(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$|$1:$2:$3:$4:$5:$6
|
||||
time_rule=^到期时间:(\d+)-(\d+)-(\d+)$|$1:$2:$3:0:0:0
|
||||
time_rule=^到期时间(:|:)(\d+)-(\d+)-(\d+)$|$1:$2:$3:0:0:0
|
||||
time_rule=^Smart Access expire: (\d+)/(\d+)/(\d+)$|$1:$2:$3:0:0:0
|
||||
time_rule=^.*?流量:(?:.*?) 剩:(.*)$|left=$1d
|
||||
|
||||
[node_pref]
|
||||
udp_flag=false
|
||||
@@ -164,6 +167,7 @@ listen=0.0.0.0
|
||||
port=25500
|
||||
|
||||
[advanced]
|
||||
log_level=info
|
||||
print_debug_info=false
|
||||
max_pending_connections=10240
|
||||
max_concurrent_threads=2
|
||||
|
||||
@@ -30,7 +30,6 @@ DOMAIN-KEYWORD,supersonicads
|
||||
DOMAIN-KEYWORD,tracking
|
||||
DOMAIN-KEYWORD,traffic
|
||||
DOMAIN-KEYWORD,uedas
|
||||
DOMAIN-KEYWORD,umeng
|
||||
DOMAIN-KEYWORD,usage
|
||||
DOMAIN-KEYWORD,wlmonitor
|
||||
DOMAIN-KEYWORD,zjtoolbar
|
||||
@@ -68,6 +67,7 @@ DOMAIN-SUFFIX,2cnt.net
|
||||
DOMAIN-SUFFIX,3gmimo.com
|
||||
DOMAIN-SUFFIX,3xx.vip
|
||||
DOMAIN-SUFFIX,51.la
|
||||
DOMAIN-SUFFIX,51taifu.com
|
||||
DOMAIN-SUFFIX,51yes.com
|
||||
DOMAIN-SUFFIX,600ad.com
|
||||
DOMAIN-SUFFIX,6dad.com
|
||||
@@ -82,6 +82,7 @@ DOMAIN-SUFFIX,a3p4.net
|
||||
DOMAIN-SUFFIX,acs86.com
|
||||
DOMAIN-SUFFIX,acxiom-online.com
|
||||
DOMAIN-SUFFIX,ad-brix.com
|
||||
DOMAIN-SUFFIX,ad-delivery.net
|
||||
DOMAIN-SUFFIX,ad-locus.com
|
||||
DOMAIN-SUFFIX,ad-plus.cn
|
||||
DOMAIN-SUFFIX,ad7.com
|
||||
@@ -102,6 +103,7 @@ DOMAIN-SUFFIX,adjust.io
|
||||
DOMAIN-SUFFIX,adkmob.com
|
||||
DOMAIN-SUFFIX,adlive.cn
|
||||
DOMAIN-SUFFIX,adlocus.com
|
||||
DOMAIN-SUFFIX,admaji.com
|
||||
DOMAIN-SUFFIX,admin6.com
|
||||
DOMAIN-SUFFIX,admon.cn
|
||||
DOMAIN-SUFFIX,adnyg.com
|
||||
@@ -122,6 +124,7 @@ DOMAIN-SUFFIX,aduu.cn
|
||||
DOMAIN-SUFFIX,advertising.com
|
||||
DOMAIN-SUFFIX,adview.cn
|
||||
DOMAIN-SUFFIX,advmob.cn
|
||||
DOMAIN-SUFFIX,adwetec.com
|
||||
DOMAIN-SUFFIX,adwhirl.com
|
||||
DOMAIN-SUFFIX,adwo.com
|
||||
DOMAIN-SUFFIX,adxmi.com
|
||||
@@ -167,6 +170,7 @@ DOMAIN-SUFFIX,btyou.com
|
||||
DOMAIN-SUFFIX,bugtags.com
|
||||
DOMAIN-SUFFIX,buysellads.com
|
||||
DOMAIN-SUFFIX,c0563.com
|
||||
DOMAIN-SUFFIX,cacafly.com
|
||||
DOMAIN-SUFFIX,casee.cn
|
||||
DOMAIN-SUFFIX,cdnmaster.com
|
||||
DOMAIN-SUFFIX,chance-ad.com
|
||||
@@ -185,6 +189,7 @@ DOMAIN-SUFFIX,cnxad.com
|
||||
DOMAIN-SUFFIX,cnzz.com
|
||||
DOMAIN-SUFFIX,cnzzlink.com
|
||||
DOMAIN-SUFFIX,cocounion.com
|
||||
DOMAIN-SUFFIX,coocaatv.com
|
||||
DOMAIN-SUFFIX,cooguo.com
|
||||
DOMAIN-SUFFIX,coolguang.com
|
||||
DOMAIN-SUFFIX,coremetrics.com
|
||||
@@ -217,10 +222,12 @@ DOMAIN-SUFFIX,emarbox.com
|
||||
DOMAIN-SUFFIX,epsilon.com
|
||||
DOMAIN-SUFFIX,exosrv.com
|
||||
DOMAIN-SUFFIX,fancyapi.com
|
||||
DOMAIN-SUFFIX,feitian001.com
|
||||
DOMAIN-SUFFIX,feixin2.com
|
||||
DOMAIN-SUFFIX,flashtalking.com
|
||||
DOMAIN-SUFFIX,fraudmetrix.cn
|
||||
DOMAIN-SUFFIX,gentags.net
|
||||
DOMAIN-SUFFIX,gepush.com
|
||||
DOMAIN-SUFFIX,getui.com
|
||||
DOMAIN-SUFFIX,glispa.com
|
||||
DOMAIN-SUFFIX,go-mpulse
|
||||
@@ -288,6 +295,7 @@ DOMAIN-SUFFIX,mbai.cn
|
||||
DOMAIN-SUFFIX,mediaplex.com
|
||||
DOMAIN-SUFFIX,mediav.com
|
||||
DOMAIN-SUFFIX,megajoy.com
|
||||
DOMAIN-SUFFIX,meiqia.com
|
||||
DOMAIN-SUFFIX,mgogo.com
|
||||
DOMAIN-SUFFIX,miaozhen.com
|
||||
DOMAIN-SUFFIX,microad-cn.com
|
||||
@@ -388,7 +396,6 @@ DOMAIN-SUFFIX,ujian.cc
|
||||
DOMAIN-SUFFIX,ukeiae.com
|
||||
DOMAIN-SUFFIX,umeng.co
|
||||
DOMAIN-SUFFIX,umeng.com
|
||||
DOMAIN-SUFFIX,umengcloud.com
|
||||
DOMAIN-SUFFIX,umtrack.com
|
||||
DOMAIN-SUFFIX,unimhk.com
|
||||
DOMAIN-SUFFIX,union-wifi.com
|
||||
@@ -396,7 +403,6 @@ DOMAIN-SUFFIX,union001.com
|
||||
DOMAIN-SUFFIX,unionsy.com
|
||||
DOMAIN-SUFFIX,unlitui.com
|
||||
DOMAIN-SUFFIX,uri6.com
|
||||
DOMAIN-SUFFIX,userstyles.org
|
||||
DOMAIN-SUFFIX,ushaqi.com
|
||||
DOMAIN-SUFFIX,usingde.com
|
||||
DOMAIN-SUFFIX,uuzu.com
|
||||
@@ -453,6 +459,7 @@ DOMAIN-SUFFIX,zqzxz.com
|
||||
DOMAIN-SUFFIX,zzsx8.com
|
||||
|
||||
# 广告联盟-国外****************
|
||||
DOMAIN-SUFFIX,acuityplatform.com
|
||||
DOMAIN-SUFFIX,ad-stir.com
|
||||
DOMAIN-SUFFIX,ad-survey.com
|
||||
DOMAIN-SUFFIX,ad4game.com
|
||||
@@ -460,19 +467,25 @@ DOMAIN-SUFFIX,adcloud.jp
|
||||
DOMAIN-SUFFIX,adcolony.com
|
||||
DOMAIN-SUFFIX,addthis.com
|
||||
DOMAIN-SUFFIX,adfurikun.jp
|
||||
DOMAIN-SUFFIX,adhigh.net
|
||||
DOMAIN-SUFFIX,adhood.com
|
||||
DOMAIN-SUFFIX,adinall.com
|
||||
DOMAIN-SUFFIX,adition.com
|
||||
DOMAIN-SUFFIX,adk2x.com
|
||||
DOMAIN-SUFFIX,admarket.mobi
|
||||
DOMAIN-SUFFIX,admarvel.com
|
||||
DOMAIN-SUFFIX,admedia.com
|
||||
DOMAIN-SUFFIX,adnxs.com
|
||||
DOMAIN-SUFFIX,adotmob.com
|
||||
DOMAIN-SUFFIX,adperium.com
|
||||
DOMAIN-SUFFIX,adriver.ru
|
||||
DOMAIN-SUFFIX,adroll.com
|
||||
DOMAIN-SUFFIX,adsco.re
|
||||
DOMAIN-SUFFIX,adservice.com
|
||||
DOMAIN-SUFFIX,adsrvr.org
|
||||
DOMAIN-SUFFIX,adsymptotic.com
|
||||
DOMAIN-SUFFIX,adtaily.com
|
||||
DOMAIN-SUFFIX,adtech.de
|
||||
DOMAIN-SUFFIX,adtechjp.com
|
||||
DOMAIN-SUFFIX,adtechus.com
|
||||
DOMAIN-SUFFIX,airpush.com
|
||||
@@ -487,23 +500,34 @@ DOMAIN-SUFFIX,awempire.com
|
||||
DOMAIN-SUFFIX,axonix.com
|
||||
DOMAIN-SUFFIX,beintoo.com
|
||||
DOMAIN-SUFFIX,bepolite.eu
|
||||
DOMAIN-SUFFIX,bidtheatre.com
|
||||
DOMAIN-SUFFIX,bidvertiser.com
|
||||
DOMAIN-SUFFIX,blismedia.com
|
||||
DOMAIN-SUFFIX,brucelead.com
|
||||
DOMAIN-SUFFIX,bttrack.com
|
||||
DOMAIN-SUFFIX,casalemedia.com
|
||||
DOMAIN-SUFFIX,channeladvisor.com
|
||||
DOMAIN-SUFFIX,connexity.net
|
||||
DOMAIN-SUFFIX,criteo.com
|
||||
DOMAIN-SUFFIX,criteo.net
|
||||
DOMAIN-SUFFIX,csbew.com
|
||||
DOMAIN-SUFFIX,demdex.net
|
||||
DOMAIN-SUFFIX,directrev.com
|
||||
DOMAIN-SUFFIX,dumedia.ru
|
||||
DOMAIN-SUFFIX,effectivemeasure.com
|
||||
DOMAIN-SUFFIX,effectivemeasure.net
|
||||
DOMAIN-SUFFIX,eqads.com
|
||||
DOMAIN-SUFFIX,everesttech.net
|
||||
DOMAIN-SUFFIX,exoclick.com
|
||||
DOMAIN-SUFFIX,extend.tv
|
||||
DOMAIN-SUFFIX,eyereturn.com
|
||||
DOMAIN-SUFFIX,fastapi.net
|
||||
DOMAIN-SUFFIX,fastclick.com
|
||||
DOMAIN-SUFFIX,fastclick.net
|
||||
DOMAIN-SUFFIX,flurry.com
|
||||
DOMAIN-SUFFIX,gosquared.com
|
||||
DOMAIN-SUFFIX,gtags.net
|
||||
DOMAIN-SUFFIX,guomob.com
|
||||
DOMAIN-SUFFIX,heyzap.com
|
||||
DOMAIN-SUFFIX,histats.com
|
||||
DOMAIN-SUFFIX,hitslink.com
|
||||
@@ -512,7 +536,9 @@ DOMAIN-SUFFIX,hyperpromote.com
|
||||
DOMAIN-SUFFIX,i-mobile.co.jp
|
||||
DOMAIN-SUFFIX,imrworldwide.com
|
||||
DOMAIN-SUFFIX,inmobi.com
|
||||
DOMAIN-SUFFIX,intentiq.com
|
||||
DOMAIN-SUFFIX,inter1ads.com
|
||||
DOMAIN-SUFFIX,ipredictive.com
|
||||
DOMAIN-SUFFIX,ironsrc.com
|
||||
DOMAIN-SUFFIX,iskyworker.com
|
||||
DOMAIN-SUFFIX,jizzads.com
|
||||
@@ -534,18 +560,21 @@ DOMAIN-SUFFIX,meetrics.com
|
||||
DOMAIN-SUFFIX,meetrics.net
|
||||
DOMAIN-SUFFIX,mgid.com
|
||||
DOMAIN-SUFFIX,millennialmedia.com
|
||||
DOMAIN-SUFFIX,moatads .com
|
||||
DOMAIN-SUFFIX,mobadme.jp
|
||||
DOMAIN-SUFFIX,mobfox.com
|
||||
DOMAIN-SUFFIX,mobileadtrading.com
|
||||
DOMAIN-SUFFIX,mobilityware.com
|
||||
DOMAIN-SUFFIX,mookie1.com
|
||||
DOMAIN-SUFFIX,msads.net
|
||||
DOMAIN-SUFFIX,mydas.mobi
|
||||
DOMAIN-SUFFIX,nend.net
|
||||
DOMAIN-SUFFIX,netshelter.net
|
||||
DOMAIN-SUFFIX,nexage.com
|
||||
DOMAIN-SUFFIX,owneriq.net
|
||||
DOMAIN-SUFFIX,pixels.asia
|
||||
DOMAIN-SUFFIX,plista.com
|
||||
DOMAIN-SUFFIX,popads.net
|
||||
DOMAIN-SUFFIX,powerlinks.com
|
||||
DOMAIN-SUFFIX,propellerads.com
|
||||
DOMAIN-SUFFIX,quantserve.com
|
||||
DOMAIN-SUFFIX,rayjump.com
|
||||
@@ -564,10 +593,12 @@ DOMAIN-SUFFIX,startapp.com
|
||||
DOMAIN-SUFFIX,startappexchange.com
|
||||
DOMAIN-SUFFIX,statcounter.com
|
||||
DOMAIN-SUFFIX,steelhousemedia.com
|
||||
DOMAIN-SUFFIX,stickyadstv.com
|
||||
DOMAIN-SUFFIX,supersonic.com
|
||||
DOMAIN-SUFFIX,tapjoy.com
|
||||
DOMAIN-SUFFIX,tapjoyads.com
|
||||
DOMAIN-SUFFIX,trafficjunky.com
|
||||
DOMAIN-SUFFIX,tribalfusion.com
|
||||
DOMAIN-SUFFIX,turn.com
|
||||
DOMAIN-SUFFIX,vidoomy.com
|
||||
DOMAIN-SUFFIX,viglink.com
|
||||
@@ -576,6 +607,7 @@ DOMAIN-SUFFIX,wedolook.com
|
||||
DOMAIN-SUFFIX,yadro.ru
|
||||
DOMAIN-SUFFIX,yengo.com
|
||||
DOMAIN-SUFFIX,zedo.com
|
||||
DOMAIN-SUFFIX,zemanta.com
|
||||
|
||||
# 垃圾站点****************
|
||||
DOMAIN-SUFFIX,11h5.com
|
||||
@@ -587,7 +619,6 @@ DOMAIN-SUFFIX,915.com
|
||||
DOMAIN-SUFFIX,appget.cn
|
||||
DOMAIN-SUFFIX,appuu.cn
|
||||
DOMAIN-SUFFIX,coinhive.com
|
||||
DOMAIN-SUFFIX,g2q3e.cn
|
||||
DOMAIN-SUFFIX,huodonghezi.cn
|
||||
DOMAIN-SUFFIX,vcbn65.xyz
|
||||
DOMAIN-SUFFIX,wanfeng1.com
|
||||
@@ -595,8 +626,11 @@ DOMAIN-SUFFIX,wep016.top
|
||||
DOMAIN-SUFFIX,win-stock.com.cn
|
||||
DOMAIN-SUFFIX,zantainet.com
|
||||
|
||||
DOMAIN-SUFFIX,dh54wf.xyz
|
||||
DOMAIN-SUFFIX,g2q3e.cn
|
||||
|
||||
# 运营商广告****************
|
||||
DOMAIN-SUFFIX,114so.cn
|
||||
DOMAIN-SUFFIX,go.10086.cn
|
||||
DOMAIN-SUFFIX,hivedata.cc
|
||||
DOMAIN-SUFFIX,navi.gd.chinamobile.com
|
||||
DOMAIN-SUFFIX,navi.gd.chinamobile.com
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -58,6 +58,7 @@ DOMAIN-SUFFIX,1688.com
|
||||
DOMAIN-SUFFIX,aliapp.org
|
||||
DOMAIN-SUFFIX,alibaba.com
|
||||
DOMAIN-SUFFIX,alibabacloud.com
|
||||
DOMAIN-SUFFIX,alibabausercontent.com
|
||||
DOMAIN-SUFFIX,alicdn.com
|
||||
DOMAIN-SUFFIX,aliexpress.com
|
||||
DOMAIN-SUFFIX,aliimg.com
|
||||
@@ -96,6 +97,7 @@ DOMAIN-SUFFIX,baidustatic.com
|
||||
DOMAIN-SUFFIX,bcebos.com
|
||||
DOMAIN-SUFFIX,bdimg.com
|
||||
DOMAIN-SUFFIX,bdstatic.com
|
||||
DOMAIN-SUFFIX,bdurl.net
|
||||
DOMAIN-SUFFIX,hao123.com
|
||||
DOMAIN-SUFFIX,hao123img.com
|
||||
DOMAIN-SUFFIX,jomodns.com
|
||||
@@ -107,8 +109,6 @@ DOMAIN-SUFFIX,acgvideo.com
|
||||
DOMAIN-SUFFIX,b23.tv
|
||||
DOMAIN-SUFFIX,biliapi.com
|
||||
DOMAIN-SUFFIX,biliapi.net
|
||||
DOMAIN-SUFFIX,bilibili.com
|
||||
DOMAIN-SUFFIX,bilibili.tv
|
||||
DOMAIN-SUFFIX,biligame.com
|
||||
DOMAIN-SUFFIX,biligame.net
|
||||
DOMAIN-SUFFIX,bilivideo.com
|
||||
@@ -121,8 +121,8 @@ DOMAIN-SUFFIX,battlenet.com
|
||||
DOMAIN-SUFFIX,blizzard.com
|
||||
|
||||
# ByteDance
|
||||
DOMAIN-SUFFIX,bytecdn.cn
|
||||
DOMAIN-SUFFIX,bytedance.com
|
||||
DOMAIN-SUFFIX,byteimg.com
|
||||
DOMAIN-SUFFIX,feiliao.com
|
||||
DOMAIN-SUFFIX,gifshow.com
|
||||
DOMAIN-SUFFIX,huoshan.com
|
||||
@@ -148,6 +148,11 @@ DOMAIN-SUFFIX,didialift.com
|
||||
DOMAIN-SUFFIX,didiglobal.com
|
||||
DOMAIN-SUFFIX,udache.com
|
||||
|
||||
# Douyu 斗鱼
|
||||
DOMAIN-SUFFIX,douyu.com
|
||||
DOMAIN-SUFFIX,douyu.tv
|
||||
DOMAIN-SUFFIX,douyutv.com
|
||||
|
||||
# Epic
|
||||
DOMAIN-SUFFIX,epicgames.com
|
||||
DOMAIN-SUFFIX,helpshift.com
|
||||
@@ -237,28 +242,25 @@ DOMAIN-SUFFIX,ydstatic.com
|
||||
DOMAIN-SUFFIX,youdao.com
|
||||
|
||||
# PPTV、PPLive
|
||||
DOMAIN-SUFFIX,pplive.cn
|
||||
DOMAIN-SUFFIX,pplive.com
|
||||
DOMAIN-SUFFIX,pptv.com
|
||||
|
||||
# PDD 拼多多
|
||||
DOMAIN-SUFFIX,pinduoduo.com
|
||||
DOMAIN-SUFFIX,yangkeduo.com
|
||||
|
||||
# Sina
|
||||
DOMAIN-SUFFIX,leju.com
|
||||
DOMAIN-SUFFIX,miaopai.com
|
||||
DOMAIN-SUFFIX,sina.cn
|
||||
DOMAIN-SUFFIX,sina.com
|
||||
DOMAIN-SUFFIX,sina.com.cn
|
||||
DOMAIN-SUFFIX,sinaapp.com
|
||||
DOMAIN-SUFFIX,sinaimg.cn
|
||||
DOMAIN-SUFFIX,sinaimg.com
|
||||
DOMAIN-SUFFIX,sinajs.cn
|
||||
DOMAIN-SUFFIX,t.cn
|
||||
DOMAIN-SUFFIX,weibo.com
|
||||
DOMAIN-SUFFIX,weibocdn.com
|
||||
DOMAIN-SUFFIX,xiaoka.tv
|
||||
|
||||
# Sohu Sogo
|
||||
DOMAIN-SUFFIX,go2map.com
|
||||
DOMAIN-SUFFIX,itc.cn
|
||||
DOMAIN-SUFFIX,sogo.com
|
||||
DOMAIN-SUFFIX,sogou.com
|
||||
DOMAIN-SUFFIX,sogoucdn.com
|
||||
@@ -294,19 +296,16 @@ DOMAIN-SUFFIX,steamstat.us
|
||||
|
||||
# Tencent
|
||||
DOMAIN-SUFFIX,foxmail.com
|
||||
DOMAIN-SUFFIX,gtimg.cn
|
||||
DOMAIN-SUFFIX,gtimg.com
|
||||
DOMAIN-SUFFIX,idqqimg.com
|
||||
DOMAIN-SUFFIX,igamecj.com
|
||||
DOMAIN-SUFFIX,myapp.com
|
||||
DOMAIN-SUFFIX,myqcloud.com
|
||||
DOMAIN-SUFFIX,qlogo.cn
|
||||
DOMAIN-SUFFIX,qpic.cn
|
||||
DOMAIN-SUFFIX,qq.com
|
||||
DOMAIN-SUFFIX,qqmail.com
|
||||
DOMAIN-SUFFIX,qqurl.com
|
||||
DOMAIN-SUFFIX,qtimg.cn
|
||||
DOMAIN-SUFFIX,smtcdns.com
|
||||
DOMAIN-SUFFIX,smtcdns.net
|
||||
DOMAIN-SUFFIX,soso.com
|
||||
DOMAIN-SUFFIX,tencent-cloud.net
|
||||
DOMAIN-SUFFIX,tencent.com
|
||||
@@ -321,6 +320,10 @@ DOMAIN-SUFFIX,appvipshop.com
|
||||
DOMAIN-SUFFIX,vip.com
|
||||
DOMAIN-SUFFIX,vipstatic.com
|
||||
|
||||
# Ximalaya 喜马拉雅
|
||||
DOMAIN-SUFFIX,ximalaya.com
|
||||
DOMAIN-SUFFIX,xmcdn.com
|
||||
|
||||
# YYeTs 人人影视
|
||||
DOMAIN-SUFFIX,got001.com
|
||||
DOMAIN-SUFFIX,jstucdn.com
|
||||
@@ -337,6 +340,8 @@ DOMAIN-SUFFIX,zmzfile.com
|
||||
|
||||
# Private Tracker
|
||||
DOMAIN-SUFFIX,awesome-hd.me
|
||||
DOMAIN-SUFFIX,beitai.pt
|
||||
DOMAIN-SUFFIX,bittorrent.com
|
||||
DOMAIN-SUFFIX,broadcasthe.net
|
||||
DOMAIN-SUFFIX,chdbits.co
|
||||
DOMAIN-SUFFIX,classix-unlimited.co.uk
|
||||
@@ -344,26 +349,25 @@ DOMAIN-SUFFIX,empornium.me
|
||||
DOMAIN-SUFFIX,gazellegames.net
|
||||
DOMAIN-SUFFIX,hdchina.org
|
||||
DOMAIN-SUFFIX,hdsky.me
|
||||
DOMAIN-SUFFIX,hdtime.org
|
||||
DOMAIN-SUFFIX,icetorrent.org
|
||||
DOMAIN-SUFFIX,jpopsuki.eu
|
||||
DOMAIN-SUFFIX,keepfrds.com
|
||||
DOMAIN-SUFFIX,leaguehd.com
|
||||
DOMAIN-SUFFIX,m-team.cc
|
||||
DOMAIN-SUFFIX,madsrevolution.net
|
||||
DOMAIN-SUFFIX,msg.vg
|
||||
DOMAIN-SUFFIX,nanyangpt.com
|
||||
DOMAIN-SUFFIX,ncore.cc
|
||||
DOMAIN-SUFFIX,open.cd
|
||||
DOMAIN-SUFFIX,ourbits.club
|
||||
DOMAIN-SUFFIX,passthepopcorn.me
|
||||
DOMAIN-SUFFIX,privatehd.to
|
||||
DOMAIN-SUFFIX,pthome.net
|
||||
DOMAIN-SUFFIX,redacted.ch
|
||||
DOMAIN-SUFFIX,springsunday.net
|
||||
DOMAIN-SUFFIX,tjupt.org
|
||||
DOMAIN-SUFFIX,totheglory.im
|
||||
DOMAIN-SUFFIX,msg.vg
|
||||
DOMAIN-SUFFIX,hdtime.org
|
||||
DOMAIN-SUFFIX,leaguehd.com
|
||||
DOMAIN-SUFFIX,pthome.net
|
||||
DOMAIN-SUFFIX,beitai.pt
|
||||
|
||||
# TeamViewer
|
||||
DOMAIN-SUFFIX,teamviewer.com
|
||||
@@ -378,11 +382,14 @@ IP-CIDR6,2a0b:b582::/48,no-resolve
|
||||
IP-CIDR6,2a0b:b583::/48,no-resolve
|
||||
|
||||
# Public Direct CDN 公共直连cdn
|
||||
DOMAIN-SUFFIX,ajax.aspnetcdn.com
|
||||
#DOMAIN-SUFFIX,ajax.aspnetcdn.com
|
||||
#DOMAIN-SUFFIX,ajax.cloudflare.com
|
||||
#DOMAIN-SUFFIX,cdnjs.cloudflare.com
|
||||
#DOMAIN-SUFFIX,code.jquery.com
|
||||
DOMAIN-SUFFIX,baomitu.com
|
||||
DOMAIN-SUFFIX,bootcss.com
|
||||
DOMAIN-SUFFIX,cdnjs.cloudflare.com
|
||||
DOMAIN-SUFFIX,code.jquery.com
|
||||
DOMAIN-SUFFIX,jiasule.com
|
||||
DOMAIN-SUFFIX,jsdelivr.net
|
||||
DOMAIN-SUFFIX,staticfile.org
|
||||
DOMAIN-SUFFIX,upaiyun.com
|
||||
|
||||
@@ -393,9 +400,11 @@ DOMAIN-SUFFIX,17k.com
|
||||
DOMAIN-SUFFIX,360doc.com
|
||||
DOMAIN-SUFFIX,36kr.com
|
||||
DOMAIN-SUFFIX,3dmgame.com
|
||||
DOMAIN-SUFFIX,51cto.com
|
||||
DOMAIN-SUFFIX,51job.com
|
||||
DOMAIN-SUFFIX,51jobcdn.com
|
||||
DOMAIN-SUFFIX,56.com
|
||||
DOMAIN-SUFFIX,8686c.com
|
||||
DOMAIN-SUFFIX,abchina.com
|
||||
DOMAIN-SUFFIX,abercrombie.com
|
||||
DOMAIN-SUFFIX,acfun.tv
|
||||
@@ -403,8 +412,11 @@ DOMAIN-SUFFIX,air-matters.com
|
||||
DOMAIN-SUFFIX,air-matters.io
|
||||
DOMAIN-SUFFIX,aixifan.com
|
||||
DOMAIN-SUFFIX,algocasts.io
|
||||
DOMAIN-SUFFIX,apache.org
|
||||
DOMAIN-SUFFIX,baomitu.com
|
||||
DOMAIN-SUFFIX,babytree.com
|
||||
DOMAIN-SUFFIX,babytreeimg.com
|
||||
DOMAIN-SUFFIX,baicizhan.com
|
||||
DOMAIN-SUFFIX,baidupan.com
|
||||
DOMAIN-SUFFIX,baike.com
|
||||
DOMAIN-SUFFIX,biqudu.com
|
||||
DOMAIN-SUFFIX,biquge.com
|
||||
DOMAIN-SUFFIX,bitauto.com
|
||||
@@ -420,10 +432,12 @@ DOMAIN-SUFFIX,chuimg.com
|
||||
DOMAIN-SUFFIX,cibntv.net
|
||||
DOMAIN-SUFFIX,clouddn.com
|
||||
DOMAIN-SUFFIX,cloudxns.net
|
||||
DOMAIN-SUFFIX,cmfu.com
|
||||
DOMAIN-SUFFIX,cn163.net
|
||||
DOMAIN-SUFFIX,cnbeta.com
|
||||
DOMAIN-SUFFIX,cnbetacdn.com
|
||||
DOMAIN-SUFFIX,cnblogs.com
|
||||
DOMAIN-SUFFIX,cnki.net
|
||||
DOMAIN-SUFFIX,cnmstl.net
|
||||
DOMAIN-SUFFIX,coolapk.com
|
||||
DOMAIN-SUFFIX,coolapkmarket.com
|
||||
DOMAIN-SUFFIX,csdn.net
|
||||
@@ -434,9 +448,6 @@ DOMAIN-SUFFIX,dianping.com
|
||||
DOMAIN-SUFFIX,dilidili.wang
|
||||
DOMAIN-SUFFIX,douban.com
|
||||
DOMAIN-SUFFIX,doubanio.com
|
||||
DOMAIN-SUFFIX,douyu.com
|
||||
DOMAIN-SUFFIX,douyu.tv
|
||||
DOMAIN-SUFFIX,douyutv.com
|
||||
DOMAIN-SUFFIX,dpfile.com
|
||||
DOMAIN-SUFFIX,duowan.com
|
||||
DOMAIN-SUFFIX,dxycdn.com
|
||||
@@ -496,6 +507,7 @@ DOMAIN-SUFFIX,kuaidi100.com
|
||||
DOMAIN-SUFFIX,kugou.com
|
||||
DOMAIN-SUFFIX,lancdns.com
|
||||
DOMAIN-SUFFIX,landiannews.com
|
||||
DOMAIN-SUFFIX,lanzou.com
|
||||
DOMAIN-SUFFIX,lemicp.com
|
||||
DOMAIN-SUFFIX,letitfly.me
|
||||
DOMAIN-SUFFIX,linkedin.com
|
||||
@@ -518,6 +530,7 @@ DOMAIN-SUFFIX,mogucdn.com
|
||||
DOMAIN-SUFFIX,mogujie.com
|
||||
DOMAIN-SUFFIX,moji.com
|
||||
DOMAIN-SUFFIX,moke.com
|
||||
DOMAIN-SUFFIX,mozilla.org
|
||||
DOMAIN-SUFFIX,mubu.com
|
||||
DOMAIN-SUFFIX,myunlu.com
|
||||
DOMAIN-SUFFIX,nruan.com
|
||||
@@ -528,7 +541,7 @@ DOMAIN-SUFFIX,oschina.net
|
||||
DOMAIN-SUFFIX,ourdvs.com
|
||||
DOMAIN-SUFFIX,overcast.fm
|
||||
DOMAIN-SUFFIX,paypal.com
|
||||
DOMAIN-SUFFIX,pptv.com
|
||||
DOMAIN-SUFFIX,polyv.net
|
||||
DOMAIN-SUFFIX,qbox.me
|
||||
DOMAIN-SUFFIX,qcloud.com
|
||||
DOMAIN-SUFFIX,qcloudcdn.com
|
||||
@@ -550,13 +563,14 @@ DOMAIN-SUFFIX,rarbg.to
|
||||
DOMAIN-SUFFIX,repaik.com
|
||||
DOMAIN-SUFFIX,rrmj.tv
|
||||
DOMAIN-SUFFIX,ruguoapp.com
|
||||
DOMAIN-SUFFIX,runoob.com
|
||||
DOMAIN-SUFFIX,sandai.net
|
||||
DOMAIN-SUFFIX,sankuai.com
|
||||
DOMAIN-SUFFIX,segmentfault.com
|
||||
DOMAIN-SUFFIX,sf-express.com
|
||||
DOMAIN-SUFFIX,shumilou.net
|
||||
DOMAIN-SUFFIX,simplecd.me
|
||||
DOMAIN-SUFFIX,sm.ms
|
||||
DOMAIN-SUFFIX,smtcdns.net
|
||||
DOMAIN-SUFFIX,smzdm.com
|
||||
DOMAIN-SUFFIX,snwx.com
|
||||
DOMAIN-SUFFIX,soufunimg.com
|
||||
@@ -565,7 +579,6 @@ DOMAIN-SUFFIX,sspai.com
|
||||
DOMAIN-SUFFIX,startssl.com
|
||||
DOMAIN-SUFFIX,suning.com
|
||||
DOMAIN-SUFFIX,taihe.com
|
||||
DOMAIN-SUFFIX,tenpay.com
|
||||
DOMAIN-SUFFIX,th-sjy.com
|
||||
DOMAIN-SUFFIX,tianqi.com
|
||||
DOMAIN-SUFFIX,tianqistatic.com
|
||||
@@ -579,9 +592,10 @@ DOMAIN-SUFFIX,ttmeiju.com
|
||||
DOMAIN-SUFFIX,tudou.com
|
||||
DOMAIN-SUFFIX,tuniu.com
|
||||
DOMAIN-SUFFIX,tuniucdn.com
|
||||
DOMAIN-SUFFIX,umengcloud.com
|
||||
DOMAIN-SUFFIX,upyun.com
|
||||
DOMAIN-SUFFIX,uxengine.net
|
||||
DOMAIN-SUFFIX,v2ex.com
|
||||
DOMAIN-SUFFIX,videocc.net
|
||||
DOMAIN-SUFFIX,vmware.com
|
||||
DOMAIN-SUFFIX,wandoujia.com
|
||||
DOMAIN-SUFFIX,weather.com
|
||||
@@ -590,19 +604,19 @@ DOMAIN-SUFFIX,weidian.com
|
||||
DOMAIN-SUFFIX,weiphone.com
|
||||
DOMAIN-SUFFIX,weiphone.net
|
||||
DOMAIN-SUFFIX,womai.com
|
||||
DOMAIN-SUFFIX,wscdns.com
|
||||
DOMAIN-SUFFIX,xdrig.com
|
||||
DOMAIN-SUFFIX,xhscdn.com
|
||||
DOMAIN-SUFFIX,xiachufang.com
|
||||
DOMAIN-SUFFIX,xiaohongshu.com
|
||||
DOMAIN-SUFFIX,xiaojukeji.com
|
||||
DOMAIN-SUFFIX,ximalaya.com
|
||||
DOMAIN-SUFFIX,xinhuanet.com
|
||||
DOMAIN-SUFFIX,xitek.com
|
||||
DOMAIN-SUFFIX,xiumi.us
|
||||
DOMAIN-SUFFIX,xmcdn.com
|
||||
DOMAIN-SUFFIX,xslb.net
|
||||
DOMAIN-SUFFIX,xueqiu.com
|
||||
DOMAIN-SUFFIX,xunlei.com
|
||||
DOMAIN-SUFFIX,yach.me
|
||||
DOMAIN-SUFFIX,yangkeduo.com
|
||||
DOMAIN-SUFFIX,yeepay.com
|
||||
DOMAIN-SUFFIX,yhd.com
|
||||
DOMAIN-SUFFIX,yihaodianimg.com
|
||||
|
||||
@@ -70,11 +70,12 @@ IP-CIDR,1.188.0.0/14,no-resolve
|
||||
IP-CIDR,1.192.0.0/13,no-resolve
|
||||
IP-CIDR,1.202.0.0/15,no-resolve
|
||||
IP-CIDR,1.204.0.0/14,no-resolve
|
||||
IP-CIDR,2.20.54.23/32,no-resolve
|
||||
IP-CIDR,8.128.0.0/10,no-resolve
|
||||
IP-CIDR,8.209.36.0/22,no-resolve
|
||||
IP-CIDR,8.209.40.0/21,no-resolve
|
||||
IP-CIDR,8.209.48.0/20,no-resolve
|
||||
IP-CIDR,8.209.128.0/17,no-resolve
|
||||
IP-CIDR,8.209.192.0/18,no-resolve
|
||||
IP-CIDR,8.210.0.0/15,no-resolve
|
||||
IP-CIDR,8.212.0.0/14,no-resolve
|
||||
IP-CIDR,8.216.0.0/13,no-resolve
|
||||
@@ -97,6 +98,7 @@ IP-CIDR,14.192.76.0/22,no-resolve
|
||||
IP-CIDR,14.196.0.0/15,no-resolve
|
||||
IP-CIDR,14.204.0.0/15,no-resolve
|
||||
IP-CIDR,14.208.0.0/12,no-resolve
|
||||
IP-CIDR,20.81.0.0/24,no-resolve
|
||||
IP-CIDR,20.134.160.0/20,no-resolve
|
||||
IP-CIDR,20.139.160.0/20,no-resolve
|
||||
IP-CIDR,20.249.255.0/24,no-resolve
|
||||
@@ -938,7 +940,6 @@ IP-CIDR,61.232.0.0/14,no-resolve
|
||||
IP-CIDR,61.236.0.0/15,no-resolve
|
||||
IP-CIDR,61.240.0.0/14,no-resolve
|
||||
IP-CIDR,62.234.0.0/16,no-resolve
|
||||
IP-CIDR,64.85.27.0/24,no-resolve
|
||||
IP-CIDR,68.79.0.0/18,no-resolve
|
||||
IP-CIDR,69.230.192.0/18,no-resolve
|
||||
IP-CIDR,69.231.128.0/18,no-resolve
|
||||
@@ -951,8 +952,11 @@ IP-CIDR,71.137.0.0/18,no-resolve
|
||||
IP-CIDR,72.163.240.0/23,no-resolve
|
||||
IP-CIDR,72.163.248.0/22,no-resolve
|
||||
IP-CIDR,81.68.0.0/14,no-resolve
|
||||
IP-CIDR,81.161.63.0/24,no-resolve
|
||||
IP-CIDR,82.156.0.0/15,no-resolve
|
||||
IP-CIDR,87.254.207.0/24,no-resolve
|
||||
IP-CIDR,91.223.53.0/24,no-resolve
|
||||
IP-CIDR,91.239.190.0/24,no-resolve
|
||||
IP-CIDR,93.183.14.0/24,no-resolve
|
||||
IP-CIDR,93.183.18.0/24,no-resolve
|
||||
IP-CIDR,94.191.0.0/17,no-resolve
|
||||
@@ -1922,7 +1926,8 @@ IP-CIDR,103.114.4.0/22,no-resolve
|
||||
IP-CIDR,103.114.68.0/22,no-resolve
|
||||
IP-CIDR,103.114.100.0/22,no-resolve
|
||||
IP-CIDR,103.114.148.0/22,no-resolve
|
||||
IP-CIDR,103.114.156.0/22,no-resolve
|
||||
IP-CIDR,103.114.156.0/23,no-resolve
|
||||
IP-CIDR,103.114.159.0/24,no-resolve
|
||||
IP-CIDR,103.114.212.0/22,no-resolve
|
||||
IP-CIDR,103.114.236.0/22,no-resolve
|
||||
IP-CIDR,103.114.240.0/22,no-resolve
|
||||
@@ -1955,7 +1960,7 @@ IP-CIDR,103.119.115.0/24,no-resolve
|
||||
IP-CIDR,103.119.156.0/22,no-resolve
|
||||
IP-CIDR,103.119.180.0/22,no-resolve
|
||||
IP-CIDR,103.119.200.0/22,no-resolve
|
||||
IP-CIDR,103.119.226.0/23,no-resolve
|
||||
IP-CIDR,103.119.224.0/22,no-resolve
|
||||
IP-CIDR,103.120.52.0/22,no-resolve
|
||||
IP-CIDR,103.120.72.0/22,no-resolve
|
||||
IP-CIDR,103.120.76.0/24,no-resolve
|
||||
@@ -2051,7 +2056,6 @@ IP-CIDR,103.139.204.0/23,no-resolve
|
||||
IP-CIDR,103.139.212.0/23,no-resolve
|
||||
IP-CIDR,103.140.14.0/23,no-resolve
|
||||
IP-CIDR,103.140.46.0/23,no-resolve
|
||||
IP-CIDR,103.140.70.0/23,no-resolve
|
||||
IP-CIDR,103.140.140.0/23,no-resolve
|
||||
IP-CIDR,103.140.144.0/23,no-resolve
|
||||
IP-CIDR,103.140.192.0/23,no-resolve
|
||||
@@ -2082,7 +2086,6 @@ IP-CIDR,103.143.124.0/23,no-resolve
|
||||
IP-CIDR,103.143.132.0/22,no-resolve
|
||||
IP-CIDR,103.143.174.0/23,no-resolve
|
||||
IP-CIDR,103.143.228.0/23,no-resolve
|
||||
IP-CIDR,103.144.40.0/23,no-resolve
|
||||
IP-CIDR,103.144.66.0/23,no-resolve
|
||||
IP-CIDR,103.144.70.0/23,no-resolve
|
||||
IP-CIDR,103.144.72.0/23,no-resolve
|
||||
@@ -2091,7 +2094,6 @@ IP-CIDR,103.144.158.0/23,no-resolve
|
||||
IP-CIDR,103.145.40.0/22,no-resolve
|
||||
IP-CIDR,103.145.73.0/24,no-resolve
|
||||
IP-CIDR,103.145.80.0/23,no-resolve
|
||||
IP-CIDR,103.145.86.0/23,no-resolve
|
||||
IP-CIDR,103.145.90.0/23,no-resolve
|
||||
IP-CIDR,103.145.92.0/22,no-resolve
|
||||
IP-CIDR,103.145.98.0/23,no-resolve
|
||||
@@ -2099,14 +2101,15 @@ IP-CIDR,103.145.107.0/24,no-resolve
|
||||
IP-CIDR,103.145.188.0/23,no-resolve
|
||||
IP-CIDR,103.146.6.0/23,no-resolve
|
||||
IP-CIDR,103.146.72.0/23,no-resolve
|
||||
IP-CIDR,103.146.88.0/22,no-resolve
|
||||
IP-CIDR,103.146.90.0/23,no-resolve
|
||||
IP-CIDR,103.146.126.0/23,no-resolve
|
||||
IP-CIDR,103.146.138.0/23,no-resolve
|
||||
IP-CIDR,103.146.230.0/23,no-resolve
|
||||
IP-CIDR,103.146.236.0/23,no-resolve
|
||||
IP-CIDR,103.146.252.0/23,no-resolve
|
||||
IP-CIDR,103.147.12.0/23,no-resolve
|
||||
IP-CIDR,103.147.124.0/23,no-resolve
|
||||
IP-CIDR,103.147.198.0/23,no-resolve
|
||||
IP-CIDR,103.147.206.0/23,no-resolve
|
||||
IP-CIDR,103.148.174.0/23,no-resolve
|
||||
IP-CIDR,103.192.0.0/19,no-resolve
|
||||
IP-CIDR,103.192.48.0/21,no-resolve
|
||||
IP-CIDR,103.192.56.0/22,no-resolve
|
||||
@@ -2916,7 +2919,21 @@ IP-CIDR,115.124.16.0/20,no-resolve
|
||||
IP-CIDR,115.148.0.0/14,no-resolve
|
||||
IP-CIDR,115.152.0.0/13,no-resolve
|
||||
IP-CIDR,115.166.64.0/19,no-resolve
|
||||
IP-CIDR,115.168.0.0/13,no-resolve
|
||||
IP-CIDR,115.168.0.0/16,no-resolve
|
||||
IP-CIDR,115.169.0.0/23,no-resolve
|
||||
IP-CIDR,115.169.3.0/24,no-resolve
|
||||
IP-CIDR,115.169.6.0/24,no-resolve
|
||||
IP-CIDR,115.169.9.0/24,no-resolve
|
||||
IP-CIDR,115.169.14.0/23,no-resolve
|
||||
IP-CIDR,115.169.16.0/20,no-resolve
|
||||
IP-CIDR,115.169.39.0/24,no-resolve
|
||||
IP-CIDR,115.169.42.0/23,no-resolve
|
||||
IP-CIDR,115.169.44.0/22,no-resolve
|
||||
IP-CIDR,115.169.48.0/20,no-resolve
|
||||
IP-CIDR,115.169.64.0/18,no-resolve
|
||||
IP-CIDR,115.169.128.0/17,no-resolve
|
||||
IP-CIDR,115.170.0.0/15,no-resolve
|
||||
IP-CIDR,115.172.0.0/14,no-resolve
|
||||
IP-CIDR,115.180.0.0/14,no-resolve
|
||||
IP-CIDR,115.187.0.0/20,no-resolve
|
||||
IP-CIDR,115.190.0.0/15,no-resolve
|
||||
@@ -3498,7 +3515,7 @@ IP-CIDR,124.68.242.0/24,no-resolve
|
||||
IP-CIDR,124.68.244.0/23,no-resolve
|
||||
IP-CIDR,124.68.254.0/23,no-resolve
|
||||
IP-CIDR,124.69.0.0/16,no-resolve
|
||||
IP-CIDR,124.70.0.0/22,no-resolve
|
||||
IP-CIDR,124.70.0.0/15,no-resolve
|
||||
IP-CIDR,124.72.0.0/13,no-resolve
|
||||
IP-CIDR,124.88.0.0/13,no-resolve
|
||||
IP-CIDR,124.108.8.0/21,no-resolve
|
||||
@@ -3573,6 +3590,7 @@ IP-CIDR,129.204.0.0/16,no-resolve
|
||||
IP-CIDR,129.211.0.0/16,no-resolve
|
||||
IP-CIDR,129.223.254.0/24,no-resolve
|
||||
IP-CIDR,129.227.99.0/24,no-resolve
|
||||
IP-CIDR,130.36.146.0/23,no-resolve
|
||||
IP-CIDR,130.214.218.0/23,no-resolve
|
||||
IP-CIDR,131.228.96.0/24,no-resolve
|
||||
IP-CIDR,131.253.12.0/29,no-resolve
|
||||
@@ -3597,6 +3615,7 @@ IP-CIDR,139.5.204.0/22,no-resolve
|
||||
IP-CIDR,139.5.244.0/22,no-resolve
|
||||
IP-CIDR,139.9.0.0/16,no-resolve
|
||||
IP-CIDR,139.129.0.0/16,no-resolve
|
||||
IP-CIDR,139.138.238.0/28,no-resolve
|
||||
IP-CIDR,139.148.0.0/16,no-resolve
|
||||
IP-CIDR,139.155.0.0/16,no-resolve
|
||||
IP-CIDR,139.159.0.0/19,no-resolve
|
||||
@@ -3739,8 +3758,6 @@ IP-CIDR,150.242.240.0/21,no-resolve
|
||||
IP-CIDR,150.242.248.0/22,no-resolve
|
||||
IP-CIDR,150.255.0.0/16,no-resolve
|
||||
IP-CIDR,152.32.178.0/23,no-resolve
|
||||
IP-CIDR,152.32.249.0/24,no-resolve
|
||||
IP-CIDR,152.32.255.0/24,no-resolve
|
||||
IP-CIDR,152.104.128.0/17,no-resolve
|
||||
IP-CIDR,152.136.0.0/16,no-resolve
|
||||
IP-CIDR,153.0.0.0/16,no-resolve
|
||||
@@ -3852,6 +3869,7 @@ IP-CIDR,171.80.0.0/12,no-resolve
|
||||
IP-CIDR,171.104.0.0/13,no-resolve
|
||||
IP-CIDR,171.112.0.0/12,no-resolve
|
||||
IP-CIDR,171.208.0.0/12,no-resolve
|
||||
IP-CIDR,172.60.2.0/24,no-resolve
|
||||
IP-CIDR,172.81.192.0/18,no-resolve
|
||||
IP-CIDR,173.39.200.0/23,no-resolve
|
||||
IP-CIDR,175.0.0.0/12,no-resolve
|
||||
@@ -4000,7 +4018,6 @@ IP-CIDR,183.184.0.0/13,no-resolve
|
||||
IP-CIDR,183.192.0.0/10,no-resolve
|
||||
IP-CIDR,185.109.236.0/24,no-resolve
|
||||
IP-CIDR,185.216.118.0/24,no-resolve
|
||||
IP-CIDR,185.224.116.0/22,no-resolve
|
||||
IP-CIDR,188.131.128.0/17,no-resolve
|
||||
IP-CIDR,192.11.23.0/24,no-resolve
|
||||
IP-CIDR,192.11.26.0/24,no-resolve
|
||||
@@ -4024,6 +4041,7 @@ IP-CIDR,192.140.208.0/21,no-resolve
|
||||
IP-CIDR,192.144.128.0/17,no-resolve
|
||||
IP-CIDR,192.163.11.0/24,no-resolve
|
||||
IP-CIDR,192.232.97.0/24,no-resolve
|
||||
IP-CIDR,193.9.22.0/24,no-resolve
|
||||
IP-CIDR,193.17.120.0/22,no-resolve
|
||||
IP-CIDR,193.20.64.0/22,no-resolve
|
||||
IP-CIDR,193.112.0.0/16,no-resolve
|
||||
@@ -4155,7 +4173,6 @@ IP-CIDR,202.22.248.0/21,no-resolve
|
||||
IP-CIDR,202.27.12.0/24,no-resolve
|
||||
IP-CIDR,202.27.14.0/24,no-resolve
|
||||
IP-CIDR,202.27.136.0/23,no-resolve
|
||||
IP-CIDR,202.30.124.0/24,no-resolve
|
||||
IP-CIDR,202.36.226.0/24,no-resolve
|
||||
IP-CIDR,202.38.0.0/22,no-resolve
|
||||
IP-CIDR,202.38.8.0/21,no-resolve
|
||||
@@ -4699,7 +4716,8 @@ IP-CIDR,203.15.151.0/24,no-resolve
|
||||
IP-CIDR,203.15.156.0/22,no-resolve
|
||||
IP-CIDR,203.15.174.0/24,no-resolve
|
||||
IP-CIDR,203.15.227.0/24,no-resolve
|
||||
IP-CIDR,203.15.232.0/21,no-resolve
|
||||
IP-CIDR,203.15.232.0/22,no-resolve
|
||||
IP-CIDR,203.15.238.0/23,no-resolve
|
||||
IP-CIDR,203.15.240.0/23,no-resolve
|
||||
IP-CIDR,203.15.246.0/24,no-resolve
|
||||
IP-CIDR,203.16.10.0/24,no-resolve
|
||||
@@ -4800,7 +4818,6 @@ IP-CIDR,203.20.118.0/23,no-resolve
|
||||
IP-CIDR,203.20.122.0/24,no-resolve
|
||||
IP-CIDR,203.20.126.0/23,no-resolve
|
||||
IP-CIDR,203.20.135.0/24,no-resolve
|
||||
IP-CIDR,203.20.138.0/23,no-resolve
|
||||
IP-CIDR,203.20.140.0/22,no-resolve
|
||||
IP-CIDR,203.20.150.0/24,no-resolve
|
||||
IP-CIDR,203.20.230.0/24,no-resolve
|
||||
@@ -5674,8 +5691,8 @@ IP-CIDR,220.242.126.0/24,no-resolve
|
||||
IP-CIDR,220.242.173.0/24,no-resolve
|
||||
IP-CIDR,220.242.197.0/24,no-resolve
|
||||
IP-CIDR,220.242.205.0/24,no-resolve
|
||||
IP-CIDR,220.242.206.0/23,no-resolve
|
||||
IP-CIDR,220.242.214.0/23,no-resolve
|
||||
IP-CIDR,220.242.207.0/24,no-resolve
|
||||
IP-CIDR,220.242.215.0/24,no-resolve
|
||||
IP-CIDR,220.242.216.0/21,no-resolve
|
||||
IP-CIDR,220.242.224.0/19,no-resolve
|
||||
IP-CIDR,220.243.0.0/17,no-resolve
|
||||
|
||||
26
base/rules/ACL4SSR/Clash/Download.list
Normal file
26
base/rules/ACL4SSR/Clash/Download.list
Normal file
@@ -0,0 +1,26 @@
|
||||
# Mac Download
|
||||
PROCESS-NAME,aria2c
|
||||
PROCESS-NAME,fdm
|
||||
PROCESS-NAME,Folx
|
||||
PROCESS-NAME,NetTransport
|
||||
PROCESS-NAME,Thunder
|
||||
PROCESS-NAME,Transmission
|
||||
PROCESS-NAME,uTorrent
|
||||
PROCESS-NAME,WebTorrent
|
||||
PROCESS-NAME,WebTorrent Helper
|
||||
# bt
|
||||
DOMAIN-SUFFIX,smtp
|
||||
DOMAIN-KEYWORD,aria2
|
||||
URL-REGEX,(Subject|HELO|SMTP)
|
||||
URL-REGEX,(api|ps|sv|offnavi|newvector|ulog.imap|newloc)(.map|).(baidu|n.shifen).com
|
||||
URL-REGEX,(.+.|^)(360|so|qihoo|360safe|qhimg|360totalsecurity|yunpan).(cn|com)
|
||||
URL-REGEX,(.+.)?(torrent|announce.php?passkey=|tracker|BitTorrent|bt_key|ed2k|find_node|get_peers|info_hash|magnet:|peer_id=|xunlei)(..+)?
|
||||
# XunLei
|
||||
URL-REGEX,(.?)(xunlei|sandai|Thunder|XLLiveUD)(.)
|
||||
PROCESS-NAME,DownloadService
|
||||
# 360
|
||||
URL-REGEX,(.+\.|^)(360|so)\.(cn|com)
|
||||
# Tencent Weiyun
|
||||
PROCESS-NAME,Weiyun
|
||||
#Baidu disk
|
||||
PROCESS-NAME,baidunetdisk
|
||||
@@ -4,21 +4,11 @@ DOMAIN-SUFFIX,ip6-localhost
|
||||
DOMAIN-SUFFIX,ip6-loopback
|
||||
DOMAIN-SUFFIX,local
|
||||
DOMAIN-SUFFIX,localhost
|
||||
IP-CIDR,0.0.0.0/8,no-resolve
|
||||
IP-CIDR,10.0.0.0/8,no-resolve
|
||||
IP-CIDR,100.64.0.0/10,no-resolve
|
||||
IP-CIDR,127.0.0.0/8,no-resolve
|
||||
IP-CIDR,169.254.0.0/16,no-resolve
|
||||
IP-CIDR,172.16.0.0/12,no-resolve
|
||||
IP-CIDR,192.0.0.0/29,no-resolve
|
||||
IP-CIDR,192.0.2.0/24,no-resolve
|
||||
IP-CIDR,192.88.99.0/24,no-resolve
|
||||
IP-CIDR,192.168.0.0/16,no-resolve
|
||||
IP-CIDR,198.18.0.0/15,no-resolve
|
||||
IP-CIDR,198.51.100.0/24,no-resolve
|
||||
IP-CIDR,203.0.113.0/24,no-resolve
|
||||
IP-CIDR,224.0.0.0/3,no-resolve
|
||||
IP-CIDR,255.255.255.255/32,no-resolve
|
||||
IP-CIDR,10.0.0.0/8
|
||||
IP-CIDR,100.64.0.0/10
|
||||
IP-CIDR,127.0.0.0/8
|
||||
IP-CIDR,172.16.0.0/12
|
||||
IP-CIDR,192.168.0.0/16
|
||||
IP-CIDR6,::1/128
|
||||
IP-CIDR6,fc00::/7
|
||||
IP-CIDR6,fe80::/10
|
||||
@@ -28,9 +18,10 @@ IP-CIDR6,fd00::/8
|
||||
DOMAIN-SUFFIX,hiwifi.com
|
||||
DOMAIN-SUFFIX,leike.cc
|
||||
DOMAIN-SUFFIX,miwifi.com
|
||||
DOMAIN-SUFFIX,my.router
|
||||
DOMAIN-SUFFIX,p.to
|
||||
DOMAIN-SUFFIX,peiluyou.com
|
||||
DOMAIN-SUFFIX,phicomm.me
|
||||
DOMAIN-SUFFIX,routerlogin.com
|
||||
DOMAIN-SUFFIX,tendawifi.com
|
||||
DOMAIN-SUFFIX,zte.home
|
||||
DOMAIN-SUFFIX,zte.home
|
||||
|
||||
23
base/rules/ACL4SSR/Clash/Netflix.list
Normal file
23
base/rules/ACL4SSR/Clash/Netflix.list
Normal file
@@ -0,0 +1,23 @@
|
||||
# Netflix
|
||||
DOMAIN-SUFFIX,netflix.com
|
||||
DOMAIN-SUFFIX,netflix.net
|
||||
DOMAIN-SUFFIX,nflxext.com
|
||||
DOMAIN-SUFFIX,nflximg.com
|
||||
DOMAIN-SUFFIX,nflximg.net
|
||||
DOMAIN-SUFFIX,nflxso.net
|
||||
DOMAIN-SUFFIX,nflxvideo.net
|
||||
IP-CIDR,8.41.4.0/24,no-resolve
|
||||
IP-CIDR,23.246.0.0/18,no-resolve
|
||||
IP-CIDR,37.77.184.0/21,no-resolve
|
||||
IP-CIDR,45.57.0.0/17,no-resolve
|
||||
IP-CIDR,64.120.128.0/17,no-resolve
|
||||
IP-CIDR,66.197.128.0/17,no-resolve
|
||||
IP-CIDR,69.53.224.0/19,no-resolve
|
||||
IP-CIDR,108.175.32.0/20,no-resolve
|
||||
IP-CIDR,185.2.220.0/22,no-resolve
|
||||
IP-CIDR,185.9.188.0/22,no-resolve
|
||||
IP-CIDR,192.173.64.0/18,no-resolve
|
||||
IP-CIDR,198.38.96.0/19,no-resolve
|
||||
IP-CIDR,198.45.48.0/20,no-resolve
|
||||
IP-CIDR,207.45.72.0/22,no-resolve
|
||||
IP-CIDR,208.75.76.0/22,no-resolve
|
||||
9
base/rules/ACL4SSR/Clash/OneDrive.list
Normal file
9
base/rules/ACL4SSR/Clash/OneDrive.list
Normal file
@@ -0,0 +1,9 @@
|
||||
# OneDrive
|
||||
PROCESS-NAME,OneDrive
|
||||
PROCESS-NAME,OneDriveUpdater
|
||||
USER-AGENT,OneDrive*
|
||||
USER-AGENT,OneDriveiOSApp*
|
||||
DOMAIN-SUFFIX,onedrive.com
|
||||
DOMAIN-SUFFIX,onedrive.live.com
|
||||
DOMAIN-SUFFIX,oneclient.sfx.ms
|
||||
DOMAIN-KEYWORD,1drv
|
||||
@@ -1,42 +1,31 @@
|
||||
# 代理列表
|
||||
|
||||
# 国外域名
|
||||
DOMAIN-SUFFIX,hk
|
||||
DOMAIN-SUFFIX,tw
|
||||
DOMAIN-SUFFIX,sg
|
||||
DOMAIN-SUFFIX,jp
|
||||
DOMAIN-SUFFIX,kr
|
||||
DOMAIN-SUFFIX,uk
|
||||
DOMAIN-SUFFIX,us
|
||||
DOMAIN-SUFFIX,tw
|
||||
|
||||
# MyList && Other
|
||||
DOMAIN-SUFFIX,apkmirror.com
|
||||
DOMAIN-SUFFIX,bit.no.com
|
||||
DOMAIN-SUFFIX,btlibrary.me
|
||||
DOMAIN-SUFFIX,cccat.io
|
||||
DOMAIN-SUFFIX,cloudcone.com
|
||||
DOMAIN-SUFFIX,cloudfront.net
|
||||
DOMAIN-SUFFIX,dmm.co.jp
|
||||
DOMAIN-SUFFIX,doub.io
|
||||
DOMAIN-SUFFIX,gameloft.com
|
||||
DOMAIN-SUFFIX,githubusercontent.com
|
||||
DOMAIN-SUFFIX,gvtw.com
|
||||
DOMAIN-SUFFIX,inoreader.com
|
||||
DOMAIN-SUFFIX,ip138.com
|
||||
DOMAIN-SUFFIX,microsoft.com
|
||||
DOMAIN-SUFFIX,ping.pe
|
||||
DOMAIN-SUFFIX,quora.com
|
||||
DOMAIN-SUFFIX,reddit.com
|
||||
DOMAIN-SUFFIX,s3.amazonaws.com
|
||||
DOMAIN-SUFFIX,teddysun.com
|
||||
DOMAIN-SUFFIX,tumbex.com
|
||||
DOMAIN-SUFFIX,tvb.com
|
||||
DOMAIN-SUFFIX,twdvd.com
|
||||
DOMAIN-SUFFIX,unsplash.com
|
||||
DOMAIN-SUFFIX,xn--i2ru8q2qg.com
|
||||
DOMAIN-SUFFIX,yunpanjingling.com
|
||||
|
||||
# 国外域名
|
||||
DOMAIN-SUFFIX,hk
|
||||
DOMAIN-SUFFIX,jp
|
||||
DOMAIN-SUFFIX,kr
|
||||
DOMAIN-SUFFIX,sg
|
||||
DOMAIN-SUFFIX,tw
|
||||
DOMAIN-SUFFIX,uk
|
||||
DOMAIN-SUFFIX,us
|
||||
|
||||
# 国外域名关键字
|
||||
DOMAIN-KEYWORD,1e100
|
||||
DOMAIN-KEYWORD,abema
|
||||
@@ -2566,7 +2555,6 @@ DOMAIN-SUFFIX,ipredator.se
|
||||
DOMAIN-SUFFIX,iptv.com.tw
|
||||
DOMAIN-SUFFIX,iptvbin.com
|
||||
DOMAIN-SUFFIX,ipvanish.com
|
||||
DOMAIN-SUFFIX,iqiyi.com
|
||||
DOMAIN-SUFFIX,iredmail.org
|
||||
DOMAIN-SUFFIX,irib.ir
|
||||
DOMAIN-SUFFIX,ironpython.net
|
||||
@@ -5537,4 +5525,189 @@ DOMAIN-SUFFIX,zyns.com
|
||||
DOMAIN-SUFFIX,zyzc9.com
|
||||
DOMAIN-SUFFIX,zzcartoon.com
|
||||
DOMAIN-SUFFIX,zzcloud.me
|
||||
DOMAIN-SUFFIX,zzux.com
|
||||
DOMAIN-SUFFIX,zzux.com
|
||||
|
||||
# Amazon
|
||||
DOMAIN-SUFFIX,amazon.co.jp
|
||||
DOMAIN-SUFFIX,amazon.com
|
||||
DOMAIN-SUFFIX,amazonaws.com
|
||||
IP-CIDR,13.32.0.0/15,no-resolve
|
||||
IP-CIDR,13.35.0.0/17,no-resolve
|
||||
IP-CIDR,18.184.0.0/15,no-resolve
|
||||
IP-CIDR,18.194.0.0/15,no-resolve
|
||||
IP-CIDR,18.208.0.0/13,no-resolve
|
||||
IP-CIDR,18.232.0.0/14,no-resolve
|
||||
IP-CIDR,52.58.0.0/15,no-resolve
|
||||
IP-CIDR,52.74.0.0/16,no-resolve
|
||||
IP-CIDR,52.77.0.0/16,no-resolve
|
||||
IP-CIDR,52.84.0.0/15,no-resolve
|
||||
IP-CIDR,52.200.0.0/13,no-resolve
|
||||
IP-CIDR,54.93.0.0/16,no-resolve
|
||||
IP-CIDR,54.156.0.0/14,no-resolve
|
||||
IP-CIDR,54.226.0.0/15,no-resolve
|
||||
IP-CIDR,54.230.156.0/22,no-resolve
|
||||
|
||||
# BBC
|
||||
DOMAIN-KEYWORD,uk-live
|
||||
DOMAIN-SUFFIX,bbc.co
|
||||
DOMAIN-SUFFIX,bbc.com
|
||||
|
||||
# Discord
|
||||
DOMAIN-SUFFIX,discord.gg
|
||||
DOMAIN-SUFFIX,discord.media
|
||||
DOMAIN-SUFFIX,discordapp.com
|
||||
DOMAIN-SUFFIX,discordapp.net
|
||||
|
||||
# Facebook
|
||||
DOMAIN-SUFFIX,facebook.com
|
||||
DOMAIN-SUFFIX,fb.com
|
||||
DOMAIN-SUFFIX,fb.me
|
||||
DOMAIN-SUFFIX,fbcdn.com
|
||||
DOMAIN-SUFFIX,fbcdn.net
|
||||
IP-CIDR,31.13.24.0/21,no-resolve
|
||||
IP-CIDR,31.13.64.0/18,no-resolve
|
||||
IP-CIDR,45.64.40.0/22,no-resolve
|
||||
IP-CIDR,66.220.144.0/20,no-resolve
|
||||
IP-CIDR,69.63.176.0/20,no-resolve
|
||||
IP-CIDR,69.171.224.0/19,no-resolve
|
||||
IP-CIDR,74.119.76.0/22,no-resolve
|
||||
IP-CIDR,103.4.96.0/22,no-resolve
|
||||
IP-CIDR,129.134.0.0/17,no-resolve
|
||||
IP-CIDR,157.240.0.0/17,no-resolve
|
||||
IP-CIDR,173.252.64.0/18,no-resolve
|
||||
IP-CIDR,179.60.192.0/22,no-resolve
|
||||
IP-CIDR,185.60.216.0/22,no-resolve
|
||||
IP-CIDR,204.15.20.0/22,no-resolve
|
||||
|
||||
# Github
|
||||
DOMAIN-SUFFIX,github.com
|
||||
DOMAIN-SUFFIX,github.io
|
||||
DOMAIN-SUFFIX,githubapp.com
|
||||
DOMAIN-SUFFIX,githubassets.com
|
||||
DOMAIN-SUFFIX,githubusercontent.com
|
||||
|
||||
# Google
|
||||
DOMAIN-SUFFIX,1e100.net
|
||||
DOMAIN-SUFFIX,2mdn.net
|
||||
DOMAIN-SUFFIX,app-measurement.net
|
||||
DOMAIN-SUFFIX,ggpht.com
|
||||
DOMAIN-SUFFIX,googleapis.cn
|
||||
DOMAIN-SUFFIX,googleapis.com
|
||||
DOMAIN-SUFFIX,gstatic.cn
|
||||
DOMAIN-SUFFIX,gstatic.com
|
||||
DOMAIN-SUFFIX,g.co
|
||||
DOMAIN-SUFFIX,goo.gl
|
||||
DOMAIN-SUFFIX,gvt0.com
|
||||
DOMAIN-SUFFIX,gvt1.com
|
||||
DOMAIN-SUFFIX,xn--ngstr-lra8j.com
|
||||
DOMAIN-SUFFIX,youtu.be
|
||||
DOMAIN-SUFFIX,youtube-nocookie.com
|
||||
DOMAIN-SUFFIX,youtube.com
|
||||
DOMAIN-SUFFIX,ytimg.com
|
||||
IP-CIDR,74.125.0.0/16,no-resolve
|
||||
IP-CIDR,173.194.0.0/16,no-resolve
|
||||
|
||||
# Instagram
|
||||
DOMAIN-SUFFIX,cdninstagram.com
|
||||
DOMAIN-SUFFIX,instagram.com
|
||||
DOMAIN-SUFFIX,instagr.am
|
||||
DOMAIN-SUFFIX,akamaihd.net
|
||||
|
||||
# Kakao Talk
|
||||
DOMAIN-SUFFIX,kakao.com
|
||||
DOMAIN-SUFFIX,kakao.co.kr
|
||||
DOMAIN-SUFFIX,kakaocdn.net
|
||||
IP-CIDR,1.201.0.0/24,no-resolve
|
||||
IP-CIDR,27.0.236.0/22,no-resolve
|
||||
IP-CIDR,103.27.148.0/22,no-resolve
|
||||
IP-CIDR,103.246.56.0/22,no-resolve
|
||||
IP-CIDR,110.76.140.0/22,no-resolve
|
||||
IP-CIDR,113.61.104.0/22,no-resolve
|
||||
|
||||
# Line
|
||||
DOMAIN-SUFFIX,lin.ee
|
||||
DOMAIN-SUFFIX,line-apps.com
|
||||
DOMAIN-SUFFIX,line-cdn.net
|
||||
DOMAIN-SUFFIX,line-scdn.net
|
||||
DOMAIN-SUFFIX,line.me
|
||||
DOMAIN-SUFFIX,line.naver.jp
|
||||
DOMAIN-SUFFIX,nhncorp.jp
|
||||
IP-CIDR,103.2.28.0/22,no-resolve
|
||||
IP-CIDR,119.235.224.0/21,no-resolve
|
||||
IP-CIDR,119.235.232.0/23,no-resolve
|
||||
IP-CIDR,119.235.235.0/24,no-resolve
|
||||
IP-CIDR,119.235.236.0/23,no-resolve
|
||||
IP-CIDR,125.6.146.0/24,no-resolve
|
||||
IP-CIDR,125.6.149.0/24,no-resolve
|
||||
IP-CIDR,125.6.190.0/24,no-resolve
|
||||
IP-CIDR,125.209.208.0/20,no-resolve
|
||||
IP-CIDR,203.104.103.0/24,no-resolve
|
||||
IP-CIDR,203.104.128.0/20,no-resolve
|
||||
IP-CIDR,203.174.66.64/26,no-resolve
|
||||
IP-CIDR,203.174.77.0/24,no-resolve
|
||||
|
||||
# Pixiv
|
||||
DOMAIN-SUFFIX,pixiv.net
|
||||
DOMAIN-SUFFIX,pximg.net
|
||||
|
||||
# Steam
|
||||
DOMAIN-SUFFIX,fanatical.com
|
||||
DOMAIN-SUFFIX,humblebundle.com
|
||||
DOMAIN-SUFFIX,steamcommunity.com
|
||||
DOMAIN-SUFFIX,steampowered.com
|
||||
DOMAIN-SUFFIX,steamstatic.com
|
||||
|
||||
# Twitch
|
||||
DOMAIN-SUFFIX,twitch.tv
|
||||
DOMAIN-SUFFIX,ttvnw.net
|
||||
DOMAIN-SUFFIX,jtvnw.net
|
||||
DOMAIN-SUFFIX,akamaized.net
|
||||
|
||||
# Twitter
|
||||
DOMAIN-SUFFIX,t.co
|
||||
DOMAIN-SUFFIX,twimg.co
|
||||
DOMAIN-SUFFIX,twimg.com
|
||||
DOMAIN-SUFFIX,twimg.org
|
||||
|
||||
# Telegram
|
||||
DOMAIN-SUFFIX,t.me
|
||||
DOMAIN-SUFFIX,tdesktop.com
|
||||
DOMAIN-SUFFIX,telegra.ph
|
||||
DOMAIN-SUFFIX,telegram.me
|
||||
DOMAIN-SUFFIX,telegram.org
|
||||
IP-CIDR,91.108.4.0/22,no-resolve
|
||||
IP-CIDR,91.108.56.0/22,no-resolve
|
||||
IP-CIDR,91.108.56.0/23,no-resolve
|
||||
IP-CIDR,109.239.140.0/24,no-resolve
|
||||
IP-CIDR,149.154.160.0/22,no-resolve
|
||||
IP-CIDR,149.154.164.0/22,no-resolve
|
||||
IP-CIDR,149.154.168.0/22,no-resolve
|
||||
IP-CIDR,149.154.172.0/22,no-resolve
|
||||
IP-CIDR6,2001:67c:4e8::/48,no-resolve
|
||||
IP-CIDR6,2001:b28:f23d::/48,no-resolve
|
||||
IP-CIDR6,2001:b28:f23f::/48,no-resolve
|
||||
|
||||
# Whatsapp
|
||||
IP-CIDR,18.194.0.0/15,no-resolve
|
||||
IP-CIDR,34.224.0.0/12,no-resolve
|
||||
IP-CIDR,54.242.0.0/15,no-resolve
|
||||
IP-CIDR,50.22.198.204/30,no-resolve
|
||||
IP-CIDR,208.43.122.128/27,no-resolve
|
||||
IP-CIDR,108.168.174.0/16,no-resolve
|
||||
IP-CIDR,173.192.231.32/27,no-resolve
|
||||
IP-CIDR,158.85.5.192/27,no-resolve
|
||||
IP-CIDR,174.37.243.0/16,no-resolve
|
||||
IP-CIDR,158.85.46.128/27,no-resolve
|
||||
IP-CIDR,173.192.222.160/27,no-resolve
|
||||
IP-CIDR,184.173.128.0/17,no-resolve
|
||||
IP-CIDR,158.85.224.160/27,no-resolve
|
||||
IP-CIDR,75.126.150.0/16,no-resolve
|
||||
IP-CIDR,69.171.235.0/16,no-resolve
|
||||
|
||||
#飞流直播
|
||||
DOMAIN-SUFFIX,neulion.com
|
||||
DOMAIN-SUFFIX,icntv.xyz
|
||||
DOMAIN-SUFFIX,flzbcdn.xyz
|
||||
|
||||
#华文电视
|
||||
DOMAIN-SUFFIX,ocnttv.com
|
||||
|
||||
@@ -1,42 +1,31 @@
|
||||
# 代理列表
|
||||
|
||||
# 国外域名
|
||||
DOMAIN-SUFFIX,hk
|
||||
DOMAIN-SUFFIX,tw
|
||||
DOMAIN-SUFFIX,sg
|
||||
DOMAIN-SUFFIX,jp
|
||||
DOMAIN-SUFFIX,kr
|
||||
DOMAIN-SUFFIX,uk
|
||||
DOMAIN-SUFFIX,us
|
||||
DOMAIN-SUFFIX,tw
|
||||
|
||||
# MyList && Other
|
||||
DOMAIN-SUFFIX,apkmirror.com
|
||||
DOMAIN-SUFFIX,bit.no.com
|
||||
DOMAIN-SUFFIX,btlibrary.me
|
||||
DOMAIN-SUFFIX,cccat.io
|
||||
DOMAIN-SUFFIX,cloudcone.com
|
||||
DOMAIN-SUFFIX,cloudfront.net
|
||||
DOMAIN-SUFFIX,dmm.co.jp
|
||||
DOMAIN-SUFFIX,doub.io
|
||||
DOMAIN-SUFFIX,gameloft.com
|
||||
DOMAIN-SUFFIX,githubusercontent.com
|
||||
DOMAIN-SUFFIX,gvtw.com
|
||||
DOMAIN-SUFFIX,inoreader.com
|
||||
DOMAIN-SUFFIX,ip138.com
|
||||
DOMAIN-SUFFIX,microsoft.com
|
||||
DOMAIN-SUFFIX,ping.pe
|
||||
DOMAIN-SUFFIX,quora.com
|
||||
DOMAIN-SUFFIX,reddit.com
|
||||
DOMAIN-SUFFIX,s3.amazonaws.com
|
||||
DOMAIN-SUFFIX,teddysun.com
|
||||
DOMAIN-SUFFIX,tumbex.com
|
||||
DOMAIN-SUFFIX,tvb.com
|
||||
DOMAIN-SUFFIX,twdvd.com
|
||||
DOMAIN-SUFFIX,unsplash.com
|
||||
DOMAIN-SUFFIX,xn--i2ru8q2qg.com
|
||||
DOMAIN-SUFFIX,yunpanjingling.com
|
||||
|
||||
# 国外域名
|
||||
DOMAIN-SUFFIX,hk
|
||||
DOMAIN-SUFFIX,jp
|
||||
DOMAIN-SUFFIX,kr
|
||||
DOMAIN-SUFFIX,sg
|
||||
DOMAIN-SUFFIX,tw
|
||||
DOMAIN-SUFFIX,uk
|
||||
DOMAIN-SUFFIX,us
|
||||
|
||||
# 国外域名关键字
|
||||
DOMAIN-KEYWORD,1e100
|
||||
DOMAIN-KEYWORD,abema
|
||||
@@ -63,7 +52,10 @@ DOMAIN-KEYWORD,youtube
|
||||
DOMAIN-SUFFIX,4sqi.net
|
||||
DOMAIN-SUFFIX,a248.e.akamai.net
|
||||
DOMAIN-SUFFIX,adobedtm.com
|
||||
DOMAIN-SUFFIX,ampproject.org
|
||||
DOMAIN-SUFFIX,android.com
|
||||
DOMAIN-SUFFIX,aolcdn.com
|
||||
DOMAIN-SUFFIX,apkmirror.com
|
||||
DOMAIN-SUFFIX,apkpure.com
|
||||
DOMAIN-SUFFIX,app-measurement.com
|
||||
DOMAIN-SUFFIX,appspot.com
|
||||
@@ -74,8 +66,6 @@ DOMAIN-SUFFIX,awsstatic.com
|
||||
DOMAIN-SUFFIX,azureedge.net
|
||||
DOMAIN-SUFFIX,azurewebsites.net
|
||||
DOMAIN-SUFFIX,bandwagonhost.com
|
||||
DOMAIN-SUFFIX,bbc.co
|
||||
DOMAIN-SUFFIX,bbc.com
|
||||
DOMAIN-SUFFIX,bing.com
|
||||
DOMAIN-SUFFIX,bkrtx.com
|
||||
DOMAIN-SUFFIX,blogcdn.com
|
||||
@@ -89,9 +79,9 @@ DOMAIN-SUFFIX,bloomberg.com
|
||||
DOMAIN-SUFFIX,box.com
|
||||
DOMAIN-SUFFIX,cachefly.net
|
||||
DOMAIN-SUFFIX,cdnst.net
|
||||
DOMAIN-SUFFIX,cloudfront.net
|
||||
DOMAIN-SUFFIX,comodoca.com
|
||||
DOMAIN-SUFFIX,content.office.net
|
||||
DOMAIN-SUFFIX,d3c33hcgiwev3.cloudfront.net
|
||||
DOMAIN-SUFFIX,daum.net
|
||||
DOMAIN-SUFFIX,demdex.net
|
||||
DOMAIN-SUFFIX,deskconnect.com
|
||||
DOMAIN-SUFFIX,disqus.com
|
||||
@@ -104,23 +94,14 @@ DOMAIN-SUFFIX,duckduckgo.com
|
||||
DOMAIN-SUFFIX,edgecastcdn.net
|
||||
DOMAIN-SUFFIX,edgekey.net
|
||||
DOMAIN-SUFFIX,edgesuite.net
|
||||
DOMAIN-SUFFIX,eu-west-1.console.aws.amazon.com
|
||||
DOMAIN-SUFFIX,eurekavpt.com
|
||||
DOMAIN-SUFFIX,facebook.com
|
||||
DOMAIN-SUFFIX,fastmail.com
|
||||
DOMAIN-SUFFIX,fb.com
|
||||
DOMAIN-SUFFIX,fb.me
|
||||
DOMAIN-SUFFIX,fbcdn.net
|
||||
DOMAIN-SUFFIX,firebaseio.com
|
||||
DOMAIN-SUFFIX,flickr.com
|
||||
DOMAIN-SUFFIX,flipboard.com
|
||||
DOMAIN-SUFFIX,gfx.ms
|
||||
DOMAIN-SUFFIX,gist.github.com
|
||||
DOMAIN-SUFFIX,gongm.in
|
||||
DOMAIN-SUFFIX,gstatic.cn
|
||||
DOMAIN-SUFFIX,gstatic.com
|
||||
DOMAIN-SUFFIX,gvt0.com
|
||||
DOMAIN-SUFFIX,gvt1.com
|
||||
DOMAIN-SUFFIX,hulu.com
|
||||
DOMAIN-SUFFIX,id.heroku.com
|
||||
DOMAIN-SUFFIX,io.io
|
||||
DOMAIN-SUFFIX,issuu.com
|
||||
@@ -143,16 +124,15 @@ DOMAIN-SUFFIX,netdna-cdn.com
|
||||
DOMAIN-SUFFIX,nintendo.net
|
||||
DOMAIN-SUFFIX,nsstatic.net
|
||||
DOMAIN-SUFFIX,nytstyle.com
|
||||
DOMAIN-SUFFIX,onedrive.live.com
|
||||
DOMAIN-SUFFIX,openvpn.net
|
||||
DOMAIN-SUFFIX,periscope.tv
|
||||
DOMAIN-SUFFIX,pinimg.com
|
||||
DOMAIN-SUFFIX,pinterest.com
|
||||
DOMAIN-SUFFIX,pixiv.net
|
||||
DOMAIN-SUFFIX,potato.im
|
||||
DOMAIN-SUFFIX,prfct.co
|
||||
DOMAIN-SUFFIX,pscp.tv
|
||||
DOMAIN-SUFFIX,quora.com
|
||||
DOMAIN-SUFFIX,resilio.com
|
||||
DOMAIN-SUFFIX,s3-ap-northeast-1.amazonaws.com
|
||||
DOMAIN-SUFFIX,s3-ap-southeast-2.amazonaws.com
|
||||
DOMAIN-SUFFIX,sfx.ms
|
||||
DOMAIN-SUFFIX,shadowsocks.org
|
||||
DOMAIN-SUFFIX,slack-edge.com
|
||||
@@ -164,9 +144,6 @@ DOMAIN-SUFFIX,staticflickr.com
|
||||
DOMAIN-SUFFIX,symauth.com
|
||||
DOMAIN-SUFFIX,symcb.com
|
||||
DOMAIN-SUFFIX,symcd.com
|
||||
DOMAIN-SUFFIX,t.me
|
||||
DOMAIN-SUFFIX,telegram.me
|
||||
DOMAIN-SUFFIX,telegram.org
|
||||
DOMAIN-SUFFIX,textnow.com
|
||||
DOMAIN-SUFFIX,thefacebook.com
|
||||
DOMAIN-SUFFIX,thepiratebay.org
|
||||
@@ -174,45 +151,199 @@ DOMAIN-SUFFIX,torproject.org
|
||||
DOMAIN-SUFFIX,trustasiassl.com
|
||||
DOMAIN-SUFFIX,tumblr.co
|
||||
DOMAIN-SUFFIX,tumblr.com
|
||||
DOMAIN-SUFFIX,twimg.co
|
||||
DOMAIN-SUFFIX,twimg.com
|
||||
DOMAIN-SUFFIX,twimg.org
|
||||
DOMAIN-SUFFIX,tvb.com
|
||||
DOMAIN-SUFFIX,txmblr.com
|
||||
DOMAIN-SUFFIX,v2ex.com
|
||||
DOMAIN-SUFFIX,vimeo.com
|
||||
DOMAIN-SUFFIX,vine.co
|
||||
DOMAIN-SUFFIX,vox-cdn.com
|
||||
DOMAIN-SUFFIX,wikileaks.org
|
||||
DOMAIN-SUFFIX,wikipedia.org
|
||||
DOMAIN-SUFFIX,youtube-nocookie.com
|
||||
DOMAIN-SUFFIX,youtu.be
|
||||
DOMAIN-SUFFIX,youtube.com
|
||||
DOMAIN-SUFFIX,ytimg.com
|
||||
|
||||
# APKPURE
|
||||
DOMAIN-SUFFIX,apkpure.com
|
||||
# Amazon
|
||||
DOMAIN-SUFFIX,amazon.co.jp
|
||||
DOMAIN-SUFFIX,amazon.com
|
||||
DOMAIN-SUFFIX,amazonaws.com
|
||||
IP-CIDR,13.32.0.0/15,no-resolve
|
||||
IP-CIDR,13.35.0.0/17,no-resolve
|
||||
IP-CIDR,18.184.0.0/15,no-resolve
|
||||
IP-CIDR,18.194.0.0/15,no-resolve
|
||||
IP-CIDR,18.208.0.0/13,no-resolve
|
||||
IP-CIDR,18.232.0.0/14,no-resolve
|
||||
IP-CIDR,52.58.0.0/15,no-resolve
|
||||
IP-CIDR,52.74.0.0/16,no-resolve
|
||||
IP-CIDR,52.77.0.0/16,no-resolve
|
||||
IP-CIDR,52.84.0.0/15,no-resolve
|
||||
IP-CIDR,52.200.0.0/13,no-resolve
|
||||
IP-CIDR,54.93.0.0/16,no-resolve
|
||||
IP-CIDR,54.156.0.0/14,no-resolve
|
||||
IP-CIDR,54.226.0.0/15,no-resolve
|
||||
IP-CIDR,54.230.156.0/22,no-resolve
|
||||
|
||||
# BBC
|
||||
DOMAIN-KEYWORD,uk-live
|
||||
DOMAIN-SUFFIX,bbc.co
|
||||
DOMAIN-SUFFIX,bbc.com
|
||||
|
||||
# Discord
|
||||
DOMAIN-SUFFIX,discord.gg
|
||||
DOMAIN-SUFFIX,discord.media
|
||||
DOMAIN-SUFFIX,discordapp.com
|
||||
DOMAIN-SUFFIX,discordapp.net
|
||||
|
||||
# Facebook
|
||||
DOMAIN-SUFFIX,facebook.com
|
||||
DOMAIN-SUFFIX,fb.com
|
||||
DOMAIN-SUFFIX,fb.me
|
||||
DOMAIN-SUFFIX,fbcdn.com
|
||||
DOMAIN-SUFFIX,fbcdn.net
|
||||
IP-CIDR,31.13.24.0/21,no-resolve
|
||||
IP-CIDR,31.13.64.0/18,no-resolve
|
||||
IP-CIDR,45.64.40.0/22,no-resolve
|
||||
IP-CIDR,66.220.144.0/20,no-resolve
|
||||
IP-CIDR,69.63.176.0/20,no-resolve
|
||||
IP-CIDR,69.171.224.0/19,no-resolve
|
||||
IP-CIDR,74.119.76.0/22,no-resolve
|
||||
IP-CIDR,103.4.96.0/22,no-resolve
|
||||
IP-CIDR,129.134.0.0/17,no-resolve
|
||||
IP-CIDR,157.240.0.0/17,no-resolve
|
||||
IP-CIDR,173.252.64.0/18,no-resolve
|
||||
IP-CIDR,179.60.192.0/22,no-resolve
|
||||
IP-CIDR,185.60.216.0/22,no-resolve
|
||||
IP-CIDR,204.15.20.0/22,no-resolve
|
||||
|
||||
# Github
|
||||
DOMAIN-SUFFIX,github.com
|
||||
DOMAIN-SUFFIX,github.io
|
||||
DOMAIN-SUFFIX,githubapp.com
|
||||
DOMAIN-SUFFIX,githubassets.com
|
||||
DOMAIN-SUFFIX,githubusercontent.com
|
||||
|
||||
# Google
|
||||
DOMAIN-SUFFIX,1e100.net
|
||||
DOMAIN-SUFFIX,2mdn.net
|
||||
DOMAIN-SUFFIX,app-measurement.net
|
||||
DOMAIN-SUFFIX,g.co
|
||||
DOMAIN-SUFFIX,ggpht.com
|
||||
DOMAIN-SUFFIX,goo.gl
|
||||
DOMAIN-SUFFIX,googleapis.cn
|
||||
DOMAIN-SUFFIX,googleapis.com
|
||||
DOMAIN-SUFFIX,gstatic.cn
|
||||
DOMAIN-SUFFIX,gstatic.com
|
||||
DOMAIN-SUFFIX,gvt0.com
|
||||
DOMAIN-SUFFIX,gvt1.com
|
||||
DOMAIN-SUFFIX,gvt2.com
|
||||
DOMAIN-SUFFIX,gvt3.com
|
||||
DOMAIN-SUFFIX,xn--ngstr-lra8j.com
|
||||
DOMAIN-SUFFIX,youtu.be
|
||||
DOMAIN-SUFFIX,youtube-nocookie.com
|
||||
DOMAIN-SUFFIX,youtube.com
|
||||
DOMAIN-SUFFIX,yt.be
|
||||
DOMAIN-SUFFIX,ytimg.com
|
||||
IP-CIDR,74.125.0.0/16,no-resolve
|
||||
IP-CIDR,173.194.0.0/16,no-resolve
|
||||
|
||||
# Instagram
|
||||
DOMAIN-SUFFIX,cdninstagram.com
|
||||
DOMAIN-SUFFIX,instagram.com
|
||||
DOMAIN-SUFFIX,instagr.am
|
||||
DOMAIN-SUFFIX,akamaihd.net
|
||||
|
||||
# Kakao Talk
|
||||
DOMAIN-SUFFIX,kakao.com
|
||||
DOMAIN-SUFFIX,kakao.co.kr
|
||||
DOMAIN-SUFFIX,kakaocdn.net
|
||||
IP-CIDR,1.201.0.0/24,no-resolve
|
||||
IP-CIDR,27.0.236.0/22,no-resolve
|
||||
IP-CIDR,103.27.148.0/22,no-resolve
|
||||
IP-CIDR,103.246.56.0/22,no-resolve
|
||||
IP-CIDR,110.76.140.0/22,no-resolve
|
||||
IP-CIDR,113.61.104.0/22,no-resolve
|
||||
|
||||
# Line
|
||||
DOMAIN-SUFFIX,lin.ee
|
||||
DOMAIN-SUFFIX,line-apps.com
|
||||
DOMAIN-SUFFIX,line-cdn.net
|
||||
DOMAIN-SUFFIX,line-scdn.net
|
||||
DOMAIN-SUFFIX,line.me
|
||||
DOMAIN-SUFFIX,line.naver.jp
|
||||
DOMAIN-SUFFIX,nhncorp.jp
|
||||
IP-CIDR,103.2.28.0/22,no-resolve
|
||||
IP-CIDR,119.235.224.0/21,no-resolve
|
||||
IP-CIDR,119.235.232.0/23,no-resolve
|
||||
IP-CIDR,119.235.235.0/24,no-resolve
|
||||
IP-CIDR,119.235.236.0/23,no-resolve
|
||||
IP-CIDR,125.6.146.0/24,no-resolve
|
||||
IP-CIDR,125.6.149.0/24,no-resolve
|
||||
IP-CIDR,125.6.190.0/24,no-resolve
|
||||
IP-CIDR,125.209.208.0/20,no-resolve
|
||||
IP-CIDR,203.104.103.0/24,no-resolve
|
||||
IP-CIDR,203.104.128.0/20,no-resolve
|
||||
IP-CIDR,203.174.66.64/26,no-resolve
|
||||
IP-CIDR,203.174.77.0/24,no-resolve
|
||||
|
||||
# Pixiv
|
||||
DOMAIN-SUFFIX,pixiv.net
|
||||
DOMAIN-SUFFIX,pximg.net
|
||||
|
||||
# Steam
|
||||
DOMAIN-SUFFIX,fanatical.com
|
||||
DOMAIN-SUFFIX,humblebundle.com
|
||||
DOMAIN-SUFFIX,steamcommunity.com
|
||||
DOMAIN-SUFFIX,steampowered.com
|
||||
DOMAIN-SUFFIX,steamstatic.co
|
||||
DOMAIN-SUFFIX,steamstatic.com
|
||||
|
||||
# ifun.tv
|
||||
DOMAIN-SUFFIX,timegate.vip
|
||||
DOMAIN-SUFFIX,dnvodcdn.me
|
||||
DOMAIN-SUFFIX,ifun.tv
|
||||
# Twitch
|
||||
DOMAIN-SUFFIX,twitch.tv
|
||||
DOMAIN-SUFFIX,ttvnw.net
|
||||
DOMAIN-SUFFIX,jtvnw.net
|
||||
DOMAIN-SUFFIX,akamaized.net
|
||||
|
||||
# Twitter
|
||||
DOMAIN-SUFFIX,t.co
|
||||
DOMAIN-SUFFIX,twimg.co
|
||||
DOMAIN-SUFFIX,twimg.com
|
||||
DOMAIN-SUFFIX,twimg.org
|
||||
|
||||
# Telegram
|
||||
DOMAIN-SUFFIX,t.me
|
||||
DOMAIN-SUFFIX,tdesktop.com
|
||||
DOMAIN-SUFFIX,telegra.ph
|
||||
DOMAIN-SUFFIX,telegram.me
|
||||
DOMAIN-SUFFIX,telegram.org
|
||||
IP-CIDR,91.108.4.0/22,no-resolve
|
||||
IP-CIDR,91.108.56.0/22,no-resolve
|
||||
IP-CIDR,91.108.56.0/23,no-resolve
|
||||
IP-CIDR,109.239.140.0/24,no-resolve
|
||||
IP-CIDR,149.154.160.0/22,no-resolve
|
||||
IP-CIDR,149.154.164.0/22,no-resolve
|
||||
IP-CIDR,149.154.168.0/22,no-resolve
|
||||
IP-CIDR,149.154.172.0/22,no-resolve
|
||||
IP-CIDR6,2001:67c:4e8::/48,no-resolve
|
||||
IP-CIDR6,2001:b28:f23d::/48,no-resolve
|
||||
IP-CIDR6,2001:b28:f23f::/48,no-resolve
|
||||
|
||||
# Whatsapp
|
||||
IP-CIDR,18.194.0.0/15,no-resolve
|
||||
IP-CIDR,34.224.0.0/12,no-resolve
|
||||
IP-CIDR,54.242.0.0/15,no-resolve
|
||||
IP-CIDR,50.22.198.204/30,no-resolve
|
||||
IP-CIDR,208.43.122.128/27,no-resolve
|
||||
IP-CIDR,108.168.174.0/16,no-resolve
|
||||
IP-CIDR,173.192.231.32/27,no-resolve
|
||||
IP-CIDR,158.85.5.192/27,no-resolve
|
||||
IP-CIDR,174.37.243.0/16,no-resolve
|
||||
IP-CIDR,158.85.46.128/27,no-resolve
|
||||
IP-CIDR,173.192.222.160/27,no-resolve
|
||||
IP-CIDR,184.173.128.0/17,no-resolve
|
||||
IP-CIDR,158.85.224.160/27,no-resolve
|
||||
IP-CIDR,75.126.150.0/16,no-resolve
|
||||
IP-CIDR,69.171.235.0/16,no-resolve
|
||||
|
||||
#飞流直播
|
||||
DOMAIN-SUFFIX,neulion.com
|
||||
DOMAIN-SUFFIX,icntv.xyz
|
||||
DOMAIN-SUFFIX,flzbcdn.xyz
|
||||
|
||||
#华文电视
|
||||
DOMAIN-SUFFIX,ocnttv.com
|
||||
17
base/rules/ACL4SSR/Clash/Telegram.list
Normal file
17
base/rules/ACL4SSR/Clash/Telegram.list
Normal file
@@ -0,0 +1,17 @@
|
||||
# Telegram
|
||||
DOMAIN-SUFFIX,t.me
|
||||
DOMAIN-SUFFIX,tdesktop.com
|
||||
DOMAIN-SUFFIX,telegra.ph
|
||||
DOMAIN-SUFFIX,telegram.me
|
||||
DOMAIN-SUFFIX,telegram.org
|
||||
IP-CIDR,91.108.4.0/22,no-resolve
|
||||
IP-CIDR,91.108.56.0/22,no-resolve
|
||||
IP-CIDR,91.108.56.0/23,no-resolve
|
||||
IP-CIDR,109.239.140.0/24,no-resolve
|
||||
IP-CIDR,149.154.160.0/22,no-resolve
|
||||
IP-CIDR,149.154.164.0/22,no-resolve
|
||||
IP-CIDR,149.154.168.0/22,no-resolve
|
||||
IP-CIDR,149.154.172.0/22,no-resolve
|
||||
IP-CIDR6,2001:67c:4e8::/48,no-resolve
|
||||
IP-CIDR6,2001:b28:f23d::/48,no-resolve
|
||||
IP-CIDR6,2001:b28:f23f::/48,no-resolve
|
||||
@@ -151,14 +151,18 @@ DOMAIN-SUFFIX,steamstat.us
|
||||
# > Tencent
|
||||
USER-AGENT,MicroMessenger%20Client
|
||||
USER-AGENT,WeChat*
|
||||
USER-AGENT,%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1*
|
||||
DOMAIN-SUFFIX,gtimg.com
|
||||
DOMAIN-SUFFIX,idqqimg.com
|
||||
DOMAIN-SUFFIX,igamecj.com
|
||||
DOMAIN-SUFFIX,myapp.com
|
||||
DOMAIN-SUFFIX,myqcloud.com
|
||||
DOMAIN-SUFFIX,qq.com
|
||||
DOMAIN-SUFFIX,servicewechat.com
|
||||
DOMAIN-SUFFIX,tencent.com
|
||||
DOMAIN-SUFFIX,tencent-cloud.net
|
||||
DOMAIN-SUFFIX,tenpay.com
|
||||
DOMAIN,file-igamecj.akamaized.net
|
||||
# > YYeTs
|
||||
USER-AGENT,YYeTs*
|
||||
DOMAIN-SUFFIX,jstucdn.com
|
||||
|
||||
@@ -349,6 +349,7 @@ DOMAIN-SUFFIX,washingtonpost.com
|
||||
DOMAIN-SUFFIX,wattpad.com
|
||||
DOMAIN-SUFFIX,whoer.net
|
||||
DOMAIN-SUFFIX,wikimapia.org
|
||||
DOMAIN-SUFFIX,wikimedia.org
|
||||
DOMAIN-SUFFIX,wikipedia.org
|
||||
DOMAIN-SUFFIX,wikiquote.org
|
||||
DOMAIN-SUFFIX,wikiwand.com
|
||||
|
||||
@@ -158,6 +158,7 @@ DOMAIN-SUFFIX,mytvsuper.com
|
||||
DOMAIN-SUFFIX,tvb.com
|
||||
# > Netflix
|
||||
USER-AGENT,Argo*
|
||||
DOMAIN-SUFFIX,fast.com
|
||||
DOMAIN-SUFFIX,netflix.com
|
||||
DOMAIN-SUFFIX,netflix.net
|
||||
DOMAIN-SUFFIX,nflxext.com
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# > Netflix
|
||||
USER-AGENT,Argo*
|
||||
DOMAIN-SUFFIX,fast.com
|
||||
DOMAIN-SUFFIX,netflix.com
|
||||
DOMAIN-SUFFIX,netflix.net
|
||||
DOMAIN-SUFFIX,nflxext.com
|
||||
|
||||
22
base/rules/HKMTMedia.list
Normal file
22
base/rules/HKMTMedia.list
Normal file
@@ -0,0 +1,22 @@
|
||||
# (HKMTMedia)
|
||||
# > 爱奇艺台湾站
|
||||
DOMAIN,cache.video.iqiyi.com
|
||||
DOMAIN-KEYWORD,qiyi
|
||||
DOMAIN-SUFFIX,qy.net
|
||||
IP-CIDR,101.227.0.0/16
|
||||
IP-CIDR,101.224.0.0/13
|
||||
IP-CIDR,119.176.0.0/12
|
||||
|
||||
# > bilibili
|
||||
DOMAIN-KEYWORD,bilibili
|
||||
DOMAIN-SUFFIX,acg.tv
|
||||
DOMAIN-SUFFIX,acgvideo.com
|
||||
DOMAIN-SUFFIX,b23.tv
|
||||
DOMAIN-SUFFIX,biliapi.com
|
||||
DOMAIN-SUFFIX,biliapi.net
|
||||
DOMAIN-SUFFIX,bilibili.com
|
||||
DOMAIN-SUFFIX,biligame.com
|
||||
DOMAIN-SUFFIX,biligame.net
|
||||
DOMAIN-SUFFIX,bilivideo.com
|
||||
DOMAIN-SUFFIX,hdslb.com
|
||||
DOMAIN-SUFFIX,im9.com
|
||||
File diff suppressed because one or more lines are too long
@@ -1,13 +1,3 @@
|
||||
# > UA
|
||||
USER-AGENT,hide*
|
||||
USER-AGENT,MicroMessenger*
|
||||
USER-AGENT,PayPal*
|
||||
USER-AGENT,TeamViewer*
|
||||
USER-AGENT,TIM*
|
||||
USER-AGENT,ting_en
|
||||
USER-AGENT,WebTorrent*
|
||||
USER-AGENT,WeChat*
|
||||
|
||||
# > Beplay
|
||||
DOMAIN-KEYWORD,beplay
|
||||
|
||||
@@ -17,14 +7,9 @@ DOMAIN-SUFFIX,battlenet.com
|
||||
DOMAIN-SUFFIX,blizzard.com
|
||||
|
||||
# > Microsoft
|
||||
USER-AGENT,OneDrive*
|
||||
DOMAIN-KEYWORD,microsoft
|
||||
DOMAIN-SUFFIX,azure.cn
|
||||
DOMAIN-SUFFIX,hotmail.com
|
||||
DOMAIN-SUFFIX,live.com
|
||||
DOMAIN-SUFFIX,live.net
|
||||
DOMAIN-SUFFIX,msn.com
|
||||
DOMAIN-SUFFIX,office.com
|
||||
DOMAIN-SUFFIX,office.net
|
||||
DOMAIN-SUFFIX,outlook.com
|
||||
DOMAIN-SUFFIX,windows.com
|
||||
DOMAIN-SUFFIX,windows.net
|
||||
@@ -44,10 +29,6 @@ DOMAIN-SUFFIX,playstationnetwork.com
|
||||
DOMAIN-SUFFIX,sony.com
|
||||
DOMAIN-SUFFIX,sonyentertainmentnetwork.com
|
||||
|
||||
# > Steam
|
||||
USER-AGENT,Steam*
|
||||
DOMAIN-SUFFIX,steamcontent.com
|
||||
|
||||
# > TeamViewer
|
||||
IP-CIDR,185.188.32.0/24,no-resolve
|
||||
IP-CIDR,185.188.33.0/24,no-resolve
|
||||
@@ -58,7 +39,6 @@ IP-CIDR6,2a0b:b581::/48,no-resolve
|
||||
IP-CIDR6,2a0b:b582::/48,no-resolve
|
||||
IP-CIDR6,2a0b:b583::/48,no-resolve
|
||||
|
||||
# Domestic
|
||||
DOMAIN-SUFFIX,12306.cn
|
||||
DOMAIN-SUFFIX,12306.com
|
||||
DOMAIN-SUFFIX,126.net
|
||||
@@ -78,14 +58,15 @@ DOMAIN-SUFFIX,air-matters.com
|
||||
DOMAIN-SUFFIX,air-matters.io
|
||||
DOMAIN-SUFFIX,aixifan.com
|
||||
DOMAIN-SUFFIX,akadns.net
|
||||
DOMAIN-SUFFIX,alibabacloud.com
|
||||
DOMAIN-SUFFIX,alicdn.com
|
||||
DOMAIN-SUFFIX,alipay.com
|
||||
DOMAIN-SUFFIX,alipayobjects.com
|
||||
DOMAIN-SUFFIX,aliyun.com
|
||||
DOMAIN-SUFFIX,aliyuncs.com
|
||||
DOMAIN-SUFFIX,amap.com
|
||||
DOMAIN-SUFFIX,apache.org
|
||||
DOMAIN-SUFFIX,api.crisp.chat
|
||||
DOMAIN-SUFFIX,api.termius.com
|
||||
DOMAIN-SUFFIX,appshike.com
|
||||
DOMAIN-SUFFIX,appstore.com
|
||||
DOMAIN-SUFFIX,autonavi.com
|
||||
@@ -154,7 +135,6 @@ DOMAIN-SUFFIX,icedropper.com
|
||||
DOMAIN-SUFFIX,iciba.com
|
||||
DOMAIN-SUFFIX,ifeng.com
|
||||
DOMAIN-SUFFIX,ifengimg.com
|
||||
DOMAIN-SUFFIX,images.unsplash.com
|
||||
DOMAIN-SUFFIX,images-amazon.com
|
||||
DOMAIN-SUFFIX,img4me.com
|
||||
DOMAIN-SUFFIX,ipify.org
|
||||
@@ -190,7 +170,6 @@ DOMAIN-SUFFIX,miwifi.com
|
||||
DOMAIN-SUFFIX,mob.com
|
||||
DOMAIN-SUFFIX,moji.com
|
||||
DOMAIN-SUFFIX,moke.com
|
||||
DOMAIN-SUFFIX,mtalk.google.com
|
||||
DOMAIN-SUFFIX,mxhichina.com
|
||||
DOMAIN-SUFFIX,myqcloud.com
|
||||
DOMAIN-SUFFIX,myunlu.com
|
||||
@@ -228,6 +207,7 @@ DOMAIN-SUFFIX,rrmj.tv
|
||||
DOMAIN-SUFFIX,ruguoapp.com
|
||||
DOMAIN-SUFFIX,sandai.net
|
||||
DOMAIN-SUFFIX,sf-express.com
|
||||
DOMAIN,safebrowsing.googleapis.com
|
||||
DOMAIN-SUFFIX,sinaapp.com
|
||||
DOMAIN-SUFFIX,sinaimg.cn
|
||||
DOMAIN-SUFFIX,sinaimg.com
|
||||
@@ -257,7 +237,6 @@ DOMAIN-SUFFIX,tmzvps.com
|
||||
DOMAIN-SUFFIX,trello.com
|
||||
DOMAIN-SUFFIX,trellocdn.com
|
||||
DOMAIN-SUFFIX,totheglory.im
|
||||
DOMAIN-SUFFIX,tp.m-team.cc
|
||||
DOMAIN-SUFFIX,ttmeiju.com
|
||||
DOMAIN-SUFFIX,tudou.com
|
||||
DOMAIN-SUFFIX,udache.com
|
||||
@@ -277,7 +256,6 @@ DOMAIN-SUFFIX,weiphone.net
|
||||
DOMAIN-SUFFIX,wenku8.net
|
||||
DOMAIN-SUFFIX,werewolf.53site.com
|
||||
DOMAIN-SUFFIX,wkcdn.com
|
||||
DOMAIN-SUFFIX,workflowy.com
|
||||
DOMAIN-SUFFIX,xdrig.com
|
||||
DOMAIN-SUFFIX,xhostfire.com
|
||||
DOMAIN-SUFFIX,xiami.com
|
||||
|
||||
@@ -13,6 +13,7 @@ DOMAIN-SUFFIX,hayabusa.io
|
||||
USER-AGENT,InstantVideo.US*
|
||||
USER-AGENT,Prime%20Video*
|
||||
DOMAIN-SUFFIX,aiv-cdn.net
|
||||
DOMAIN-SUFFIX,amazonaws.co.uk
|
||||
DOMAIN-SUFFIX,amazonaws.com
|
||||
DOMAIN-SUFFIX,amazonvideo.com
|
||||
DOMAIN-SUFFIX,llnwd.net
|
||||
@@ -43,6 +44,12 @@ DOMAIN-SUFFIX,bbci.co.uk
|
||||
USER-AGENT,TwDramas*
|
||||
DOMAIN-SUFFIX,chocotv.com.tw
|
||||
|
||||
# > DAZN
|
||||
DOMAIN-SUFFIX,d151l6v8er5bdm.cloudfront.net
|
||||
DOMAIN-SUFFIX,dazn.com
|
||||
DOMAIN-SUFFIX,dazn-api.com
|
||||
DOMAIN-SUFFIX,indazn.com
|
||||
|
||||
# > Disney Plus
|
||||
USER-AGENT,Disney*
|
||||
DOMAIN,cdn.registerdisney.go.com
|
||||
@@ -111,15 +118,6 @@ DOMAIN-KEYWORD,rthklive
|
||||
DOMAIN-SUFFIX,mytvsuper.com
|
||||
DOMAIN-SUFFIX,tvb.com
|
||||
|
||||
# > Netflix
|
||||
DOMAIN-SUFFIX,netflix.com
|
||||
DOMAIN-SUFFIX,netflix.net
|
||||
DOMAIN-SUFFIX,nflxext.com
|
||||
DOMAIN-SUFFIX,nflximg.com
|
||||
DOMAIN-SUFFIX,nflximg.net
|
||||
DOMAIN-SUFFIX,nflxso.net
|
||||
DOMAIN-SUFFIX,nflxvideo.net
|
||||
|
||||
# > Pandora
|
||||
DOMAIN-SUFFIX,pandora.com
|
||||
|
||||
@@ -130,12 +128,8 @@ DOMAIN-SUFFIX,skygo.co.nz
|
||||
|
||||
# > SoundCloud
|
||||
USER-AGENT,SoundCloud*
|
||||
|
||||
# > Spotify
|
||||
USER-AGENT,*Spotify*
|
||||
DOMAIN-KEYWORD,spotify
|
||||
DOMAIN-SUFFIX,scdn.co
|
||||
DOMAIN-SUFFIX,spoti.fi
|
||||
DOMAIN-SUFFIX,sndcdn.com
|
||||
DOMAIN-SUFFIX,soundcloud.com
|
||||
|
||||
# > viuTV
|
||||
USER-AGENT,ViuTV*
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
# > Amazon Prime Video
|
||||
USER-AGENT,InstantVideo.US*
|
||||
USER-AGENT,Prime%20Video*
|
||||
USER-AGENT,Prime%20Video*
|
||||
DOMAIN-SUFFIX,aiv-cdn.net
|
||||
DOMAIN-SUFFIX,amazonaws.co.uk
|
||||
DOMAIN-SUFFIX,amazonaws.com
|
||||
DOMAIN-SUFFIX,amazonvideo.com
|
||||
DOMAIN-SUFFIX,llnwd.net
|
||||
7
base/rules/lhie1/Surge/Surge 3/Provider/Media/DAZN.list
Normal file
7
base/rules/lhie1/Surge/Surge 3/Provider/Media/DAZN.list
Normal file
@@ -0,0 +1,7 @@
|
||||
# > DAZN
|
||||
DOMAIN-SUFFIX,d151l6v8er5bdm.cloudfront.net
|
||||
DOMAIN-SUFFIX,dazn.com
|
||||
DOMAIN-SUFFIX,dazn-api.com
|
||||
DOMAIN-SUFFIX,dazndn.com
|
||||
DOMAIN-SUFFIX,indazn.com
|
||||
DOMAIN-SUFFIX,intercom.io
|
||||
2
base/rules/lhie1/Surge/Surge 3/Provider/Media/Letv.list
Normal file
2
base/rules/lhie1/Surge/Surge 3/Provider/Media/Letv.list
Normal file
@@ -0,0 +1,2 @@
|
||||
# > letv
|
||||
DOMAIN-SUFFIX,api.mob.app.letv.com
|
||||
3
base/rules/lhie1/Surge/Surge 3/Provider/Media/MOO.list
Normal file
3
base/rules/lhie1/Surge/Surge 3/Provider/Media/MOO.list
Normal file
@@ -0,0 +1,3 @@
|
||||
# > MOO
|
||||
USER-AGENT,MOO*
|
||||
USER-AGENT,TencentMidasConnect*
|
||||
@@ -6,4 +6,19 @@ DOMAIN-SUFFIX,nflxext.com
|
||||
DOMAIN-SUFFIX,nflximg.com
|
||||
DOMAIN-SUFFIX,nflximg.net
|
||||
DOMAIN-SUFFIX,nflxso.net
|
||||
DOMAIN-SUFFIX,nflxvideo.net
|
||||
DOMAIN-SUFFIX,nflxvideo.net
|
||||
IP-CIDR,8.41.4.0/24
|
||||
IP-CIDR,23.246.0.0/18
|
||||
IP-CIDR,37.77.184.0/21
|
||||
IP-CIDR,45.57.0.0/17
|
||||
IP-CIDR,64.120.128.0/17
|
||||
IP-CIDR,66.197.128.0/17
|
||||
IP-CIDR,69.53.224.0/19
|
||||
IP-CIDR,108.175.32.0/20
|
||||
IP-CIDR,185.2.220.0/22
|
||||
IP-CIDR,185.9.188.0/22
|
||||
IP-CIDR,192.173.64.0/18
|
||||
IP-CIDR,198.38.96.0/19
|
||||
IP-CIDR,198.45.48.0/20
|
||||
IP-CIDR,207.45.72.0/22
|
||||
IP-CIDR,208.75.76.0/22
|
||||
@@ -0,0 +1,4 @@
|
||||
# > SoundCloud
|
||||
USER-AGENT,SoundCloud*
|
||||
DOMAIN-SUFFIX,sndcdn.com
|
||||
DOMAIN-SUFFIX,soundcloud.com
|
||||
@@ -0,0 +1,2 @@
|
||||
# > Tencent Video
|
||||
DOMAIN-SUFFIX,vv.video.qq.com
|
||||
2
base/rules/lhie1/Surge/Surge 3/Provider/Media/Youku.list
Normal file
2
base/rules/lhie1/Surge/Surge 3/Provider/Media/Youku.list
Normal file
@@ -0,0 +1,2 @@
|
||||
# > Youku
|
||||
IP-CIDR,106.11.0.0/16,no-resolve
|
||||
@@ -1,11 +1,3 @@
|
||||
# > UA
|
||||
USER-AGENT,%E7%BA%BD%E7%BA%A6%E6%97%B6%E6%8A%A5*
|
||||
USER-AGENT,AwemeI18n*
|
||||
USER-AGENT,Coinbase*
|
||||
USER-AGENT,Instagram*
|
||||
USER-AGENT,Resilio Sync*
|
||||
USER-AGENT,WhatsApp*
|
||||
|
||||
# > Line
|
||||
DOMAIN-SUFFIX,lin.ee
|
||||
DOMAIN-SUFFIX,line.me
|
||||
@@ -15,19 +7,23 @@ DOMAIN-SUFFIX,line-cdn.net
|
||||
DOMAIN-SUFFIX,line-scdn.net
|
||||
DOMAIN-SUFFIX,nhncorp.jp
|
||||
|
||||
# > Microsoft
|
||||
USER-AGENT,OneDrive*
|
||||
DOMAIN-KEYWORD,microsoft
|
||||
DOMAIN-KEYWORD,onedrive
|
||||
DOMAIN-SUFFIX,azure.com
|
||||
DOMAIN-SUFFIX,live.com
|
||||
DOMAIN-SUFFIX,live.net
|
||||
DOMAIN-SUFFIX,office.com
|
||||
DOMAIN-SUFFIX,office.net
|
||||
DOMAIN-SUFFIX,skype.com
|
||||
|
||||
# > Spark
|
||||
DOMAIN-SUFFIX,api.amplitude.com
|
||||
DOMAIN-SUFFIX,app.smartmailcloud.com
|
||||
DOMAIN-SUFFIX,gate.hockeyapp.net
|
||||
DOMAIN-SUFFIX,smartmailcloud.com
|
||||
|
||||
# > Steam
|
||||
DOMAIN-SUFFIX,fanatical.com
|
||||
DOMAIN-SUFFIX,humblebundle.com
|
||||
DOMAIN-SUFFIX,steamcommunity.com
|
||||
DOMAIN-SUFFIX,steampowered.com
|
||||
DOMAIN-SUFFIX,steamstatic.com
|
||||
|
||||
# > Zooba
|
||||
USER-AGENT,battleroyale*
|
||||
|
||||
@@ -62,6 +58,7 @@ DOMAIN-SUFFIX,anthonycalzadilla.com
|
||||
DOMAIN-SUFFIX,aol.com
|
||||
DOMAIN-SUFFIX,aolcdn.com
|
||||
DOMAIN-SUFFIX,api.mixpanel.com
|
||||
DOMAIN-SUFFIX,api.termius.com
|
||||
DOMAIN-SUFFIX,api.tiktokv.com
|
||||
DOMAIN-SUFFIX,api.urbandictionary.com
|
||||
DOMAIN-SUFFIX,apigee.com
|
||||
@@ -329,7 +326,6 @@ DOMAIN-SUFFIX,nytimg.com
|
||||
DOMAIN-SUFFIX,nytstyle.com
|
||||
DOMAIN-SUFFIX,office365.com
|
||||
DOMAIN-SUFFIX,omnigroup.com
|
||||
DOMAIN-SUFFIX,onedrive.com
|
||||
DOMAIN-SUFFIX,onenote.com
|
||||
DOMAIN-SUFFIX,ooyala.com
|
||||
DOMAIN-SUFFIX,openvpn.net
|
||||
@@ -399,7 +395,6 @@ DOMAIN-SUFFIX,sidelinesnews.com
|
||||
DOMAIN-SUFFIX,simp.ly
|
||||
DOMAIN-SUFFIX,simplenote.com
|
||||
DOMAIN-SUFFIX,sketchappsources.com
|
||||
DOMAIN-SUFFIX,skype.com
|
||||
DOMAIN-SUFFIX,slack.com
|
||||
DOMAIN-SUFFIX,slack-edge.com
|
||||
DOMAIN-SUFFIX,slack-msgs.com
|
||||
@@ -570,6 +565,7 @@ DOMAIN-SUFFIX,wikipedia.org
|
||||
DOMAIN-SUFFIX,wn.com
|
||||
DOMAIN-SUFFIX,wordpress.com
|
||||
DOMAIN-SUFFIX,workflow.is
|
||||
DOMAIN-SUFFIX,workflowy.com
|
||||
DOMAIN-SUFFIX,worldcat.org
|
||||
DOMAIN-SUFFIX,wow.com
|
||||
DOMAIN-SUFFIX,wp.com
|
||||
|
||||
@@ -870,7 +870,6 @@ DOMAIN-SUFFIX,abcj.dooccn.com
|
||||
DOMAIN-SUFFIX,ab-gb.mgid.com
|
||||
DOMAIN-SUFFIX,abtest.mistat.xiaomi.com
|
||||
DOMAIN-SUFFIX,ac.atpanel.com
|
||||
DOMAIN-SUFFIX,ac.mmstat.com
|
||||
DOMAIN-SUFFIX,ac2.msn.com
|
||||
DOMAIN-SUFFIX,ac3.msn.com
|
||||
DOMAIN-SUFFIX,acasys88.cn
|
||||
@@ -1397,7 +1396,6 @@ DOMAIN-SUFFIX,afpimages.eastday
|
||||
DOMAIN-SUFFIX,afpimages.eastday.com
|
||||
DOMAIN-SUFFIX,afpmm.alicdn.com
|
||||
DOMAIN-SUFFIX,afptrack.csbew.com
|
||||
DOMAIN-SUFFIX,afs.googlesyndication.com
|
||||
DOMAIN-SUFFIX,ag.nukefans.net
|
||||
DOMAIN-SUFFIX,agenda.complex.com
|
||||
DOMAIN-SUFFIX,ag-gb.marketgid.com
|
||||
@@ -1531,7 +1529,6 @@ DOMAIN-SUFFIX,api.iimedia.cn
|
||||
DOMAIN-SUFFIX,api.ijunhai.com
|
||||
DOMAIN-SUFFIX,api.itaoxiaoshuo.com
|
||||
DOMAIN-SUFFIX,api.joybj.com
|
||||
DOMAIN-SUFFIX,api.jr.mi.com
|
||||
DOMAIN-SUFFIX,api.ketedata.com
|
||||
DOMAIN-SUFFIX,api.koudaikj.com
|
||||
DOMAIN-SUFFIX,api.leadbolt.net
|
||||
@@ -1724,7 +1721,6 @@ DOMAIN-SUFFIX,b.ads1.msn.com
|
||||
DOMAIN-SUFFIX,b.aowugame.com
|
||||
DOMAIN-SUFFIX,b.babylon.com
|
||||
DOMAIN-SUFFIX,b.baiy.net
|
||||
DOMAIN-SUFFIX,b.bdstatic.com
|
||||
DOMAIN-SUFFIX,b.bst.126.net
|
||||
DOMAIN-SUFFIX,b.clkservice.youdao.com
|
||||
DOMAIN-SUFFIX,b.code.tanwanyx.com
|
||||
@@ -3742,7 +3738,6 @@ DOMAIN-SUFFIX,go.gogolm.xyz
|
||||
DOMAIN-SUFFIX,go.gotourl.xyz
|
||||
DOMAIN-SUFFIX,go.gotourls.bid
|
||||
DOMAIN-SUFFIX,go.hangzhou.com.cn
|
||||
DOMAIN-SUFFIX,go.mmstat.com
|
||||
DOMAIN-SUFFIX,go.onclasrv.com
|
||||
DOMAIN-SUFFIX,go.util.zlibs.com
|
||||
DOMAIN-SUFFIX,godloveme.cn
|
||||
@@ -3804,7 +3799,6 @@ DOMAIN-SUFFIX,gw5.push.mcp.weibo.cn
|
||||
DOMAIN-SUFFIX,gw6.push.mcp.weibo.cn
|
||||
DOMAIN-SUFFIX,gw630.com
|
||||
DOMAIN-SUFFIX,gx38.cn
|
||||
DOMAIN-SUFFIX,gxb.mmstat.com
|
||||
DOMAIN-SUFFIX,gxdhgb.com
|
||||
DOMAIN-SUFFIX,gxe.husky.sogou.com
|
||||
DOMAIN-SUFFIX,gyca9f.dahuangcheng.cn
|
||||
@@ -3992,7 +3986,6 @@ DOMAIN-SUFFIX,hystq.com
|
||||
DOMAIN-SUFFIX,hytgj.com
|
||||
DOMAIN-SUFFIX,hyz86.com
|
||||
DOMAIN-SUFFIX,hz.miercn.com
|
||||
DOMAIN-SUFFIX,hz.mmstat.com
|
||||
DOMAIN-SUFFIX,hz.shouyoutv.com
|
||||
DOMAIN-SUFFIX,hzaibi.com
|
||||
DOMAIN-SUFFIX,hzdmacore.kejet.net
|
||||
@@ -5457,7 +5450,6 @@ DOMAIN-SUFFIX,mm.moquanad.com
|
||||
DOMAIN-SUFFIX,mmcc.yxlady.com
|
||||
DOMAIN-SUFFIX,mmg.aty.cp45.ott.cibntv.net
|
||||
DOMAIN-SUFFIX,mmg.aty.snmsohu.aisee.tv
|
||||
DOMAIN-SUFFIX,mmstat.com
|
||||
DOMAIN-SUFFIX,mng-ads.com
|
||||
DOMAIN-SUFFIX,mnkan.com
|
||||
DOMAIN-SUFFIX,mnwan.com
|
||||
@@ -5851,7 +5843,6 @@ DOMAIN-SUFFIX,p215223.clksite.com
|
||||
DOMAIN-SUFFIX,p215223.inclk.com
|
||||
DOMAIN-SUFFIX,p215223.mycdn2.co
|
||||
DOMAIN-SUFFIX,p2pmid.baofeng.com
|
||||
DOMAIN-SUFFIX,p3p.mmstat.com
|
||||
DOMAIN-SUFFIX,p3p.sogou.com
|
||||
DOMAIN-SUFFIX,p3p.yahoo.com
|
||||
DOMAIN-SUFFIX,p3tt.com
|
||||
@@ -5866,7 +5857,6 @@ DOMAIN-SUFFIX,page.acm.dzwww.com
|
||||
DOMAIN-SUFFIX,page.xywy.com
|
||||
DOMAIN-SUFFIX,pagead.google.com
|
||||
DOMAIN-SUFFIX,pagead.l.google.com
|
||||
DOMAIN-SUFFIX,pagead2.googlesyndication.com
|
||||
DOMAIN-SUFFIX,pagead-tpc.l.google.com
|
||||
DOMAIN-SUFFIX,pagechoice.com
|
||||
DOMAIN-SUFFIX,pagechoice.net
|
||||
@@ -6360,7 +6350,6 @@ DOMAIN-SUFFIX,res.cocounion.com
|
||||
DOMAIN-SUFFIX,res.dxpmedia.com
|
||||
DOMAIN-SUFFIX,res.icast.cn
|
||||
DOMAIN-SUFFIX,res.ipingke.com
|
||||
DOMAIN-SUFFIX,res.mmstat.com
|
||||
DOMAIN-SUFFIX,res.qhupdate.com
|
||||
DOMAIN-SUFFIX,res3.feedsportal.com
|
||||
DOMAIN-SUFFIX,rescn.u3.ucweb.com
|
||||
@@ -7222,7 +7211,6 @@ DOMAIN-SUFFIX,touclick.com
|
||||
DOMAIN-SUFFIX,toutiao.2haha.com
|
||||
DOMAIN-SUFFIX,toutiao.jxnews.com.cn
|
||||
DOMAIN-SUFFIX,tp.sgcn.com
|
||||
DOMAIN-SUFFIX,tpc.googlesyndication.com
|
||||
DOMAIN-SUFFIX,tpe163.com
|
||||
DOMAIN-SUFFIX,tpush.html5.qq.com
|
||||
DOMAIN-SUFFIX,tqd.ntpddq.com
|
||||
@@ -7515,7 +7503,6 @@ DOMAIN-SUFFIX,victorjx.com
|
||||
DOMAIN-SUFFIX,video.cooguo.com
|
||||
DOMAIN-SUFFIX,video.ureport.push.qq.com
|
||||
DOMAIN-SUFFIX,video.wap.mpush.qq.com
|
||||
DOMAIN-SUFFIX,video-ad-stats.googlesyndication.com
|
||||
DOMAIN-SUFFIX,videondun.com
|
||||
DOMAIN-SUFFIX,videopush.baidu.com
|
||||
DOMAIN-SUFFIX,viglink.com
|
||||
@@ -7674,7 +7661,6 @@ DOMAIN-SUFFIX,weyyae.com
|
||||
DOMAIN-SUFFIX,wgie.0z5jn.cn
|
||||
DOMAIN-SUFFIX,wgnlz.com
|
||||
DOMAIN-SUFFIX,wgnmp.com
|
||||
DOMAIN-SUFFIX,wgo.mmstat.com
|
||||
DOMAIN-SUFFIX,whafwl.com
|
||||
DOMAIN-SUFFIX,whalecloud.com
|
||||
DOMAIN-SUFFIX,whcrdz.com
|
||||
@@ -8114,7 +8100,6 @@ DOMAIN-SUFFIX,ysej.code.weddingeeos.com
|
||||
DOMAIN-SUFFIX,ysjwj.com
|
||||
DOMAIN-SUFFIX,ysm.hauchi.com.tw
|
||||
DOMAIN-SUFFIX,ysm.yahoo.com
|
||||
DOMAIN-SUFFIX,yt.mmstat.com
|
||||
DOMAIN-SUFFIX,yt-adp.nosdn.127.net
|
||||
DOMAIN-SUFFIX,ytapi1.nagezan.net
|
||||
DOMAIN-SUFFIX,ytdksb.com
|
||||
|
||||
38
base/rules/lhie1/Surge/Surge 3/Provider/Special.list
Normal file
38
base/rules/lhie1/Surge/Surge 3/Provider/Special.list
Normal file
@@ -0,0 +1,38 @@
|
||||
# > Google
|
||||
DOMAIN-KEYWORD,mtalk.google.com
|
||||
DOMAIN,safebrowsing.googleapis.com
|
||||
|
||||
# > Steam
|
||||
USER-AGENT,Steam*
|
||||
DOMAIN-SUFFIX,steamcontent.com
|
||||
|
||||
# > Private Tracker
|
||||
DOMAIN-SUFFIX,awesome-hd.me
|
||||
DOMAIN-SUFFIX,broadcasthe.net
|
||||
DOMAIN-SUFFIX,chdbits.co
|
||||
DOMAIN-SUFFIX,classix-unlimited.co.uk
|
||||
DOMAIN-SUFFIX,empornium.me
|
||||
DOMAIN-SUFFIX,gazellegames.net
|
||||
DOMAIN-SUFFIX,hdchina.org
|
||||
DOMAIN-SUFFIX,hdsky.me
|
||||
DOMAIN-SUFFIX,icetorrent.org
|
||||
DOMAIN-SUFFIX,jpopsuki.eu
|
||||
DOMAIN-SUFFIX,keepfrds.com
|
||||
DOMAIN-SUFFIX,madsrevolution.net
|
||||
DOMAIN-SUFFIX,m-team.cc
|
||||
DOMAIN-SUFFIX,nanyangpt.com
|
||||
DOMAIN-SUFFIX,ncore.cc
|
||||
DOMAIN-SUFFIX,open.cd
|
||||
DOMAIN-SUFFIX,ourbits.club
|
||||
DOMAIN-SUFFIX,passthepopcorn.me
|
||||
DOMAIN-SUFFIX,privatehd.to
|
||||
DOMAIN-SUFFIX,redacted.ch
|
||||
DOMAIN-SUFFIX,springsunday.net
|
||||
DOMAIN-SUFFIX,tjupt.org
|
||||
DOMAIN-SUFFIX,totheglory.im
|
||||
|
||||
DOMAIN-KEYWORD,announce
|
||||
DOMAIN-KEYWORD,torrent
|
||||
DOMAIN-KEYWORD,tracker
|
||||
DOMAIN-SUFFIX,smtp
|
||||
URL-REGEX,(Subject|HELO|SMTP)
|
||||
6
base/rules/lhie1/Surge/Surge 3/Provider/Steam.list
Normal file
6
base/rules/lhie1/Surge/Surge 3/Provider/Steam.list
Normal file
@@ -0,0 +1,6 @@
|
||||
# > Steam
|
||||
DOMAIN-SUFFIX,fanatical.com
|
||||
DOMAIN-SUFFIX,humblebundle.com
|
||||
DOMAIN-SUFFIX,steamcommunity.com
|
||||
DOMAIN-SUFFIX,steampowered.com
|
||||
DOMAIN-SUFFIX,steamstatic.com
|
||||
@@ -37,4 +37,4 @@ EU,🇪🇺
|
||||
(VN|越南),🇻🇳
|
||||
(ZA|南非),🇿🇦
|
||||
(?i:TW|Taiwan|新北|彰化|CHT|台湾|[^-]台|HINET),🇨🇳
|
||||
(?i:CN|China|回国|中国|江苏|北京|上海|广州|深圳|杭州|徐州|青岛|宁波|镇江|back),🇨🇳
|
||||
(?i:CN|China|回国|中国|江苏|北京|上海|广州|深圳|杭州|常州|徐州|青岛|宁波|镇江|back),🇨🇳
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
mkdir obj
|
||||
set -xe
|
||||
|
||||
apk add gcc g++ build-base linux-headers cmake make autoconf automake libtool
|
||||
@@ -8,15 +7,18 @@ apk add openssl-dev openssl-libs-static curl curl-dev curl-static nghttp2-static
|
||||
git clone https://github.com/jbeder/yaml-cpp
|
||||
cd yaml-cpp
|
||||
cmake -DYAML_CPP_BUILD_TESTS=OFF -DYAML_CPP_BUILD_TOOLS=OFF . > /dev/null
|
||||
make install -j4 > /dev/null
|
||||
make install -j2 > /dev/null
|
||||
cd ..
|
||||
|
||||
cmake .
|
||||
make -j4
|
||||
make -j2
|
||||
rm subconverter
|
||||
g++ -o base/subconverter CMakeFiles/subconverter.dir/src/*.o -static -lpcre2-8 -levent -lyaml-cpp -lcurl -lnghttp2 -lssl -lcrypto -lz -lbz2 -ldl -lpthread -O3 -s
|
||||
|
||||
cd base
|
||||
chmod +rx subconverter
|
||||
chmod +r *
|
||||
cd ..
|
||||
mv base subconverter
|
||||
|
||||
tar czf ../subconverter_linux64.tar.gz *
|
||||
tar czf subconverter_linux64.tar.gz subconverter/
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#!/bin/bash
|
||||
mkdir obj
|
||||
set -xe
|
||||
|
||||
brew reinstall yaml-cpp rapidjson libevent zlib pcre2 bzip2 pkgconfig
|
||||
|
||||
git clone https://github.com/curl/curl
|
||||
cd curl
|
||||
./buildconf > /dev/null
|
||||
./configure --with-ssl=/usr/local/opt/openssl@1.1 --without-mbedtls --disable-ldap --disable-ldaps --disable-rtsp --without-libidn2 > /dev/null
|
||||
#./buildconf > /dev/null
|
||||
#./configure --with-ssl=/usr/local/opt/openssl@1.1 --without-mbedtls --disable-ldap --disable-ldaps --disable-rtsp --without-libidn2 > /dev/null
|
||||
cmake -DHTTP_ONLY=ON -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1 . > /dev/null
|
||||
make -j8 > /dev/null
|
||||
cd ..
|
||||
|
||||
cp curl/lib/.libs/libcurl.a .
|
||||
cp curl/lib/libcurl.a .
|
||||
cp /usr/local/lib/libevent.a .
|
||||
cp /usr/local/opt/zlib/lib/libz.a .
|
||||
cp /usr/local/opt/openssl@1.1/lib/libssl.a .
|
||||
@@ -23,12 +23,14 @@ cp /usr/local/opt/bzip2/lib/libbz2.a .
|
||||
export CMAKE_CXX_FLAGS="-I/usr/local/include -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/curl/include"
|
||||
cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1 .
|
||||
make -j8
|
||||
rm subconverter
|
||||
c++ -Xlinker -unexported_symbol -Xlinker "*" -o base/subconverter CMakeFiles/subconverter.dir/src/*.o libpcre2-8.a libevent.a libcurl.a libz.a libssl.a libcrypto.a libyaml-cpp.a libbz2.a -ldl -lpthread -O3
|
||||
|
||||
cd base
|
||||
chmod +rx subconverter
|
||||
chmod +r *
|
||||
tar czf ../subconverter_darwin64.tar.gz *
|
||||
cd ..
|
||||
mv base subconverter
|
||||
tar czf subconverter_darwin64.tar.gz subconverter
|
||||
|
||||
set +xe
|
||||
|
||||
145
src/ini_reader.h
145
src/ini_reader.h
@@ -19,8 +19,6 @@ enum
|
||||
INIREADER_EXCEPTION_NONE
|
||||
};
|
||||
|
||||
#define __SAVE_ERROR_AND_RETURN(x) {last_error = x; return last_error;}
|
||||
|
||||
typedef std::map<std::string, std::multimap<std::string, std::string>> ini_data_struct;
|
||||
typedef std::multimap<std::string, std::string> string_multimap;
|
||||
typedef std::vector<std::string> string_array;
|
||||
@@ -38,8 +36,8 @@ private:
|
||||
bool parsed = false;
|
||||
std::string current_section;
|
||||
ini_data_struct ini_content;
|
||||
string_array exclude_sections, include_sections, read_sections;
|
||||
string_array section_order;
|
||||
string_array exclude_sections, include_sections, direct_save_sections;
|
||||
string_array read_sections, section_order;
|
||||
|
||||
std::string cached_section;
|
||||
string_multimap cached_section_content;
|
||||
@@ -50,7 +48,13 @@ private:
|
||||
int last_error = INIREADER_EXCEPTION_NONE;
|
||||
unsigned int last_error_index = 0;
|
||||
|
||||
bool chkIgnore(std::string section)
|
||||
inline int __priv_save_error_and_return(int x)
|
||||
{
|
||||
last_error = x;
|
||||
return last_error;
|
||||
}
|
||||
|
||||
inline bool __priv_chk_ignore(const std::string §ion)
|
||||
{
|
||||
bool excluded = false, included = false;
|
||||
excluded = std::find(exclude_sections.cbegin(), exclude_sections.cend(), section) != exclude_sections.cend();
|
||||
@@ -61,6 +65,30 @@ private:
|
||||
|
||||
return excluded || !included;
|
||||
}
|
||||
|
||||
inline bool __priv_chk_direct_save(const std::string §ion)
|
||||
{
|
||||
return std::find(direct_save_sections.cbegin(), direct_save_sections.cend(), section) != direct_save_sections.cend();
|
||||
}
|
||||
|
||||
inline std::string __priv_get_err_str(int error)
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case INIREADER_EXCEPTION_EMPTY:
|
||||
return "Empty document";
|
||||
case INIREADER_EXCEPTION_DUPLICATE:
|
||||
return "Duplicate section";
|
||||
case INIREADER_EXCEPTION_NOTEXIST:
|
||||
return "Target does not exist";
|
||||
case INIREADER_EXCEPTION_OUTOFBOUND:
|
||||
return "Item exists outside of any section";
|
||||
case INIREADER_EXCEPTION_NOTPARSED:
|
||||
return "Parse error";
|
||||
default:
|
||||
return "Undefined";
|
||||
}
|
||||
}
|
||||
public:
|
||||
/**
|
||||
* @brief Set this flag to true to do a UTF8-To-GBK conversion before parsing data. Only useful in Windows.
|
||||
@@ -129,31 +157,12 @@ public:
|
||||
|
||||
INIReader(const INIReader &src) = default;
|
||||
|
||||
std::string GetErrorString(int error)
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case INIREADER_EXCEPTION_EMPTY:
|
||||
return "Empty document";
|
||||
case INIREADER_EXCEPTION_DUPLICATE:
|
||||
return "Duplicate section";
|
||||
case INIREADER_EXCEPTION_NOTEXIST:
|
||||
return "Target does not exist";
|
||||
case INIREADER_EXCEPTION_OUTOFBOUND:
|
||||
return "Item exists outside of any section";
|
||||
case INIREADER_EXCEPTION_NOTPARSED:
|
||||
return "Parse error";
|
||||
default:
|
||||
return "Undefined";
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetLastError()
|
||||
{
|
||||
if(parsed)
|
||||
return GetErrorString(last_error);
|
||||
return __priv_get_err_str(last_error);
|
||||
else
|
||||
return "line " + std::to_string(last_error_index) + ": " + GetErrorString(last_error);
|
||||
return "line " + std::to_string(last_error_index) + ": " + __priv_get_err_str(last_error);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,6 +181,14 @@ public:
|
||||
include_sections.emplace_back(section);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add a section to the direct-save sections list.
|
||||
*/
|
||||
void AddDirectSaveSection(std::string section)
|
||||
{
|
||||
direct_save_sections.emplace_back(section);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set isolated items to given section.
|
||||
*/
|
||||
@@ -188,13 +205,13 @@ public:
|
||||
int Parse(std::string content) //parse content into mapped data
|
||||
{
|
||||
if(!content.size()) //empty content
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_EMPTY);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_EMPTY);
|
||||
|
||||
//remove UTF-8 BOM
|
||||
if(content.compare(0, 3, "\xEF\xBB\xBF") == 0)
|
||||
content.erase(0, 3);
|
||||
|
||||
bool inExcludedSection = false;
|
||||
bool inExcludedSection = false, inDirectSaveSection = false;
|
||||
std::string strLine, thisSection, curSection, itemName, itemVal;
|
||||
string_multimap itemGroup, existItemGroup;
|
||||
std::stringstream strStrm;
|
||||
@@ -206,7 +223,12 @@ public:
|
||||
content = UTF8ToACP(content); //do conversion if flag is set
|
||||
|
||||
if(store_isolated_line)
|
||||
{
|
||||
curSection = isolated_items_section; //items before any section define will be store in this section
|
||||
//check this section first
|
||||
inExcludedSection = __priv_chk_ignore(curSection); //check if this section is excluded
|
||||
inDirectSaveSection = __priv_chk_direct_save(curSection); //check if this section requires direct-save
|
||||
}
|
||||
strStrm<<content;
|
||||
last_error_index = 0; //reset error index
|
||||
while(getline(strStrm, strLine, delimiter)) //get one line of content
|
||||
@@ -220,20 +242,11 @@ public:
|
||||
}
|
||||
if(!lineSize || strLine[0] == ';' || strLine[0] == '#' || (lineSize >= 2 && strLine[0] == '/' && strLine[1] == '/')) //empty lines and comments are ignored
|
||||
continue;
|
||||
if(strLine.find("=") != strLine.npos) //is an item
|
||||
{
|
||||
if(inExcludedSection) //this section is excluded
|
||||
continue;
|
||||
if(!curSection.size()) //not in any section
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_OUTOFBOUND);
|
||||
itemName = trim(strLine.substr(0, strLine.find("=")));
|
||||
itemVal = trim(strLine.substr(strLine.find("=") + 1));
|
||||
itemGroup.emplace(itemName, itemVal); //insert to current section
|
||||
}
|
||||
else if(strLine[0] == '[' && strLine[lineSize - 1] == ']') //is a section title
|
||||
if(strLine[0] == '[' && strLine[lineSize - 1] == ']') //is a section title
|
||||
{
|
||||
thisSection = strLine.substr(1, lineSize - 2); //save section title
|
||||
inExcludedSection = chkIgnore(thisSection); //check if this section is excluded
|
||||
inExcludedSection = __priv_chk_ignore(thisSection); //check if this section is excluded
|
||||
inDirectSaveSection = __priv_chk_direct_save(thisSection); //check if this section requires direct-save
|
||||
|
||||
if(curSection.size() && (keep_empty_section || itemGroup.size())) //just finished reading a section
|
||||
{
|
||||
@@ -247,7 +260,7 @@ public:
|
||||
itemGroup.emplace(x); //insert them all into new section
|
||||
}
|
||||
else if(ini_content.at(curSection).size())
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_DUPLICATE); //not allowed, stop
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_DUPLICATE); //not allowed, stop
|
||||
ini_content.erase(curSection); //remove the old section
|
||||
}
|
||||
else if(itemGroup.size())
|
||||
@@ -260,10 +273,20 @@ public:
|
||||
eraseElements(itemGroup); //reset section storage
|
||||
curSection = thisSection; //start a new section
|
||||
}
|
||||
else if(store_any_line && !inExcludedSection && curSection.size()) //store a line without name
|
||||
else if(((store_any_line && strLine.find("=") == strLine.npos) || inDirectSaveSection) && !inExcludedSection && curSection.size()) //store a line without name
|
||||
{
|
||||
itemGroup.emplace("{NONAME}", strLine);
|
||||
}
|
||||
else if(strLine.find("=") != strLine.npos) //is an item
|
||||
{
|
||||
if(inExcludedSection) //this section is excluded
|
||||
continue;
|
||||
if(!curSection.size()) //not in any section
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_OUTOFBOUND);
|
||||
itemName = trim(strLine.substr(0, strLine.find("=")));
|
||||
itemVal = trim(strLine.substr(strLine.find("=") + 1));
|
||||
itemGroup.emplace(itemName, itemVal); //insert to current section
|
||||
}
|
||||
if(include_sections.size() && include_sections == read_sections) //all included sections has been read
|
||||
break; //exit now
|
||||
}
|
||||
@@ -279,7 +302,7 @@ public:
|
||||
itemGroup.emplace(x); //insert them all into new section
|
||||
}
|
||||
else if(ini_content.at(curSection).size())
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_DUPLICATE); //not allowed, stop
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_DUPLICATE); //not allowed, stop
|
||||
ini_content.erase(curSection); //remove the old section
|
||||
}
|
||||
else if(itemGroup.size())
|
||||
@@ -289,7 +312,7 @@ public:
|
||||
section_order.emplace_back(curSection);
|
||||
}
|
||||
parsed = true;
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NONE); //all done
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NONE); //all done
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -298,7 +321,7 @@ public:
|
||||
int ParseFile(std::string filePath)
|
||||
{
|
||||
if(!fileExist(filePath))
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return Parse(fileGet(filePath));
|
||||
}
|
||||
|
||||
@@ -340,10 +363,10 @@ public:
|
||||
int EnterSection(std::string section)
|
||||
{
|
||||
if(!SectionExist(section))
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
current_section = cached_section = section;
|
||||
cached_section_content = ini_content.at(section);
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NONE);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -416,7 +439,7 @@ public:
|
||||
unsigned int ItemCount(std::string section)
|
||||
{
|
||||
if(!parsed || !SectionExist(section))
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTPARSED);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTPARSED);
|
||||
|
||||
return ini_content.at(section).size();
|
||||
}
|
||||
@@ -437,7 +460,7 @@ public:
|
||||
int GetItems(std::string section, string_multimap &data)
|
||||
{
|
||||
if(!parsed || !SectionExist(section))
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
|
||||
if(cached_section != section)
|
||||
{
|
||||
@@ -446,7 +469,7 @@ public:
|
||||
}
|
||||
|
||||
data = cached_section_content;
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NONE);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -463,12 +486,12 @@ public:
|
||||
int GetAll(std::string section, std::string itemName, string_array &results) //retrieve item(s) with the same itemName prefix
|
||||
{
|
||||
if(!parsed)
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTPARSED);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTPARSED);
|
||||
|
||||
string_multimap mapTemp;
|
||||
|
||||
if(GetItems(section, mapTemp) != 0)
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
|
||||
for(auto &x : mapTemp)
|
||||
{
|
||||
@@ -476,7 +499,7 @@ public:
|
||||
results.emplace_back(x.second);
|
||||
}
|
||||
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NONE);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -600,7 +623,7 @@ public:
|
||||
int Set(std::string section, std::string itemName, std::string itemVal)
|
||||
{
|
||||
if(!section.size())
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
|
||||
if(!parsed)
|
||||
parsed = true;
|
||||
@@ -618,7 +641,7 @@ public:
|
||||
section_order.emplace_back(section);
|
||||
}
|
||||
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NONE);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -627,7 +650,7 @@ public:
|
||||
int Set(std::string itemName, std::string itemVal)
|
||||
{
|
||||
if(!current_section.size())
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return Set(current_section, itemName, itemVal);
|
||||
}
|
||||
|
||||
@@ -702,7 +725,7 @@ public:
|
||||
int RenameSection(std::string oldName, std::string newName)
|
||||
{
|
||||
if(!SectionExist(oldName) || SectionExist(newName))
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_DUPLICATE);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_DUPLICATE);
|
||||
/*
|
||||
auto nodeHandler = ini_content.extract(oldName);
|
||||
nodeHandler.key() = newName;
|
||||
@@ -711,7 +734,7 @@ public:
|
||||
ini_content[newName] = std::move(ini_content[oldName]);
|
||||
ini_content.erase(oldName);
|
||||
std::replace(section_order.begin(), section_order.end(), oldName, newName);
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NONE);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -721,7 +744,7 @@ public:
|
||||
{
|
||||
int retVal;
|
||||
if(!SectionExist(section))
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
|
||||
retVal = ini_content.at(section).erase(itemName);
|
||||
if(retVal && cached_section == section)
|
||||
@@ -753,11 +776,11 @@ public:
|
||||
{
|
||||
cached_section_content = mapTemp;
|
||||
}
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NONE);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NONE);
|
||||
}
|
||||
else
|
||||
{
|
||||
__SAVE_ERROR_AND_RETURN(INIREADER_EXCEPTION_NOTEXIST);
|
||||
return __priv_save_error_and_return(INIREADER_EXCEPTION_NOTEXIST);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
#include "subexport.h"
|
||||
#include "multithread.h"
|
||||
#include "logger.h"
|
||||
#include "string_hash.h"
|
||||
|
||||
//common settings
|
||||
std::string pref_path = "pref.ini";
|
||||
bool generator_mode = false;
|
||||
string_array def_exclude_remarks, def_include_remarks, rulesets, stream_rules, time_rules;
|
||||
std::vector<ruleset_content> ruleset_content_array;
|
||||
std::string listen_address = "127.0.0.1", default_url, insert_url, managed_config_prefix;
|
||||
@@ -27,6 +27,11 @@ bool api_mode = true, write_managed_config = false, enable_rule_generator = true
|
||||
bool print_debug_info = false, cfw_child_process = false, append_userinfo = true, enable_base_gen = false;
|
||||
std::string access_token;
|
||||
extern std::string custom_group;
|
||||
extern int global_log_level;
|
||||
|
||||
//generator settings
|
||||
bool generator_mode = false;
|
||||
std::string gen_profile;
|
||||
|
||||
//multi-thread lock
|
||||
std::mutex on_configuring;
|
||||
@@ -54,7 +59,7 @@ string_array regex_blacklist = {"(.*)*"};
|
||||
|
||||
template <typename T> void operator >> (const YAML::Node& node, T& i)
|
||||
{
|
||||
if(node.IsDefined()) //fail-safe
|
||||
if(node.IsDefined() && !node.IsNull()) //fail-safe
|
||||
i = node.as<T>();
|
||||
};
|
||||
|
||||
@@ -244,6 +249,7 @@ void readGroup(YAML::Node node, string_array &dest)
|
||||
|
||||
for(i = 0; i < node.size(); i++)
|
||||
{
|
||||
name.clear();
|
||||
eraseElements(tempArray);
|
||||
object = node[i];
|
||||
object["import"] >> name;
|
||||
@@ -287,7 +293,8 @@ void readRuleset(YAML::Node node, string_array &dest)
|
||||
|
||||
for(unsigned int i = 0; i < node.size(); i++)
|
||||
{
|
||||
name = "";
|
||||
url.clear();
|
||||
name.clear();
|
||||
object = node[i];
|
||||
object["import"] >> name;
|
||||
if(name.size())
|
||||
@@ -339,14 +346,16 @@ void refreshRulesets(string_array &ruleset_list, std::vector<ruleset_content> &r
|
||||
rule_url = trim(x.substr(x.find(",") + 1));
|
||||
if(rule_url.find("[]") == 0)
|
||||
{
|
||||
std::cerr<<"Adding rule '"<<rule_url.substr(2)<<","<<rule_group<<"'."<<std::endl;
|
||||
writeLog(0, "Adding rule '" + rule_url.substr(2) + "," + rule_group + "'.", LOG_LEVEL_INFO);
|
||||
//std::cerr<<"Adding rule '"<<rule_url.substr(2)<<","<<rule_group<<"'."<<std::endl;
|
||||
rc = {rule_group, "", rule_url};
|
||||
rca.emplace_back(rc);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr<<"Updating ruleset url '"<<rule_url<<"' with group '"<<rule_group<<"'."<<std::endl;
|
||||
//std::cerr<<"Updating ruleset url '"<<rule_url<<"' with group '"<<rule_group<<"'."<<std::endl;
|
||||
writeLog(0, "Updating ruleset url '" + rule_url + "' with group '" + rule_group + "'.", LOG_LEVEL_INFO);
|
||||
if(fileExist(rule_url))
|
||||
{
|
||||
rc = {rule_group, rule_url, fileGet(rule_url)};
|
||||
@@ -361,7 +370,8 @@ void refreshRulesets(string_array &ruleset_list, std::vector<ruleset_content> &r
|
||||
if(rc.rule_content.size())
|
||||
rca.emplace_back(rc);
|
||||
else
|
||||
std::cerr<<"Warning: No data was fetched from this link. Skipping..."<<std::endl;
|
||||
//std::cerr<<"Warning: No data was fetched from this link. Skipping..."<<std::endl;
|
||||
writeLog(0, "Warning: No data was fetched from ruleset '" + rule_url + "'. Skipping...", LOG_LEVEL_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -377,21 +387,27 @@ void readYAMLConf(YAML::Node &node)
|
||||
{
|
||||
section["default_url"] >> tempArray;
|
||||
if(tempArray.size())
|
||||
strLine = std::accumulate(std::next(tempArray.begin()), tempArray.end(), tempArray[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "|" + std::move(b);
|
||||
});
|
||||
default_url = strLine;
|
||||
strLine = std::accumulate(std::next(tempArray.begin()), tempArray.end(), tempArray[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "|" + std::move(b);
|
||||
});
|
||||
default_url = strLine;
|
||||
eraseElements(tempArray);
|
||||
}
|
||||
}
|
||||
if(section["insert_url"].IsSequence())
|
||||
{
|
||||
section["insert_url"] >> tempArray;
|
||||
if(tempArray.size())
|
||||
strLine = std::accumulate(std::next(tempArray.begin()), tempArray.end(), tempArray[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "|" + std::move(b);
|
||||
});
|
||||
insert_url = strLine;
|
||||
strLine = std::accumulate(std::next(tempArray.begin()), tempArray.end(), tempArray[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "|" + std::move(b);
|
||||
});
|
||||
insert_url = strLine;
|
||||
eraseElements(tempArray);
|
||||
}
|
||||
}
|
||||
if(section["exclude_remarks"].IsSequence())
|
||||
section["exclude_remarks"] >> def_exclude_remarks;
|
||||
@@ -415,13 +431,13 @@ void readYAMLConf(YAML::Node &node)
|
||||
section = node["userinfo"];
|
||||
if(section["stream_rule"].IsSequence())
|
||||
{
|
||||
readRegexMatch(section["stream_rule"], "@", tempArray);
|
||||
readRegexMatch(section["stream_rule"], "|", tempArray);
|
||||
safe_set_streams(tempArray);
|
||||
eraseElements(tempArray);
|
||||
}
|
||||
if(section["time_rule"].IsSequence())
|
||||
{
|
||||
readRegexMatch(section["time_rule"], "@", tempArray);
|
||||
readRegexMatch(section["time_rule"], "|", tempArray);
|
||||
safe_set_times(tempArray);
|
||||
eraseElements(tempArray);
|
||||
}
|
||||
@@ -500,7 +516,34 @@ void readYAMLConf(YAML::Node &node)
|
||||
|
||||
if(node["advanced"].IsDefined())
|
||||
{
|
||||
std::string log_level;
|
||||
node["advanced"]["log_level"] >> log_level;
|
||||
node["advanced"]["print_debug_info"] >> print_debug_info;
|
||||
if(print_debug_info)
|
||||
global_log_level = LOG_LEVEL_VERBOSE;
|
||||
else
|
||||
{
|
||||
switch(hash_(log_level))
|
||||
{
|
||||
case "warn"_hash:
|
||||
global_log_level = LOG_LEVEL_WARNING;
|
||||
break;
|
||||
case "error"_hash:
|
||||
global_log_level = LOG_LEVEL_ERROR;
|
||||
break;
|
||||
case "fatal"_hash:
|
||||
global_log_level = LOG_LEVEL_FATAL;
|
||||
break;
|
||||
case "verbose"_hash:
|
||||
global_log_level = LOG_LEVEL_VERBOSE;
|
||||
break;
|
||||
case "debug"_hash:
|
||||
global_log_level = LOG_LEVEL_DEBUG;
|
||||
break;
|
||||
default:
|
||||
global_log_level = LOG_LEVEL_INFO;
|
||||
}
|
||||
}
|
||||
node["advanced"]["max_pending_connections"] >> max_pending_connections;
|
||||
node["advanced"]["max_concurrent_threads"] >> max_concurrent_threads;
|
||||
node["advanced"]["enable_base_gen"] >> enable_base_gen;
|
||||
@@ -521,7 +564,8 @@ void readYAMLConf(YAML::Node &node)
|
||||
void readConf()
|
||||
{
|
||||
guarded_mutex guard(on_configuring);
|
||||
std::cerr<<"Reading preference settings..."<<std::endl;
|
||||
//std::cerr<<"Reading preference settings..."<<std::endl;
|
||||
writeLog(0, "Reading preference settings...", LOG_LEVEL_INFO);
|
||||
|
||||
eraseElements(def_exclude_remarks);
|
||||
eraseElements(def_include_remarks);
|
||||
@@ -530,9 +574,13 @@ void readConf()
|
||||
|
||||
try
|
||||
{
|
||||
YAML::Node yaml = YAML::LoadFile(pref_path);
|
||||
if(yaml.size() && yaml["common"])
|
||||
return readYAMLConf(yaml);
|
||||
std::string prefdata = fileGet(pref_path, false);
|
||||
if(prefdata.find("common:") != prefdata.npos)
|
||||
{
|
||||
YAML::Node yaml = YAML::Load(prefdata);
|
||||
if(yaml.size() && yaml["common"])
|
||||
return readYAMLConf(yaml);
|
||||
}
|
||||
}
|
||||
catch (YAML::Exception &e)
|
||||
{
|
||||
@@ -545,7 +593,8 @@ void readConf()
|
||||
int retVal = ini.ParseFile(pref_path);
|
||||
if(retVal != INIREADER_EXCEPTION_NONE)
|
||||
{
|
||||
std::cerr<<"Unable to load preference settings. Reason: "<<ini.GetLastError()<<"\n";
|
||||
//std::cerr<<"Unable to load preference settings. Reason: "<<ini.GetLastError()<<"\n";
|
||||
writeLog(0, "Unable to load preference settings. Reason: " + ini.GetLastError(), LOG_LEVEL_FATAL);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -696,8 +745,36 @@ void readConf()
|
||||
listen_port = ini.GetInt("port");
|
||||
|
||||
ini.EnterSection("advanced");
|
||||
std::string log_level;
|
||||
if(ini.ItemExist("log_level"))
|
||||
log_level = ini.Get("log_level");
|
||||
if(ini.ItemExist("print_debug_info"))
|
||||
print_debug_info = ini.GetBool("print_debug_info");
|
||||
if(print_debug_info)
|
||||
global_log_level = LOG_LEVEL_VERBOSE;
|
||||
else
|
||||
{
|
||||
switch(hash_(log_level))
|
||||
{
|
||||
case "warn"_hash:
|
||||
global_log_level = LOG_LEVEL_WARNING;
|
||||
break;
|
||||
case "error"_hash:
|
||||
global_log_level = LOG_LEVEL_ERROR;
|
||||
break;
|
||||
case "fatal"_hash:
|
||||
global_log_level = LOG_LEVEL_FATAL;
|
||||
break;
|
||||
case "verbose"_hash:
|
||||
global_log_level = LOG_LEVEL_VERBOSE;
|
||||
break;
|
||||
case "debug"_hash:
|
||||
global_log_level = LOG_LEVEL_DEBUG;
|
||||
break;
|
||||
default:
|
||||
global_log_level = LOG_LEVEL_INFO;
|
||||
}
|
||||
}
|
||||
if(ini.ItemExist("max_pending_connections"))
|
||||
max_pending_connections = ini.GetInt("max_pending_connections");
|
||||
if(ini.ItemExist("max_concurrent_threads"))
|
||||
@@ -719,7 +796,8 @@ void readConf()
|
||||
cache_subscription = cache_config = cache_ruleset = 0; //disable cache
|
||||
}
|
||||
|
||||
std::cerr<<"Read preference settings completed."<<std::endl;
|
||||
//std::cerr<<"Read preference settings completed."<<std::endl;
|
||||
writeLog(0, "Read preference settings completed.", LOG_LEVEL_INFO);
|
||||
}
|
||||
|
||||
struct ExternalConfig
|
||||
@@ -805,7 +883,8 @@ int loadExternalConfig(std::string &path, ExternalConfig &ext)
|
||||
ini.SetIsolatedItemsSection("custom");
|
||||
if(ini.Parse(base_content) != INIREADER_EXCEPTION_NONE)
|
||||
{
|
||||
std::cerr<<"Load external configuration failed. Reason: "<<ini.GetLastError()<<"\n";
|
||||
//std::cerr<<"Load external configuration failed. Reason: "<<ini.GetLastError()<<"\n";
|
||||
writeLog(0, "Load external configuration failed. Reason: " + ini.GetLastError(), LOG_LEVEL_ERROR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -864,8 +943,8 @@ void generateBase()
|
||||
if(!enable_base_gen)
|
||||
return;
|
||||
std::string base_content;
|
||||
int retVal = 0;
|
||||
std::cerr<<"Generating base content for Clash/R...\n";
|
||||
//std::cerr<<"Generating base content for Clash/R...\n";
|
||||
writeLog(0, "Generating base content for Clash/R...", LOG_LEVEL_INFO);
|
||||
if(fileExist(clash_rule_base))
|
||||
base_content = fileGet(clash_rule_base);
|
||||
else
|
||||
@@ -877,7 +956,8 @@ void generateBase()
|
||||
}
|
||||
catch (YAML::Exception &e)
|
||||
{
|
||||
std::cerr<<"Unable to load Clash base content. Reason: "<<e.msg<<"\n";
|
||||
//std::cerr<<"Unable to load Clash base content. Reason: "<<e.msg<<"\n";
|
||||
writeLog(0, "Unable to load Clash base content. Reason: " + e.msg, LOG_LEVEL_ERROR);
|
||||
}
|
||||
// mellow base generate removed for now
|
||||
/*
|
||||
@@ -888,8 +968,7 @@ void generateBase()
|
||||
base_content = webGet(mellow_rule_base, getSystemProxy());
|
||||
mellow_base.keep_empty_section = true;
|
||||
mellow_base.store_any_line = true;
|
||||
retVal = mellow_base.Parse(base_content);
|
||||
if(retVal != INIREADER_EXCEPTION_NONE)
|
||||
if(mellow_base.Parse(base_content) != INIREADER_EXCEPTION_NONE)
|
||||
std::cerr<<"Unable to load Mellow base content. Reason: "<<mellow_base.GetLastError()<<"\n";
|
||||
else
|
||||
rulesetToSurge(mellow_base, ruleset_content_array, 0, overwrite_original_rules, std::string());
|
||||
@@ -903,7 +982,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
std::string append_type = getUrlArg(argument, "append_type"), tfo = getUrlArg(argument, "tfo"), udp = getUrlArg(argument, "udp"), nodelist = getUrlArg(argument, "list");
|
||||
std::string include = UrlDecode(getUrlArg(argument, "include")), exclude = UrlDecode(getUrlArg(argument, "exclude")), sort_flag = getUrlArg(argument, "sort");
|
||||
std::string scv = getUrlArg(argument, "scv"), fdn = getUrlArg(argument, "fdn"), expand = getUrlArg(argument, "expand"), append_sub_userinfo = getUrlArg(argument, "append_info");
|
||||
std::string dev_id = getUrlArg(argument, "dev_id"), filename = UrlDecode(getUrlArg(argument, "filename")), interval_str = getUrlArg(argument, "interval"), strict_str = getUrlArg(argument, "strict");
|
||||
std::string dev_id = getUrlArg(argument, "dev_id"), filename = getUrlArg(argument, "filename"), interval_str = getUrlArg(argument, "interval"), strict_str = getUrlArg(argument, "strict");
|
||||
std::string base_content, output_content;
|
||||
string_array extra_group, extra_ruleset, include_remarks, exclude_remarks;
|
||||
std::string groups = urlsafe_base64_decode(getUrlArg(argument, "groups")), ruleset = urlsafe_base64_decode(getUrlArg(argument, "ruleset")), config = UrlDecode(getUrlArg(argument, "config"));
|
||||
@@ -932,7 +1011,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
|
||||
//check if we need to read configuration
|
||||
if(!api_mode || cfw_child_process)
|
||||
if((!api_mode || cfw_child_process) && !generator_mode)
|
||||
readConf();
|
||||
|
||||
//check for proxy settings
|
||||
@@ -973,13 +1052,15 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
ext.surge_ssr_path = surge_ssr_path;
|
||||
ext.quanx_dev_id = dev_id.size() ? dev_id : quanx_script_id;
|
||||
ext.enable_rule_generator = enable_rule_generator;
|
||||
ext.overwrite_original_rules = overwrite_original_rules;
|
||||
if(expand != "true")
|
||||
ext.managed_config_prefix = managed_config_prefix;
|
||||
|
||||
//load external configuration
|
||||
if(config.size())
|
||||
{
|
||||
std::cerr<<"External configuration file provided. Loading...\n";
|
||||
//std::cerr<<"External configuration file provided. Loading...\n";
|
||||
writeLog(0, "External configuration file provided. Loading...", LOG_LEVEL_INFO);
|
||||
//read predefined data first
|
||||
extra_group = clash_extra_group;
|
||||
extra_ruleset = rulesets;
|
||||
@@ -1089,7 +1170,8 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
for(std::string &x : urls)
|
||||
{
|
||||
x = trim(x);
|
||||
std::cerr<<"Fetching node data from url '"<<x<<"'."<<std::endl;
|
||||
//std::cerr<<"Fetching node data from url '"<<x<<"'."<<std::endl;
|
||||
writeLog(0, "Fetching node data from url '" + x + "'.", LOG_LEVEL_INFO);
|
||||
if(addNodes(x, nodes, groupID, proxy, exclude_remarks, include_remarks, stream_temp, time_temp, subInfo, authorized) == -1)
|
||||
{
|
||||
*status_code = 400;
|
||||
@@ -1115,10 +1197,11 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
string_array dummy_group;
|
||||
std::vector<ruleset_content> dummy_ruleset;
|
||||
|
||||
std::cerr<<"Generate target: ";
|
||||
//std::cerr<<"Generate target: ";
|
||||
if(target == "clash" || target == "clashr")
|
||||
{
|
||||
std::cerr<<"Clash"<<((target == "clashr") ? "R" : "")<<std::endl;
|
||||
//std::cerr<<"Clash"<<((target == "clashr") ? "R" : "")<<std::endl;
|
||||
writeLog(0, target == "clashr" ? "Generate target: ClashR" : "Generate target: Clash", LOG_LEVEL_INFO);
|
||||
if(ext.nodelist)
|
||||
{
|
||||
YAML::Node yamlnode;
|
||||
@@ -1147,7 +1230,8 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
else if(target == "surge")
|
||||
{
|
||||
int surge_ver = version.size() ? to_int(version, 3) : 3;
|
||||
std::cerr<<"Surge "<<surge_ver<<std::endl;
|
||||
//std::cerr<<"Surge "<<surge_ver<<std::endl;
|
||||
writeLog(0, "Generate target: Surge " + std::to_string(surge_ver), LOG_LEVEL_INFO);
|
||||
|
||||
if(ext.nodelist)
|
||||
{
|
||||
@@ -1171,7 +1255,8 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
else if(target == "surfboard")
|
||||
{
|
||||
std::cerr<<"Surfboard"<<std::endl;
|
||||
//std::cerr<<"Surfboard"<<std::endl;
|
||||
writeLog(0, "Generate target: Surfboard", LOG_LEVEL_INFO);
|
||||
if(fileExist(ext_surfboard_base))
|
||||
base_content = fileGet(ext_surfboard_base);
|
||||
else
|
||||
@@ -1187,7 +1272,8 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
else if(target == "mellow")
|
||||
{
|
||||
std::cerr<<"Mellow"<<std::endl;
|
||||
//std::cerr<<"Mellow"<<std::endl;
|
||||
writeLog(0, "Generate target: Mellow", LOG_LEVEL_INFO);
|
||||
// mellow base generator removed for now
|
||||
//if(ruleset_updated || update_ruleset_on_request || ext_mellow_base != mellow_rule_base || !enable_base_gen)
|
||||
{
|
||||
@@ -1213,7 +1299,8 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
else if(target == "ss")
|
||||
{
|
||||
std::cerr<<"SS"<<std::endl;
|
||||
//std::cerr<<"SS"<<std::endl;
|
||||
writeLog(0, "Generate target: SS", LOG_LEVEL_INFO);
|
||||
output_content = netchToSS(nodes, ext);
|
||||
if(upload == "true")
|
||||
uploadGist("ss", upload_path, output_content, false);
|
||||
@@ -1221,28 +1308,32 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
else if(target == "sssub")
|
||||
{
|
||||
std::cerr<<"SS Subscription"<<std::endl;
|
||||
//std::cerr<<"SS Subscription"<<std::endl;
|
||||
writeLog(0, "Generate target: SS Subscription", LOG_LEVEL_INFO);
|
||||
output_content = netchToSSSub(nodes, ext);
|
||||
if(upload == "true")
|
||||
uploadGist("sssub", upload_path, output_content, false);
|
||||
}
|
||||
else if(target == "ssr")
|
||||
{
|
||||
std::cerr<<"SSR"<<std::endl;
|
||||
//std::cerr<<"SSR"<<std::endl;
|
||||
writeLog(0, "Generate target: SSR", LOG_LEVEL_INFO);
|
||||
output_content = netchToSSR(nodes, ext);
|
||||
if(upload == "true")
|
||||
uploadGist("ssr", upload_path, output_content, false);
|
||||
}
|
||||
else if(target == "v2ray")
|
||||
{
|
||||
std::cerr<<"v2rayN"<<std::endl;
|
||||
//std::cerr<<"v2rayN"<<std::endl;
|
||||
writeLog(0, "Generate target: v2rayN", LOG_LEVEL_INFO);
|
||||
output_content = netchToVMess(nodes, ext);
|
||||
if(upload == "true")
|
||||
uploadGist("v2ray", upload_path, output_content, false);
|
||||
}
|
||||
else if(target == "quan")
|
||||
{
|
||||
std::cerr<<"Quantumult"<<std::endl;
|
||||
//std::cerr<<"Quantumult"<<std::endl;
|
||||
writeLog(0, "Generate target: Quantumult", LOG_LEVEL_INFO);
|
||||
if(!ext.nodelist)
|
||||
{
|
||||
if(fileExist(ext_quan_base))
|
||||
@@ -1258,7 +1349,8 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
else if(target == "quanx")
|
||||
{
|
||||
std::cerr<<"Quantumult X"<<std::endl;
|
||||
//std::cerr<<"Quantumult X"<<std::endl;
|
||||
writeLog(0, "Generate target: Quantumult X", LOG_LEVEL_INFO);
|
||||
if(!ext.nodelist)
|
||||
{
|
||||
if(fileExist(ext_quanx_base))
|
||||
@@ -1274,7 +1366,8 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
else if(target == "loon")
|
||||
{
|
||||
std::cerr<<"Loon"<<std::endl;
|
||||
//std::cerr<<"Loon"<<std::endl;
|
||||
writeLog(0, "Generate target: Loon", LOG_LEVEL_INFO);
|
||||
if(!ext.nodelist)
|
||||
{
|
||||
if(fileExist(ext_loon_base))
|
||||
@@ -1290,17 +1383,20 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
else if(target == "ssd")
|
||||
{
|
||||
std::cerr<<"SSD"<<std::endl;
|
||||
//std::cerr<<"SSD"<<std::endl;
|
||||
writeLog(0, "Generate target: SSD", LOG_LEVEL_INFO);
|
||||
output_content = netchToSSD(nodes, group, subInfo, ext);
|
||||
if(upload == "true")
|
||||
uploadGist("ssd", upload_path, output_content, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr<<"Unspecified"<<std::endl;
|
||||
//std::cerr<<"Unspecified"<<std::endl;
|
||||
writeLog(0, "Generate target: Unspecified", LOG_LEVEL_INFO);
|
||||
*status_code = 500;
|
||||
return "Unrecognized target";
|
||||
}
|
||||
writeLog(0, "Generate completed.", LOG_LEVEL_INFO);
|
||||
if(filename.size())
|
||||
extra_headers.emplace("Content-Disposition", "attachment; filename=\"" + filename + "\"");
|
||||
return output_content;
|
||||
@@ -1358,7 +1454,8 @@ std::string simpleToClashR(RESPONSE_CALLBACK_ARGS)
|
||||
for(std::string &x : urls)
|
||||
{
|
||||
x = trim(x);
|
||||
std::cerr<<"Fetching node data from url '"<<x<<"'."<<std::endl;
|
||||
//std::cerr<<"Fetching node data from url '"<<x<<"'."<<std::endl;
|
||||
writeLog(0, "Fetching node data from url '" + x + "'.", LOG_LEVEL_INFO);
|
||||
if(addNodes(x, nodes, groupID, proxy, exclude_remarks, include_remarks, dummy, dummy, subInfo, false) == -1)
|
||||
{
|
||||
*status_code = 400;
|
||||
@@ -1418,14 +1515,16 @@ std::string surgeConfToClash(RESPONSE_CALLBACK_ARGS)
|
||||
if(ini.Parse(base_content) != INIREADER_EXCEPTION_NONE)
|
||||
{
|
||||
std::string errmsg = "Parsing Surge config failed! Reason: " + ini.GetLastError();
|
||||
std::cerr<<errmsg<<"\n";
|
||||
//std::cerr<<errmsg<<"\n";
|
||||
writeLog(0, errmsg, LOG_LEVEL_ERROR);
|
||||
*status_code = 400;
|
||||
return errmsg;
|
||||
}
|
||||
if(!ini.SectionExist("Proxy") || !ini.SectionExist("Proxy Group") || !ini.SectionExist("Rule"))
|
||||
{
|
||||
std::string errmsg = "Incomplete surge config! Missing critical sections!";
|
||||
std::cerr<<errmsg<<"\n";
|
||||
//std::cerr<<errmsg<<"\n";
|
||||
writeLog(0, errmsg, LOG_LEVEL_ERROR);
|
||||
*status_code = 400;
|
||||
return errmsg;
|
||||
}
|
||||
@@ -1474,7 +1573,8 @@ std::string surgeConfToClash(RESPONSE_CALLBACK_ARGS)
|
||||
std::string subInfo;
|
||||
for(std::string &x : links)
|
||||
{
|
||||
std::cerr<<"Fetching node data from url '"<<x<<"'."<<std::endl;
|
||||
//std::cerr<<"Fetching node data from url '"<<x<<"'."<<std::endl;
|
||||
writeLog(0, "Fetching node data from url '" + x + "'.", LOG_LEVEL_INFO);
|
||||
if(addNodes(x, nodes, 0, proxy, dummy_str_array, dummy_str_array, dummy_str_array, dummy_str_array, subInfo, false) == -1)
|
||||
{
|
||||
*status_code = 400;
|
||||
@@ -1573,8 +1673,8 @@ std::string surgeConfToClash(RESPONSE_CALLBACK_ARGS)
|
||||
|
||||
std::string getProfile(RESPONSE_CALLBACK_ARGS)
|
||||
{
|
||||
std::string name = UrlDecode(getUrlArg(argument, "name")), token = UrlDecode(getUrlArg(argument, "token"));
|
||||
if(token != access_token)
|
||||
std::string name = UrlDecode(getUrlArg(argument, "name")), token = UrlDecode(getUrlArg(argument, "token")), expand = getUrlArg(argument, "expand");
|
||||
if(token.empty() || name.empty())
|
||||
{
|
||||
*status_code = 403;
|
||||
return "Forbidden";
|
||||
@@ -1584,24 +1684,47 @@ std::string getProfile(RESPONSE_CALLBACK_ARGS)
|
||||
*status_code = 404;
|
||||
return "Profile not found";
|
||||
}
|
||||
std::cerr<<"Trying to load profile '" + name + "'.\n";
|
||||
//std::cerr<<"Trying to load profile '" + name + "'.\n";
|
||||
writeLog(0, "Trying to load profile '" + name + "'.", LOG_LEVEL_INFO);
|
||||
INIReader ini;
|
||||
if(ini.ParseFile(name) != INIREADER_EXCEPTION_NONE && !ini.SectionExist("Profile"))
|
||||
{
|
||||
std::cerr<<"Load profile failed! Reason: "<<ini.GetLastError()<<"\n";
|
||||
//std::cerr<<"Load profile failed! Reason: "<<ini.GetLastError()<<"\n";
|
||||
writeLog(0, "Load profile failed! Reason: " + ini.GetLastError(), LOG_LEVEL_ERROR);
|
||||
*status_code = 500;
|
||||
return "Broken profile!";
|
||||
}
|
||||
std::cerr<<"Trying to parse profile '" + name + "'.\n";
|
||||
//std::cerr<<"Trying to parse profile '" + name + "'.\n";
|
||||
writeLog(0, "Trying to parse profile '" + name + "'.", LOG_LEVEL_INFO);
|
||||
string_multimap contents;
|
||||
ini.GetItems("Profile", contents);
|
||||
if(!contents.size())
|
||||
{
|
||||
std::cerr<<"Load profile failed! Reason: Empty Profile section\n";
|
||||
//std::cerr<<"Load profile failed! Reason: Empty Profile section\n";
|
||||
writeLog(0, "Load profile failed! Reason: Empty Profile section", LOG_LEVEL_ERROR);
|
||||
*status_code = 500;
|
||||
return "Broken profile!";
|
||||
}
|
||||
auto profile_token = contents.find("profile_token");
|
||||
if(profile_token != contents.end())
|
||||
{
|
||||
if(token != profile_token->second)
|
||||
{
|
||||
*status_code = 403;
|
||||
return "Forbidden";
|
||||
}
|
||||
token = access_token;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(token != access_token)
|
||||
{
|
||||
*status_code = 403;
|
||||
return "Forbidden";
|
||||
}
|
||||
}
|
||||
contents.emplace("token", token);
|
||||
contents.emplace("expand", expand);
|
||||
std::string query;
|
||||
for(auto &x : contents)
|
||||
{
|
||||
@@ -1693,3 +1816,203 @@ std::string getRewriteRemote(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
return output_content;
|
||||
}
|
||||
|
||||
static inline std::string intToStream(unsigned long long stream)
|
||||
{
|
||||
char chrs[16] = {};
|
||||
double streamval = stream;
|
||||
int level = 0;
|
||||
while(streamval > 1024.0)
|
||||
{
|
||||
if(level >= 5)
|
||||
break;
|
||||
level++;
|
||||
streamval /= 1024.0;
|
||||
}
|
||||
switch(level)
|
||||
{
|
||||
case 3:
|
||||
snprintf(chrs, 15, "%.2f GB", streamval);
|
||||
break;
|
||||
case 4:
|
||||
snprintf(chrs, 15, "%.2f TB", streamval);
|
||||
break;
|
||||
case 5:
|
||||
snprintf(chrs, 15, "%.2f PB", streamval);
|
||||
break;
|
||||
case 2:
|
||||
snprintf(chrs, 15, "%.2f MB", streamval);
|
||||
break;
|
||||
case 1:
|
||||
snprintf(chrs, 15, "%.2f KB", streamval);
|
||||
break;
|
||||
case 0:
|
||||
snprintf(chrs, 15, "%.2f B", streamval);
|
||||
break;
|
||||
}
|
||||
return std::string(chrs);
|
||||
}
|
||||
|
||||
std::string subInfoToMessage(std::string subinfo)
|
||||
{
|
||||
typedef unsigned long long ull;
|
||||
subinfo = replace_all_distinct(subinfo, "; ", "&");
|
||||
std::string retdata, useddata = "N/A", totaldata = "N/A", expirydata = "N/A";
|
||||
std::string upload = getUrlArg(subinfo, "upload"), download = getUrlArg(subinfo, "download"), total = getUrlArg(subinfo, "total"), expire = getUrlArg(subinfo, "expire");
|
||||
ull used = to_number<ull>(upload, 0) + to_number<ull>(download, 0), tot = to_number<ull>(total, 0);
|
||||
time_t expiry = to_number<time_t>(expire, 0);
|
||||
if(used != 0)
|
||||
useddata = intToStream(used);
|
||||
if(tot != 0)
|
||||
totaldata = intToStream(tot);
|
||||
if(expiry != 0)
|
||||
{
|
||||
char buffer[30];
|
||||
struct tm *dt = localtime(&expiry);
|
||||
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M", dt);
|
||||
expirydata.assign(buffer);
|
||||
}
|
||||
if(useddata == "N/A" && totaldata == "N/A" && expirydata == "N/A")
|
||||
retdata = "Not Available";
|
||||
else
|
||||
retdata += "Stream Used: " + useddata + " Stream Total: " + totaldata + " Expiry Time: " + expirydata;
|
||||
return retdata;
|
||||
}
|
||||
|
||||
int simpleGenerator()
|
||||
{
|
||||
//std::cerr<<"\nReading generator configuration...\n";
|
||||
writeLog(0, "Reading generator configuration...", LOG_LEVEL_INFO);
|
||||
std::string config = fileGet("generate.ini"), path, profile, arguments, content;
|
||||
if(config.empty())
|
||||
{
|
||||
//std::cerr<<"Generator configuration not found or empty!\n";
|
||||
writeLog(0, "Generator configuration not found or empty!", LOG_LEVEL_ERROR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
INIReader ini;
|
||||
if(ini.Parse(config) != INIREADER_EXCEPTION_NONE)
|
||||
{
|
||||
//std::cerr<<"Generator configuration broken! Reason:"<<ini.GetLastError()<<"\n";
|
||||
writeLog(0, "Generator configuration broken! Reason:" + ini.GetLastError(), LOG_LEVEL_ERROR);
|
||||
return -2;
|
||||
}
|
||||
//std::cerr<<"Read generator configuration completed.\n\n";
|
||||
writeLog(0, "Read generator configuration completed.\n", LOG_LEVEL_INFO);
|
||||
|
||||
string_array sections = ini.GetSections();
|
||||
if(gen_profile.size())
|
||||
{
|
||||
//std::cerr<<"Generating with specific artifacts: \""<<gen_profile<<"\"...\n";
|
||||
writeLog(0, "Generating with specific artifacts: \"" + gen_profile + "\"...", LOG_LEVEL_INFO);
|
||||
string_array targets = split(gen_profile, ","), new_targets;
|
||||
for(std::string &x : targets)
|
||||
{
|
||||
x = trim(x);
|
||||
if(std::find(sections.cbegin(), sections.cend(), x) != sections.cend())
|
||||
new_targets.emplace_back(x);
|
||||
else
|
||||
{
|
||||
//std::cerr<<"Artifact \""<<x<<"\" not found in generator settings!\n";
|
||||
writeLog(0, "Artifact \"" + x + "\" not found in generator settings!", LOG_LEVEL_ERROR);
|
||||
return -3;
|
||||
}
|
||||
}
|
||||
sections = new_targets;
|
||||
sections.shrink_to_fit();
|
||||
}
|
||||
else
|
||||
//std::cerr<<"Generating all artifacts...\n";
|
||||
writeLog(0, "Generating all artifacts...", LOG_LEVEL_INFO);
|
||||
|
||||
string_multimap allItems;
|
||||
std::string dummy_str;
|
||||
std::map<std::string, std::string> headers;
|
||||
int ret_code = 200;
|
||||
for(std::string &x : sections)
|
||||
{
|
||||
arguments.clear();
|
||||
ret_code = 200;
|
||||
//std::cerr<<"Generating artifact '"<<x<<"'...\n";
|
||||
writeLog(0, "Generating artifact '" + x + "'...", LOG_LEVEL_INFO);
|
||||
ini.EnterSection(x);
|
||||
if(ini.ItemExist("path"))
|
||||
path = ini.Get("path");
|
||||
else
|
||||
{
|
||||
//std::cerr<<"Artifact '"<<x<<"' output path missing! Skipping...\n\n";
|
||||
writeLog(0, "Artifact '" + x + "' output path missing! Skipping...\n", LOG_LEVEL_ERROR);
|
||||
continue;
|
||||
}
|
||||
if(ini.ItemExist("profile"))
|
||||
{
|
||||
profile = ini.Get("profile");
|
||||
content = getProfile("name=" + UrlEncode(profile) + "&token=" + access_token + "&expand=true", dummy_str, &ret_code, headers);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(ini.GetBool("direct") == true)
|
||||
{
|
||||
std::string url = ini.Get("url");
|
||||
if(fileExist(url))
|
||||
content = fileGet(url, false);
|
||||
else
|
||||
{
|
||||
//check for proxy settings
|
||||
std::string proxy;
|
||||
if(proxy_subscription == "SYSTEM")
|
||||
proxy = getSystemProxy();
|
||||
else if(proxy_subscription == "NONE")
|
||||
proxy = "";
|
||||
else
|
||||
proxy = proxy_subscription;
|
||||
content = webGet(url, proxy);
|
||||
}
|
||||
if(content.empty())
|
||||
{
|
||||
//std::cerr<<"Artifact '"<<x<<"' generate ERROR! Please check your link.\n\n";
|
||||
writeLog(0, "Artifact '" + x + "' generate ERROR! Please check your link.\n", LOG_LEVEL_ERROR);
|
||||
if(sections.size() == 1)
|
||||
return -1;
|
||||
}
|
||||
// add UTF-8 BOM
|
||||
fileWrite(path, "\xEF\xBB\xBF" + content, true);
|
||||
continue;
|
||||
}
|
||||
ini.GetItems(allItems);
|
||||
allItems.emplace("expand", "true");
|
||||
for(auto &y : allItems)
|
||||
{
|
||||
if(y.first == "path")
|
||||
continue;
|
||||
arguments += y.first + "=" + UrlEncode(y.second) + "&";
|
||||
}
|
||||
arguments.erase(arguments.size() - 1);
|
||||
content = subconverter(arguments, dummy_str, &ret_code, headers);
|
||||
}
|
||||
if(ret_code != 200)
|
||||
{
|
||||
//std::cerr<<"Artifact '"<<x<<"' generate ERROR! Reason: "<<content<<"\n\n";
|
||||
writeLog(0, "Artifact '" + x + "' generate ERROR! Reason: " + content + "\n", LOG_LEVEL_ERROR);
|
||||
if(sections.size() == 1)
|
||||
return -1;
|
||||
continue;
|
||||
}
|
||||
fileWrite(path, content, true);
|
||||
for(auto &y : headers)
|
||||
{
|
||||
if(regMatch(y.first, "(?i)Subscription-UserInfo"))
|
||||
{
|
||||
std::cerr<<"User Info for artifact '"<<x<<"': "<<subInfoToMessage(y.second)<<"\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
//std::cerr<<"Artifact '"<<x<<"' generate SUCCESS!\n\n";
|
||||
writeLog(0, "Artifact '" + x + "' generate SUCCESS!\n", LOG_LEVEL_INFO);
|
||||
eraseElements(headers);
|
||||
}
|
||||
//std::cerr<<"All artifact generated. Exiting...\n";
|
||||
writeLog(0, "All artifact generated. Exiting...", LOG_LEVEL_INFO);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
void refreshRulesets(string_array &ruleset_list, std::vector<ruleset_content> &rca);
|
||||
void readConf();
|
||||
void generateBase();
|
||||
int simpleGenerator();
|
||||
|
||||
std::string getScript(RESPONSE_CALLBACK_ARGS);
|
||||
std::string getProfile(RESPONSE_CALLBACK_ARGS);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "logger.h"
|
||||
|
||||
extern bool print_debug_info;
|
||||
int global_log_level = LOG_LEVEL_INFO;
|
||||
|
||||
std::string getTime(int type)
|
||||
{
|
||||
@@ -32,9 +33,34 @@ std::string getTime(int type)
|
||||
return std::string(tmpbuf);
|
||||
}
|
||||
|
||||
void writeLog(int type, std::string content)
|
||||
void writeLog(int type, std::string content, int level)
|
||||
{
|
||||
//placeholder
|
||||
/*
|
||||
if(print_debug_info)
|
||||
std::cerr<<getTime(2)<<" [DEBUG] "<<content<<"\n";
|
||||
*/
|
||||
if(level > global_log_level)
|
||||
return;
|
||||
switch(level)
|
||||
{
|
||||
case LOG_LEVEL_VERBOSE:
|
||||
std::cerr<<getTime(2)<<" [VERBOSE] "<<content<<"\n";
|
||||
break;
|
||||
case LOG_LEVEL_DEBUG:
|
||||
std::cerr<<getTime(2)<<" [DEBUG] "<<content<<"\n";
|
||||
break;
|
||||
case LOG_LEVEL_INFO:
|
||||
std::cerr<<getTime(2)<<" [INFO] "<<content<<"\n";
|
||||
break;
|
||||
case LOG_LEVEL_WARNING:
|
||||
std::cerr<<getTime(2)<<" [WARNING] "<<content<<"\n";
|
||||
break;
|
||||
case LOG_LEVEL_ERROR:
|
||||
std::cerr<<getTime(2)<<" [ERROR] "<<content<<"\n";
|
||||
break;
|
||||
case LOG_LEVEL_FATAL:
|
||||
std::cerr<<getTime(2)<<" [FATAL] "<<content<<"\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
37
src/logger.h
37
src/logger.h
@@ -5,17 +5,30 @@
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
#define LOG_TYPE_INFO 1
|
||||
#define LOG_TYPE_ERROR 2
|
||||
#define LOG_TYPE_RAW 3
|
||||
#define LOG_TYPE_WARN 4
|
||||
#define LOG_TYPE_TCPING 5
|
||||
#define LOG_TYPE_FILEDL 6
|
||||
#define LOG_TYPE_GEOIP 7
|
||||
#define LOG_TYPE_RULES 8
|
||||
#define LOG_TYPE_GPING 9
|
||||
#define LOG_TYPE_RENDER 10
|
||||
#define LOG_TYPE_FILEUL 11
|
||||
enum
|
||||
{
|
||||
LOG_TYPE_INFO,
|
||||
LOG_TYPE_ERROR,
|
||||
LOG_TYPE_RAW,
|
||||
LOG_TYPE_WARN,
|
||||
LOG_TYPE_TCPING,
|
||||
LOG_TYPE_FILEDL,
|
||||
LOG_TYPE_GEOIP,
|
||||
LOG_TYPE_RULES,
|
||||
LOG_TYPE_GPING,
|
||||
LOG_TYPE_RENDER,
|
||||
LOG_TYPE_FILEUL
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LOG_LEVEL_FATAL,
|
||||
LOG_LEVEL_ERROR,
|
||||
LOG_LEVEL_WARNING,
|
||||
LOG_LEVEL_INFO,
|
||||
LOG_LEVEL_DEBUG,
|
||||
LOG_LEVEL_VERBOSE
|
||||
};
|
||||
|
||||
extern std::string resultPath, logPath;
|
||||
|
||||
@@ -23,7 +36,7 @@ int makeDir(const char *path);
|
||||
std::string getTime(int type);
|
||||
void logInit(bool rpcmode);
|
||||
void resultInit();
|
||||
void writeLog(int type, std::string content);
|
||||
void writeLog(int type, std::string content, int level = LOG_LEVEL_VERBOSE);
|
||||
void logEOF();
|
||||
|
||||
/*
|
||||
|
||||
38
src/main.cpp
38
src/main.cpp
@@ -8,9 +8,10 @@
|
||||
#include "misc.h"
|
||||
#include "socket.h"
|
||||
#include "webget.h"
|
||||
#include "logger.h"
|
||||
|
||||
extern std::string pref_path, access_token, listen_address;
|
||||
extern bool api_mode, cfw_child_process, update_ruleset_on_request;
|
||||
extern std::string pref_path, access_token, listen_address, gen_profile;
|
||||
extern bool api_mode, generator_mode, cfw_child_process, update_ruleset_on_request;
|
||||
extern int listen_port, max_concurrent_threads, max_pending_connections;
|
||||
extern string_array rulesets;
|
||||
extern std::vector<ruleset_content> ruleset_content_array;
|
||||
@@ -58,12 +59,17 @@ void chkArg(int argc, char *argv[])
|
||||
}
|
||||
else if(strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--file") == 0)
|
||||
pref_path.assign(argv[++i]);
|
||||
else if(strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "--gen") == 0)
|
||||
generator_mode = true;
|
||||
else if(strcmp(argv[i], "--artifact") == 0)
|
||||
gen_profile.assign(argv[++i]);
|
||||
}
|
||||
}
|
||||
|
||||
void signal_handler(int sig)
|
||||
{
|
||||
std::cerr<<"Interrupt signal "<<sig<<" received. Exiting gracefully...\n";
|
||||
//std::cerr<<"Interrupt signal "<<sig<<" received. Exiting gracefully...\n";
|
||||
writeLog(0, "Interrupt signal " + std::to_string(sig) + " received. Exiting gracefully...", LOG_LEVEL_FATAL);
|
||||
switch(sig)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
@@ -79,13 +85,16 @@ void signal_handler(int sig)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
writeLog(0, "SubConverter " VERSION " starting up..", LOG_LEVEL_INFO);
|
||||
#ifdef _WIN32
|
||||
WSADATA wsaData;
|
||||
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
|
||||
{
|
||||
fprintf(stderr, "WSAStartup failed.\n");
|
||||
//std::cerr<<"WSAStartup failed.\n";
|
||||
writeLog(0, "WSAStartup failed.", LOG_LEVEL_FATAL);
|
||||
return 1;
|
||||
}
|
||||
UINT origcp = GetConsoleOutputCP();
|
||||
SetConsoleOutputCP(65001);
|
||||
#else
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
@@ -96,7 +105,7 @@ int main(int argc, char *argv[])
|
||||
signal(SIGTERM, signal_handler);
|
||||
signal(SIGINT, signal_handler);
|
||||
|
||||
SetConsoleTitle("subconverter " VERSION);
|
||||
SetConsoleTitle("SubConverter " VERSION);
|
||||
#ifndef _DEBUG
|
||||
std::string prgpath = argv[0];
|
||||
setcd(prgpath); //first switch to program directory
|
||||
@@ -110,9 +119,23 @@ int main(int argc, char *argv[])
|
||||
refreshRulesets(rulesets, ruleset_content_array);
|
||||
generateBase();
|
||||
|
||||
if(generator_mode)
|
||||
{
|
||||
int retVal = simpleGenerator();
|
||||
#ifdef _WIN32
|
||||
SetConsoleOutputCP(origcp);
|
||||
#endif // _WIN32
|
||||
return retVal;
|
||||
}
|
||||
|
||||
append_response("GET", "/", "text/plain", [](RESPONSE_CALLBACK_ARGS) -> std::string
|
||||
{
|
||||
return std::string("subconverter " VERSION " backend\n");
|
||||
return "subconverter " VERSION " backend\n";
|
||||
});
|
||||
|
||||
append_response("GET", "/version", "text/plain", [](RESPONSE_CALLBACK_ARGS) -> std::string
|
||||
{
|
||||
return "subconverter " VERSION " backend\n";
|
||||
});
|
||||
|
||||
append_response("GET", "/refreshrules", "text/plain", [](RESPONSE_CALLBACK_ARGS) -> std::string
|
||||
@@ -273,7 +296,8 @@ int main(int argc, char *argv[])
|
||||
if(env_port.size())
|
||||
listen_port = to_int(env_port, listen_port);
|
||||
listener_args args = {listen_address, listen_port, max_pending_connections, max_concurrent_threads};
|
||||
std::cout<<"Serving HTTP @ http://"<<listen_address<<":"<<listen_port<<std::endl;
|
||||
//std::cout<<"Serving HTTP @ http://"<<listen_address<<":"<<listen_port<<std::endl;
|
||||
writeLog(0, "Startup completed. Serving HTTP @ http://" + listen_address + ":" + std::to_string(listen_port), LOG_LEVEL_INFO);
|
||||
start_web_server_multi(&args);
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
41
src/misc.cpp
41
src/misc.cpp
@@ -27,6 +27,7 @@ typedef jpcre2::select<char> jp;
|
||||
#include "misc.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
//#include <io.h>
|
||||
#include <windows.h>
|
||||
#include <winreg.h>
|
||||
@@ -437,14 +438,14 @@ std::string getSystemProxy()
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
std::string trim(const std::string& str)
|
||||
std::string trim_of(const std::string& str, char target)
|
||||
{
|
||||
std::string::size_type pos = str.find_first_not_of(' ');
|
||||
std::string::size_type pos = str.find_first_not_of(target);
|
||||
if (pos == std::string::npos)
|
||||
{
|
||||
return str;
|
||||
}
|
||||
std::string::size_type pos2 = str.find_last_not_of(' ');
|
||||
std::string::size_type pos2 = str.find_last_not_of(target);
|
||||
if (pos2 != std::string::npos)
|
||||
{
|
||||
return str.substr(pos, pos2 - pos + 1);
|
||||
@@ -452,6 +453,16 @@ std::string trim(const std::string& str)
|
||||
return str.substr(pos);
|
||||
}
|
||||
|
||||
std::string trim(const std::string& str)
|
||||
{
|
||||
return trim_of(str, ' ');
|
||||
}
|
||||
|
||||
std::string trim_quote(const std::string &str)
|
||||
{
|
||||
return trim_of(str, '\"');
|
||||
}
|
||||
|
||||
std::string getUrlArg(const std::string &url, const std::string &request)
|
||||
{
|
||||
//std::smatch result;
|
||||
@@ -521,12 +532,13 @@ bool regValid(const std::string ®)
|
||||
}
|
||||
}
|
||||
|
||||
bool regFind(const std::string &src, const std::string &target)
|
||||
bool regFind(const std::string &src, const std::string &match)
|
||||
{
|
||||
try
|
||||
{
|
||||
std::regex::flag_type flags = std::regex::extended | std::regex::ECMAScript;
|
||||
if(target.find("(?i)") == 0)
|
||||
std::string target = match;
|
||||
if(match.find("(?i)") == 0)
|
||||
{
|
||||
target.erase(0, 4);
|
||||
flags |= std::regex::icase;
|
||||
@@ -546,12 +558,13 @@ std::string regReplace(const std::string &src, const std::string &match, const s
|
||||
try
|
||||
{
|
||||
std::regex::flag_type flags = std::regex::extended | std::regex::ECMAScript;
|
||||
std::string target = match;
|
||||
if(match.find("(?i)") == 0)
|
||||
{
|
||||
match.erase(0, 4);
|
||||
target.erase(0, 4);
|
||||
flags |= std::regex::icase;
|
||||
}
|
||||
std::regex reg(match, flags);
|
||||
std::regex reg(target, flags);
|
||||
regex_replace(back_inserter(result), src.begin(), src.end(), reg, rep);
|
||||
}
|
||||
catch (std::regex_error &e)
|
||||
@@ -566,12 +579,13 @@ bool regMatch(const std::string &src, const std::string &match)
|
||||
try
|
||||
{
|
||||
std::regex::flag_type flags = std::regex::extended | std::regex::ECMAScript;
|
||||
std::string target = match;
|
||||
if(match.find("(?i)") == 0)
|
||||
{
|
||||
match.erase(0, 4);
|
||||
target.erase(0, 4);
|
||||
flags |= std::regex::icase;
|
||||
}
|
||||
std::regex reg(match, flags);
|
||||
std::regex reg(target, flags);
|
||||
return regex_match(src, reg);
|
||||
}
|
||||
catch (std::regex_error &e)
|
||||
@@ -614,8 +628,14 @@ bool regValid(const std::string &target)
|
||||
jp::Regex reg(target);
|
||||
return !!reg;
|
||||
}
|
||||
|
||||
#endif // USE_STD_REGEX
|
||||
|
||||
std::string regTrim(const std::string &src)
|
||||
{
|
||||
return regReplace(src, "^\\s*?(.*?)\\s*$", "$1");
|
||||
}
|
||||
|
||||
std::string speedCalc(double speed)
|
||||
{
|
||||
if(speed == 0.0)
|
||||
@@ -708,10 +728,11 @@ std::string fileGet(const std::string &path, bool scope_limit)
|
||||
std::fseek(fp, 0, SEEK_END);
|
||||
long tot = std::ftell(fp);
|
||||
char *data = new char[tot + 1];
|
||||
data[tot] = '\0';
|
||||
std::rewind(fp);
|
||||
std::fread(&data[0], 1, tot, fp);
|
||||
std::fclose(fp);
|
||||
content.append(data, 0, tot);
|
||||
content.assign(data, tot);
|
||||
delete[] data;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,9 @@ std::string urlsafe_base64_decode(const std::string &encoded_string);
|
||||
std::string urlsafe_base64_encode(const std::string &string_to_encode);
|
||||
std::string UTF8ToACP(const std::string &str_src);
|
||||
std::string ACPToUTF8(const std::string &str_src);
|
||||
std::string trim_of(const std::string& str, char target);
|
||||
std::string trim(const std::string& str);
|
||||
std::string trim_quote(const std::string &str);
|
||||
std::string getSystemProxy();
|
||||
std::string rand_str(const int len);
|
||||
bool is_str_utf8(const std::string &data);
|
||||
@@ -47,9 +49,10 @@ std::string getFormData(const std::string &raw_data);
|
||||
|
||||
void sleep(int interval);
|
||||
bool regValid(const std::string &target);
|
||||
bool regFind(const std::string &src, const std::string &target);
|
||||
bool regFind(const std::string &src, const std::string &match);
|
||||
std::string regReplace(const std::string &src, const std::string &match, const std::string &rep);
|
||||
bool regMatch(const std::string &src, const std::string &match);
|
||||
std::string regTrim(const std::string &src);
|
||||
std::string speedCalc(double speed);
|
||||
std::string getMD5(const std::string &data);
|
||||
bool isIPv4(const std::string &address);
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
#include <fstream>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#define PCRE2_CODE_UNIT_WIDTH 8
|
||||
#include <pcre2.h>
|
||||
#include <rapidjson/document.h>
|
||||
|
||||
#include "misc.h"
|
||||
@@ -27,10 +28,17 @@ std::string modSSMD5 = "f7653207090ce3389115e9c88541afe0";
|
||||
|
||||
template <typename T> void operator >> (const YAML::Node& node, T& i)
|
||||
{
|
||||
if(node.IsDefined()) //fail-safe
|
||||
if(node.IsDefined() && !node.IsNull()) //fail-safe
|
||||
i = node.as<T>();
|
||||
};
|
||||
|
||||
template <typename T> T safe_as (const YAML::Node& node)
|
||||
{
|
||||
if(node.IsDefined() && !node.IsNull())
|
||||
return node.as<T>();
|
||||
return T();
|
||||
};
|
||||
|
||||
void explodeVmess(std::string vmess, std::string custom_port, int local_port, nodeInfo &node)
|
||||
{
|
||||
std::string version, ps, add, port, type, id, aid, net, path, host, tls;
|
||||
@@ -162,7 +170,7 @@ void explodeVmessConf(std::string content, std::string custom_port, int local_po
|
||||
group = iter->second;
|
||||
}
|
||||
}
|
||||
if(ps == "")
|
||||
if(ps.empty())
|
||||
{
|
||||
ps = add + ":" + port;
|
||||
}
|
||||
@@ -240,7 +248,7 @@ void explodeSS(std::string ss, bool libev, std::string custom_port, int local_po
|
||||
method = secret[0];
|
||||
password = secret[1];
|
||||
server = args[1];
|
||||
port = custom_port == "" ? args[2] : custom_port;
|
||||
port = custom_port.empty() ? args[2] : custom_port;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -253,9 +261,9 @@ void explodeSS(std::string ss, bool libev, std::string custom_port, int local_po
|
||||
method = args[0];
|
||||
password = args[1];
|
||||
server = args[2];
|
||||
port = custom_port == "" ? args[3] : custom_port;
|
||||
port = custom_port.empty() ? args[3] : custom_port;
|
||||
}
|
||||
if(ps == "")
|
||||
if(ps.empty())
|
||||
ps = server + ":" + port;
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDSS;
|
||||
@@ -318,8 +326,6 @@ void explodeSSAndroid(std::string ss, bool libev, std::string custom_port, int l
|
||||
{
|
||||
Document json;
|
||||
nodeInfo node;
|
||||
std::string ps, password, method, server, port, group = SS_DEFAULT_GROUP;
|
||||
std::string plugin, pluginopts;
|
||||
int index = nodes.size();
|
||||
//first add some extra data before parsing
|
||||
ss = "{\"nodes\":" + ss + "}";
|
||||
@@ -329,6 +335,9 @@ void explodeSSAndroid(std::string ss, bool libev, std::string custom_port, int l
|
||||
|
||||
for(unsigned int i = 0; i < json["nodes"].Size(); i++)
|
||||
{
|
||||
std::string ps, password, method, server, port, group = SS_DEFAULT_GROUP;
|
||||
std::string plugin, pluginopts;
|
||||
|
||||
server = GetMember(json["nodes"][i], "server");
|
||||
if(server.empty())
|
||||
continue;
|
||||
@@ -337,7 +346,7 @@ void explodeSSAndroid(std::string ss, bool libev, std::string custom_port, int l
|
||||
port = custom_port;
|
||||
else
|
||||
port = GetMember(json["nodes"][i], "server_port");
|
||||
if(ps == "")
|
||||
if(ps.empty())
|
||||
ps = server + ":" + port;
|
||||
password = GetMember(json["nodes"][i], "password");
|
||||
method = GetMember(json["nodes"][i], "method");
|
||||
@@ -388,7 +397,7 @@ void explodeSSConf(std::string content, std::string custom_port, int local_port,
|
||||
port = custom_port;
|
||||
else
|
||||
json["configs"][i]["server_port"] >> port;
|
||||
if(ps == "")
|
||||
if(ps.empty())
|
||||
{
|
||||
ps = server + ":" + port;
|
||||
}
|
||||
@@ -437,15 +446,15 @@ void explodeSSR(std::string ssr, bool ss_libev, bool ssr_libev, std::string cust
|
||||
return;
|
||||
|
||||
server = strcfg[0];
|
||||
port = custom_port == "" ? strcfg[1] : custom_port;
|
||||
port = custom_port.empty() ? strcfg[1] : custom_port;
|
||||
protocol = strcfg[2];
|
||||
method = strcfg[3];
|
||||
obfs = strcfg[4];
|
||||
password = urlsafe_base64_decode(strcfg[5]);
|
||||
|
||||
if(group == "")
|
||||
if(group.empty())
|
||||
group = SSR_DEFAULT_GROUP;
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
{
|
||||
remarks = server + ":" + port;
|
||||
remarks_base64 = base64_encode(remarks);
|
||||
@@ -455,7 +464,7 @@ void explodeSSR(std::string ssr, bool ss_libev, bool ssr_libev, std::string cust
|
||||
node.remarks = remarks;
|
||||
node.server = server;
|
||||
node.port = to_int(port, 0);
|
||||
if(find(ss_ciphers.begin(), ss_ciphers.end(), method) != ss_ciphers.end() && (obfs == "" || obfs == "plain") && (protocol == "" || protocol == "origin"))
|
||||
if(find(ss_ciphers.begin(), ss_ciphers.end(), method) != ss_ciphers.end() && (obfs.empty() || obfs == "plain") && (protocol.empty() || protocol == "origin"))
|
||||
{
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDSS;
|
||||
node.proxyStr = ssConstruct(server, port, password, method, "", "", remarks, local_port, ss_libev);
|
||||
@@ -482,7 +491,7 @@ void explodeSSRConf(std::string content, std::string custom_port, int local_port
|
||||
method = GetMember(json, "method");
|
||||
obfs = GetMember(json, "obfs");
|
||||
protocol = GetMember(json, "protocol");
|
||||
if(find(ss_ciphers.begin(), ss_ciphers.end(), method) != ss_ciphers.end() && (obfs == "" || obfs == "plain") && (protocol == "" || protocol == "origin"))
|
||||
if(find(ss_ciphers.begin(), ss_ciphers.end(), method) != ss_ciphers.end() && (obfs.empty() || obfs == "plain") && (protocol.empty() || protocol == "origin"))
|
||||
{
|
||||
explodeSSConf(content, custom_port, local_port, ss_libev, nodes);
|
||||
return;
|
||||
@@ -503,7 +512,7 @@ void explodeSSRConf(std::string content, std::string custom_port, int local_port
|
||||
for(unsigned int i = 0; i < json["configs"].Size(); i++)
|
||||
{
|
||||
json["configs"][i]["group"] >> group;
|
||||
if(group == "")
|
||||
if(group.empty())
|
||||
group = SSR_DEFAULT_GROUP;
|
||||
json["configs"][i]["remarks"] >> remarks;
|
||||
json["configs"][i]["server"] >> server;
|
||||
@@ -511,7 +520,7 @@ void explodeSSRConf(std::string content, std::string custom_port, int local_port
|
||||
port = custom_port;
|
||||
else
|
||||
json["configs"][i]["server_port"] >> port;
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = server + ":" + port;
|
||||
|
||||
json["configs"][i]["remarks_base64"] >> remarks_base64;
|
||||
@@ -549,6 +558,8 @@ void explodeSocks(std::string link, std::string custom_port, nodeInfo &node)
|
||||
}
|
||||
link = urlsafe_base64_decode(link.substr(8));
|
||||
arguments = split(link, ":");
|
||||
if(arguments.size() < 2)
|
||||
return;
|
||||
server = arguments[0];
|
||||
port = arguments[1];
|
||||
}
|
||||
@@ -559,7 +570,7 @@ void explodeSocks(std::string link, std::string custom_port, nodeInfo &node)
|
||||
username = getUrlArg(link, "user");
|
||||
password = getUrlArg(link, "pass");
|
||||
}
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = server + ":" + port;
|
||||
if(custom_port.size())
|
||||
port = custom_port;
|
||||
@@ -581,7 +592,7 @@ void explodeHTTP(std::string link, std::string custom_port, nodeInfo &node)
|
||||
password = getUrlArg(link, "pass");
|
||||
remarks = UrlDecode(getUrlArg(link, "remark"));
|
||||
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = server + ":" + port;
|
||||
if(custom_port.size())
|
||||
port = custom_port;
|
||||
@@ -601,8 +612,11 @@ void explodeQuan(std::string quan, std::string custom_port, int local_port, node
|
||||
std::vector<std::string> configs, vArray;
|
||||
strTemp = regReplace(quan, "(.*?) = (.*)", "$1,$2");
|
||||
configs = split(strTemp, ",");
|
||||
|
||||
if(configs[1] == "vmess")
|
||||
{
|
||||
if(configs.size() < 6)
|
||||
return;
|
||||
ps = trim(configs[0]);
|
||||
add = trim(configs[2]);
|
||||
port = custom_port.size() ? custom_port : trim(configs[3]);
|
||||
@@ -639,7 +653,7 @@ void explodeQuan(std::string quan, std::string custom_port, int local_port, node
|
||||
else if(itemName == "obfs" && itemVal == "ws")
|
||||
net = "ws";
|
||||
}
|
||||
if(path == "")
|
||||
if(path.empty())
|
||||
path = "/";
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDVMESS;
|
||||
@@ -666,7 +680,7 @@ void explodeNetch(std::string netch, bool ss_libev, bool ssr_libev, std::string
|
||||
port = custom_port.size() ? custom_port : GetMember(json, "Port");
|
||||
method = GetMember(json, "EncryptMethod");
|
||||
password = GetMember(json, "Password");
|
||||
if(remark == "")
|
||||
if(remark.empty())
|
||||
remark = address + ":" + port;
|
||||
if(type == "SS")
|
||||
{
|
||||
@@ -680,7 +694,7 @@ void explodeNetch(std::string netch, bool ss_libev, bool ssr_libev, std::string
|
||||
{
|
||||
protocol = GetMember(json, "Protocol");
|
||||
obfs = GetMember(json, "OBFS");
|
||||
if(find(ss_ciphers.begin(), ss_ciphers.end(), method) != ss_ciphers.end() && (obfs == "" || obfs == "plain") && (protocol == "" || protocol == "origin"))
|
||||
if(find(ss_ciphers.begin(), ss_ciphers.end(), method) != ss_ciphers.end() && (obfs.empty() || obfs == "plain") && (protocol.empty() || protocol == "origin"))
|
||||
{
|
||||
plugin = GetMember(json, "Plugin");
|
||||
pluginopts = GetMember(json, "PluginOption");
|
||||
@@ -731,19 +745,22 @@ void explodeClash(Node yamlnode, std::string custom_port, int local_port, std::v
|
||||
nodeInfo node;
|
||||
Node singleproxy;
|
||||
unsigned int index = nodes.size();
|
||||
std::string proxytype, ps, server, port, cipher, group, password; //common
|
||||
std::string type = "none", id, aid = "0", net = "tcp", path, host, edge, tls; //vmess
|
||||
std::string plugin, pluginopts, pluginopts_mode, pluginopts_host, pluginopts_mux; //ss
|
||||
std::string protocol, protoparam, obfs, obfsparam; //ssr
|
||||
std::string user; //socks
|
||||
const std::string section = yamlnode["proxies"].IsDefined() ? "proxies" : "Proxy";
|
||||
for(unsigned int i = 0; i < yamlnode[section].size(); i++)
|
||||
{
|
||||
std::string proxytype, ps, server, port, cipher, group, password; //common
|
||||
std::string type = "none", id, aid = "0", net = "tcp", path, host, edge, tls; //vmess
|
||||
std::string plugin, pluginopts, pluginopts_mode, pluginopts_host, pluginopts_mux; //ss
|
||||
std::string protocol, protoparam, obfs, obfsparam; //ssr
|
||||
std::string user; //socks
|
||||
|
||||
singleproxy = yamlnode[section][i];
|
||||
singleproxy["type"] >> proxytype;
|
||||
singleproxy["name"] >> ps;
|
||||
singleproxy["server"] >> server;
|
||||
port = custom_port == "" ? singleproxy["port"].as<std::string>() : custom_port;
|
||||
port = custom_port.empty() ? safe_as<std::string>(singleproxy["port"]) : custom_port;
|
||||
if(port.empty())
|
||||
continue;
|
||||
if(proxytype == "vmess")
|
||||
{
|
||||
group = V2RAY_DEFAULT_GROUP;
|
||||
@@ -751,10 +768,10 @@ void explodeClash(Node yamlnode, std::string custom_port, int local_port, std::v
|
||||
singleproxy["uuid"] >> id;
|
||||
singleproxy["alterId"] >> aid;
|
||||
singleproxy["cipher"] >> cipher;
|
||||
net = singleproxy["network"].IsDefined() ? singleproxy["network"].as<std::string>() : "tcp";
|
||||
path = singleproxy["ws-path"].IsDefined() ? singleproxy["ws-path"].as<std::string>() : "/";
|
||||
net = singleproxy["network"].IsDefined() ? safe_as<std::string>(singleproxy["network"]) : "tcp";
|
||||
path = singleproxy["ws-path"].IsDefined() ? safe_as<std::string>(singleproxy["ws-path"]) : "/";
|
||||
if(singleproxy["tls"].IsDefined())
|
||||
tls = singleproxy["tls"].as<std::string>() == "true" ? "tls" : "";
|
||||
tls = safe_as<std::string>(singleproxy["tls"]) == "true" ? "tls" : "";
|
||||
else
|
||||
tls.clear();
|
||||
if(singleproxy["ws-headers"].IsDefined())
|
||||
@@ -777,7 +794,7 @@ void explodeClash(Node yamlnode, std::string custom_port, int local_port, std::v
|
||||
singleproxy["password"] >> password;
|
||||
if(singleproxy["plugin"].IsDefined())
|
||||
{
|
||||
if(singleproxy["plugin"].as<std::string>() == "obfs")
|
||||
if(safe_as<std::string>(singleproxy["plugin"]) == "obfs")
|
||||
{
|
||||
plugin = "simple-obfs";
|
||||
if(singleproxy["plugin-opts"].IsDefined())
|
||||
@@ -789,7 +806,7 @@ void explodeClash(Node yamlnode, std::string custom_port, int local_port, std::v
|
||||
pluginopts_host.clear();
|
||||
}
|
||||
}
|
||||
else if(singleproxy["plugin"].as<std::string>() == "v2ray-plugin")
|
||||
else if(safe_as<std::string>(singleproxy["plugin"]) == "v2ray-plugin")
|
||||
{
|
||||
plugin = "v2ray-plugin";
|
||||
if(singleproxy["plugin-opts"].IsDefined())
|
||||
@@ -800,7 +817,7 @@ void explodeClash(Node yamlnode, std::string custom_port, int local_port, std::v
|
||||
else
|
||||
pluginopts_host.clear();
|
||||
if(singleproxy["plugin-opts"]["tls"].IsDefined())
|
||||
tls = singleproxy["plugin-opts"]["tls"].as<bool>() ? "tls;" : "";
|
||||
tls = safe_as<bool>(singleproxy["plugin-opts"]["tls"]) ? "tls;" : "";
|
||||
else
|
||||
tls.clear();
|
||||
if(singleproxy["plugin-opts"]["path"].IsDefined())
|
||||
@@ -808,7 +825,7 @@ void explodeClash(Node yamlnode, std::string custom_port, int local_port, std::v
|
||||
else
|
||||
path.clear();
|
||||
if(singleproxy["plugin-opts"]["mux"].IsDefined())
|
||||
pluginopts_mux = singleproxy["plugin-opts"]["mux"].as<bool>() ? "mux=4;" : "";
|
||||
pluginopts_mux = safe_as<bool>(singleproxy["plugin-opts"]["mux"]) ? "mux=4;" : "";
|
||||
else
|
||||
pluginopts_mux.clear();
|
||||
}
|
||||
@@ -827,7 +844,7 @@ void explodeClash(Node yamlnode, std::string custom_port, int local_port, std::v
|
||||
if(plugin == "simple-obfs")
|
||||
{
|
||||
pluginopts = "obfs=" + pluginopts_mode;
|
||||
pluginopts += pluginopts_host == "" ? "" : ";obfs-host=" + pluginopts_host;
|
||||
pluginopts += pluginopts_host.empty() ? "" : ";obfs-host=" + pluginopts_host;
|
||||
}
|
||||
else if(plugin == "v2ray-plugin")
|
||||
{
|
||||
@@ -930,6 +947,8 @@ void explodeShadowrocket(std::string rocket, std::string custom_port, int local_
|
||||
rocket = rocket.substr(0, rocket.find("?"));
|
||||
|
||||
userinfo = split(regReplace(urlsafe_base64_decode(rocket), "(.*?):(.*?)@(.*):(.*)", "$1,$2,$3,$4"), ",");
|
||||
if(userinfo.size() != 4) // broken link
|
||||
return;
|
||||
cipher = userinfo[0];
|
||||
id = userinfo[1];
|
||||
add = userinfo[2];
|
||||
@@ -954,10 +973,10 @@ void explodeShadowrocket(std::string rocket, std::string custom_port, int local_
|
||||
tls = getUrlArg(addition, "tls") == "1" ? "tls" : "";
|
||||
aid = getUrlArg(addition, "aid");
|
||||
|
||||
if(aid == "")
|
||||
if(aid.empty())
|
||||
aid = "0";
|
||||
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = add + ":" + port;
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDVMESS;
|
||||
@@ -985,6 +1004,8 @@ void explodeKitsunebi(std::string kit, std::string custom_port, int local_port,
|
||||
kit = kit.substr(0, kit.find("?"));
|
||||
|
||||
userinfo = split(regReplace(kit, "(.*?)@(.*):(.*)", "$1,$2,$3"), ",");
|
||||
if(userinfo.size() != 3)
|
||||
return;
|
||||
id = userinfo[0];
|
||||
add = userinfo[1];
|
||||
if(strFind(userinfo[2], "/"))
|
||||
@@ -1002,7 +1023,7 @@ void explodeKitsunebi(std::string kit, std::string custom_port, int local_port,
|
||||
tls = getUrlArg(addition, "tls") == "true" ? "tls" : "";
|
||||
host = getUrlArg(addition, "ws.host");
|
||||
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = add + ":" + port;
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDVMESS;
|
||||
@@ -1015,12 +1036,6 @@ void explodeKitsunebi(std::string kit, std::string custom_port, int local_port,
|
||||
|
||||
bool explodeSurge(std::string surge, std::string custom_port, int local_port, std::vector<nodeInfo> &nodes, bool libev)
|
||||
{
|
||||
std::string remarks, server, port, method, username, password; //common
|
||||
std::string plugin, pluginopts, pluginopts_mode, pluginopts_host = "cloudfront.net", mod_url, mod_md5; //ss
|
||||
std::string id, net, tls, host, edge, path; //v2
|
||||
std::string protocol, protoparam; //ssr
|
||||
std::string itemName, itemVal;
|
||||
std::vector<std::string> configs, vArray, headers, header;
|
||||
std::multimap<std::string, std::string> proxies;
|
||||
nodeInfo node;
|
||||
unsigned int i, index = nodes.size();
|
||||
@@ -1035,6 +1050,7 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
ini.keep_empty_section = false;
|
||||
ini.SetIsolatedItemsSection("Proxy");
|
||||
ini.IncludeSection("Proxy");
|
||||
ini.AddDirectSaveSection("Proxy");
|
||||
ini.Parse(surge);
|
||||
|
||||
if(!ini.SectionExist("Proxy"))
|
||||
@@ -1042,13 +1058,22 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
ini.EnterSection("Proxy");
|
||||
ini.GetItems(proxies);
|
||||
|
||||
const std::string proxystr = "(.*?)\\s*=\\s*(.*)";
|
||||
|
||||
for(auto &x : proxies)
|
||||
{
|
||||
remarks = x.first;
|
||||
configs = split(x.second, ",");
|
||||
std::string remarks, server, port, method, username, password; //common
|
||||
std::string plugin, pluginopts, pluginopts_mode, pluginopts_host = "cloudfront.net", mod_url, mod_md5; //ss
|
||||
std::string id, net, tls, host, edge, path; //v2
|
||||
std::string protocol, protoparam; //ssr
|
||||
std::string itemName, itemVal;
|
||||
std::vector<std::string> configs, vArray, headers, header;
|
||||
|
||||
remarks = regReplace(x.second, proxystr, "$1");
|
||||
configs = split(regReplace(x.second, proxystr, "$2"), ",");
|
||||
if(configs.size() < 2 || configs[0] == "direct")
|
||||
continue;
|
||||
else if(configs[0] == "custom") //surge 2 style custom proxy
|
||||
if(configs[0] == "custom") //surge 2 style custom proxy
|
||||
{
|
||||
//remove module detection to speed up parsing and compatible with broken module
|
||||
/*
|
||||
@@ -1067,10 +1092,9 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
//if(mod_md5 == modSSMD5) //is SSEncrypt module
|
||||
{
|
||||
server = trim(configs[1]);
|
||||
port = custom_port == "" ? trim(configs[2]) : custom_port;
|
||||
port = custom_port.empty() ? trim(configs[2]) : custom_port;
|
||||
method = trim(configs[3]);
|
||||
password = trim(configs[4]);
|
||||
plugin.clear();
|
||||
|
||||
for(i = 6; i < configs.size(); i++)
|
||||
{
|
||||
@@ -1087,10 +1111,10 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(itemName == "obfs-host")
|
||||
pluginopts_host = itemVal;
|
||||
}
|
||||
if(plugin != "")
|
||||
if(plugin.size())
|
||||
{
|
||||
pluginopts = "obfs=" + pluginopts_mode;
|
||||
pluginopts += pluginopts_host == "" ? "" : ";obfs-host=" + pluginopts_host;
|
||||
pluginopts += pluginopts_host.empty() ? "" : ";obfs-host=" + pluginopts_host;
|
||||
}
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDSS;
|
||||
@@ -1103,8 +1127,7 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(configs[0] == "ss") //surge 3 style ss proxy
|
||||
{
|
||||
server = trim(configs[1]);
|
||||
port = custom_port == "" ? trim(configs[2]) : custom_port;
|
||||
plugin.clear();
|
||||
port = custom_port.empty() ? trim(configs[2]) : custom_port;
|
||||
|
||||
for(i = 3; i < configs.size(); i++)
|
||||
{
|
||||
@@ -1125,10 +1148,10 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(itemName == "obfs-host")
|
||||
pluginopts_host = itemVal;
|
||||
}
|
||||
if(plugin != "")
|
||||
if(plugin.size())
|
||||
{
|
||||
pluginopts = "obfs=" + pluginopts_mode;
|
||||
pluginopts += pluginopts_host == "" ? "" : ";obfs-host=" + pluginopts_host;
|
||||
pluginopts += pluginopts_host.empty() ? "" : ";obfs-host=" + pluginopts_host;
|
||||
}
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDSS;
|
||||
@@ -1140,7 +1163,7 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDSOCKS;
|
||||
node.group = SOCKS_DEFAULT_GROUP;
|
||||
server = trim(configs[1]);
|
||||
port = custom_port == "" ? trim(configs[2]) : custom_port;
|
||||
port = custom_port.empty() ? trim(configs[2]) : custom_port;
|
||||
if(configs.size() >= 5)
|
||||
{
|
||||
username = trim(configs[2]);
|
||||
@@ -1151,7 +1174,7 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(configs[0] == "vmess") //surge 4 style vmess proxy
|
||||
{
|
||||
server = trim(configs[1]);
|
||||
port = custom_port == "" ? trim(configs[2]) : custom_port;
|
||||
port = custom_port.empty() ? trim(configs[2]) : custom_port;
|
||||
net = "tcp";
|
||||
method = "auto";
|
||||
|
||||
@@ -1180,14 +1203,14 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
for(auto &y : headers)
|
||||
{
|
||||
header = split(trim(y), ":");
|
||||
if(header[0] == "Host")
|
||||
host = header[1];
|
||||
else if(header[0] == "Edge")
|
||||
edge = header[1];
|
||||
if(regMatch(header[0], "(?i)host"))
|
||||
host = trim_quote(header[1]);
|
||||
else if(regMatch(header[0], "(?i)edge"))
|
||||
edge = trim_quote(header[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(host == "" && !isIPv4(server) && !isIPv6(server))
|
||||
if(host.empty() && !isIPv4(server) && !isIPv6(server))
|
||||
host = server;
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDVMESS;
|
||||
@@ -1199,7 +1222,7 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDHTTP;
|
||||
node.group = HTTP_DEFAULT_GROUP;
|
||||
server = trim(configs[1]);
|
||||
port = custom_port == "" ? trim(configs[2]) : custom_port;
|
||||
port = custom_port.empty() ? trim(configs[2]) : custom_port;
|
||||
if(configs.size() >= 5)
|
||||
{
|
||||
username = trim(configs[2]);
|
||||
@@ -1210,8 +1233,7 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(remarks == "shadowsocks") //quantumult x style ss/ssr link
|
||||
{
|
||||
server = trim(configs[0].substr(0, configs[0].rfind(":")));
|
||||
port = custom_port == "" ? trim(configs[0].substr(configs[0].rfind(":") + 1)) : custom_port;
|
||||
plugin = protocol = remarks = "";
|
||||
port = custom_port.empty() ? trim(configs[0].substr(configs[0].rfind(":") + 1)) : custom_port;
|
||||
|
||||
for(i = 1; i < configs.size(); i++)
|
||||
{
|
||||
@@ -1238,12 +1260,13 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(itemName == "obfs-host")
|
||||
pluginopts_host = itemVal;
|
||||
}
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = server + ":" + port;
|
||||
if(plugin != "")
|
||||
if(plugin.size())
|
||||
{
|
||||
pluginopts = "obfs=" + pluginopts_mode;
|
||||
pluginopts += pluginopts_host == "" ? "" : ";obfs-host=" + pluginopts_host;
|
||||
if(pluginopts_host.size())
|
||||
pluginopts += ";obfs-host=" + pluginopts_host;
|
||||
}
|
||||
|
||||
if(protocol.size())
|
||||
@@ -1262,8 +1285,7 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(remarks == "vmess") //quantumult x style vmess link
|
||||
{
|
||||
server = trim(configs[0].substr(0, configs[0].rfind(":")));
|
||||
port = custom_port == "" ? trim(configs[0].substr(configs[0].rfind(":") + 1)) : custom_port;
|
||||
plugin = protocol = remarks = "";
|
||||
port = custom_port.empty() ? trim(configs[0].substr(configs[0].rfind(":") + 1)) : custom_port;
|
||||
net = "tcp";
|
||||
|
||||
for(i = 1; i < configs.size(); i++)
|
||||
@@ -1293,10 +1315,10 @@ bool explodeSurge(std::string surge, std::string custom_port, int local_port, st
|
||||
else if(itemName == "over-tls")
|
||||
tls = itemVal == "true" ? "tls" : "";
|
||||
}
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = server + ":" + port;
|
||||
|
||||
if(host == "" && !isIPv4(server) && !isIPv6(server))
|
||||
if(host.empty() && !isIPv4(server) && !isIPv6(server))
|
||||
host = server;
|
||||
|
||||
node.linkType = SPEEDTEST_MESSAGE_FOUNDVMESS;
|
||||
@@ -1320,10 +1342,6 @@ void explodeSSTap(std::string sstap, std::string custom_port, int local_port, st
|
||||
{
|
||||
Document json;
|
||||
nodeInfo node;
|
||||
std::string configType, group, remarks, server, port;
|
||||
std::string cipher;
|
||||
std::string user, pass;
|
||||
std::string protocol, protoparam, obfs, obfsparam;
|
||||
unsigned int index = nodes.size();
|
||||
json.Parse(sstap.data());
|
||||
if(json.HasParseError())
|
||||
@@ -1331,12 +1349,17 @@ void explodeSSTap(std::string sstap, std::string custom_port, int local_port, st
|
||||
|
||||
for(unsigned int i = 0; i < json["configs"].Size(); i++)
|
||||
{
|
||||
std::string configType, group, remarks, server, port;
|
||||
std::string cipher;
|
||||
std::string user, pass;
|
||||
std::string protocol, protoparam, obfs, obfsparam;
|
||||
|
||||
json["configs"][i]["group"] >> group;
|
||||
json["configs"][i]["remarks"] >> remarks;
|
||||
json["configs"][i]["server"] >> server;
|
||||
port = custom_port.size() ? custom_port : GetMember(json["configs"][i], "server_port");
|
||||
|
||||
if(remarks == "")
|
||||
if(remarks.empty())
|
||||
remarks = server + ":" + port;
|
||||
|
||||
json["configs"][i]["password"] >> pass;
|
||||
@@ -1405,14 +1428,14 @@ bool chkIgnore(const nodeInfo &node, string_array &exclude_remarks, string_array
|
||||
bool excluded = false, included = false;
|
||||
//std::string remarks = UTF8ToACP(node.remarks);
|
||||
std::string remarks = node.remarks;
|
||||
writeLog(LOG_TYPE_INFO, "Comparing exclude remarks...");
|
||||
//writeLog(LOG_TYPE_INFO, "Comparing exclude remarks...");
|
||||
excluded = std::any_of(exclude_remarks.cbegin(), exclude_remarks.cend(), [&remarks](auto &x)
|
||||
{
|
||||
return regFind(remarks, x);
|
||||
});
|
||||
if(include_remarks.size() != 0)
|
||||
{
|
||||
writeLog(LOG_TYPE_INFO, "Comparing include remarks...");
|
||||
//writeLog(LOG_TYPE_INFO, "Comparing include remarks...");
|
||||
included = std::any_of(include_remarks.cbegin(), include_remarks.cend(), [&remarks](auto &x)
|
||||
{
|
||||
return regFind(remarks, x);
|
||||
@@ -1564,8 +1587,9 @@ void explodeSub(std::string sub, bool sslibev, bool ssrlibev, std::string custom
|
||||
|
||||
void filterNodes(std::vector<nodeInfo> &nodes, string_array &exclude_remarks, string_array &include_remarks, int groupID)
|
||||
{
|
||||
int index = 0;
|
||||
int node_index = 0;
|
||||
std::vector<nodeInfo>::iterator iter = nodes.begin();
|
||||
/*
|
||||
while(iter != nodes.end())
|
||||
{
|
||||
if(chkIgnore(*iter, exclude_remarks, include_remarks))
|
||||
@@ -1576,12 +1600,92 @@ void filterNodes(std::vector<nodeInfo> &nodes, string_array &exclude_remarks, st
|
||||
else
|
||||
{
|
||||
writeLog(LOG_TYPE_INFO, "Node " + iter->group + " - " + iter->remarks + " has been added.");
|
||||
iter->id = index;
|
||||
iter->id = node_index;
|
||||
iter->groupID = groupID;
|
||||
++index;
|
||||
++node_index;
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
bool excluded = false, included = false;
|
||||
std::vector<std::unique_ptr<pcre2_code, decltype(&pcre2_code_free)>> exclude_patterns, include_patterns;
|
||||
std::vector<std::unique_ptr<pcre2_match_data, decltype(&pcre2_match_data_free)>> exclude_match_data, include_match_data;
|
||||
unsigned int i = 0;
|
||||
PCRE2_SIZE erroroffset;
|
||||
int errornumber, rc;
|
||||
|
||||
for(i = 0; i < exclude_remarks.size(); i++)
|
||||
{
|
||||
std::unique_ptr<pcre2_code, decltype(&pcre2_code_free)> pattern(pcre2_compile(reinterpret_cast<const unsigned char*>(exclude_remarks[i].c_str()), PCRE2_ZERO_TERMINATED | PCRE2_MULTILINE, 0, &errornumber, &erroroffset, NULL), &pcre2_code_free);
|
||||
if(!pattern)
|
||||
return;
|
||||
exclude_patterns.push_back(std::move(pattern));
|
||||
pcre2_jit_compile(exclude_patterns[i].get(), 0);
|
||||
std::unique_ptr<pcre2_match_data, decltype(&pcre2_match_data_free)> match_data(pcre2_match_data_create_from_pattern(exclude_patterns[i].get(), NULL), &pcre2_match_data_free);
|
||||
exclude_match_data.push_back(std::move(match_data));
|
||||
}
|
||||
for(i = 0; i < include_remarks.size(); i++)
|
||||
{
|
||||
std::unique_ptr<pcre2_code, decltype(&pcre2_code_free)> pattern(pcre2_compile(reinterpret_cast<const unsigned char*>(include_remarks[i].c_str()), PCRE2_ZERO_TERMINATED | PCRE2_MULTILINE, 0, &errornumber, &erroroffset, NULL), &pcre2_code_free);
|
||||
if(!pattern)
|
||||
return;
|
||||
include_patterns.push_back(std::move(pattern));
|
||||
pcre2_jit_compile(include_patterns[i].get(), 0);
|
||||
std::unique_ptr<pcre2_match_data, decltype(&pcre2_match_data_free)> match_data(pcre2_match_data_create_from_pattern(include_patterns[i].get(), NULL), &pcre2_match_data_free);
|
||||
include_match_data.push_back(std::move(match_data));
|
||||
}
|
||||
writeLog(LOG_TYPE_INFO, "Filter started.");
|
||||
while(iter != nodes.end())
|
||||
{
|
||||
excluded = false;
|
||||
included = false;
|
||||
for(i = 0; i < exclude_patterns.size(); i++)
|
||||
{
|
||||
rc = pcre2_match(exclude_patterns[i].get(), reinterpret_cast<const unsigned char*>(iter->remarks.c_str()), iter->remarks.size(), 0, 0, exclude_match_data[i].get(), NULL);
|
||||
if (rc < 0)
|
||||
{
|
||||
switch(rc)
|
||||
{
|
||||
case PCRE2_ERROR_NOMATCH: break;
|
||||
default: return;
|
||||
}
|
||||
}
|
||||
else
|
||||
excluded = true;
|
||||
}
|
||||
if(include_patterns.size() > 0)
|
||||
for(i = 0; i < include_patterns.size(); i++)
|
||||
{
|
||||
rc = pcre2_match(include_patterns[i].get(), reinterpret_cast<const unsigned char*>(iter->remarks.c_str()), iter->remarks.size(), 0, 0, include_match_data[i].get(), NULL);
|
||||
if (rc < 0)
|
||||
{
|
||||
switch(rc)
|
||||
{
|
||||
case PCRE2_ERROR_NOMATCH: break;
|
||||
default: return;
|
||||
}
|
||||
}
|
||||
else
|
||||
included = true;
|
||||
}
|
||||
else
|
||||
included = true;
|
||||
if(excluded || !included)
|
||||
{
|
||||
writeLog(LOG_TYPE_INFO, "Node " + iter->group + " - " + iter->remarks + " has been ignored and will not be added.");
|
||||
nodes.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
writeLog(LOG_TYPE_INFO, "Node " + iter->group + " - " + iter->remarks + " has been added.");
|
||||
iter->id = node_index;
|
||||
iter->groupID = groupID;
|
||||
++node_index;
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
writeLog(LOG_TYPE_INFO, "Filter done.");
|
||||
}
|
||||
|
||||
static inline unsigned long long streamToInt(std::string stream)
|
||||
@@ -1590,17 +1694,17 @@ static inline unsigned long long streamToInt(std::string stream)
|
||||
return 0;
|
||||
double streamval = 1.0;
|
||||
if(stream.find("GB") != std::string::npos)
|
||||
streamval = std::pow(1024, 3) * stof(stream.substr(0, stream.size() - 2));
|
||||
streamval = std::pow(1024, 3) * to_number<float>(stream.substr(0, stream.size() - 2), 0.0);
|
||||
else if(stream.find("TB") != std::string::npos)
|
||||
streamval = std::pow(1024, 4) * stof(stream.substr(0, stream.size() - 2));
|
||||
streamval = std::pow(1024, 4) * to_number<float>(stream.substr(0, stream.size() - 2), 0.0);
|
||||
else if(stream.find("PB") != std::string::npos)
|
||||
streamval = std::pow(1024, 5) * stof(stream.substr(0, stream.size() - 2));
|
||||
streamval = std::pow(1024, 5) * to_number<float>(stream.substr(0, stream.size() - 2), 0.0);
|
||||
else if(stream.find("MB") != std::string::npos)
|
||||
streamval = std::pow(1024, 2) * stof(stream.substr(0, stream.size() - 2));
|
||||
streamval = std::pow(1024, 2) * to_number<float>(stream.substr(0, stream.size() - 2), 0.0);
|
||||
else if(stream.find("KB") != std::string::npos)
|
||||
streamval = 1024.0 * stof(stream.substr(0, stream.size() - 2));
|
||||
streamval = 1024.0 * to_number<float>(stream.substr(0, stream.size() - 2), 0.0);
|
||||
else if(stream.find("B") != std::string::npos)
|
||||
streamval = 1.0 * stof(stream.substr(0, stream.size() - 1));
|
||||
streamval = 1.0 * to_number<float>(stream.substr(0, stream.size() - 1), 0.0);
|
||||
return (unsigned long long)streamval;
|
||||
}
|
||||
|
||||
@@ -1611,20 +1715,35 @@ static inline double percentToDouble(std::string percent)
|
||||
|
||||
time_t dateStringToTimestamp(std::string date)
|
||||
{
|
||||
std::vector<std::string> date_array = split(date, ":");
|
||||
if(date_array.size() != 6)
|
||||
return 0;
|
||||
time_t rawtime;
|
||||
struct tm *expire_time;
|
||||
time(&rawtime);
|
||||
expire_time = localtime(&rawtime);
|
||||
expire_time->tm_year = to_int(date_array[0], 1900) - 1900;
|
||||
expire_time->tm_mon = to_int(date_array[1], 1) - 1;
|
||||
expire_time->tm_mday = to_int(date_array[2]);
|
||||
expire_time->tm_hour = to_int(date_array[3]);
|
||||
expire_time->tm_min = to_int(date_array[4]);
|
||||
expire_time->tm_sec = to_int(date_array[5]);
|
||||
return mktime(expire_time);
|
||||
if(startsWith(date, "left="))
|
||||
{
|
||||
time_t seconds_left = 0;
|
||||
date.erase(0, 5);
|
||||
if(endsWith(date, "d"))
|
||||
{
|
||||
date.erase(date.size() - 1);
|
||||
seconds_left = to_number<double>(date, 0.0) * 86400.0;
|
||||
}
|
||||
return rawtime + seconds_left;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct tm *expire_time;
|
||||
std::vector<std::string> date_array = split(date, ":");
|
||||
if(date_array.size() != 6)
|
||||
return 0;
|
||||
|
||||
expire_time = localtime(&rawtime);
|
||||
expire_time->tm_year = to_int(date_array[0], 1900) - 1900;
|
||||
expire_time->tm_mon = to_int(date_array[1], 1) - 1;
|
||||
expire_time->tm_mday = to_int(date_array[2]);
|
||||
expire_time->tm_hour = to_int(date_array[3]);
|
||||
expire_time->tm_min = to_int(date_array[4]);
|
||||
expire_time->tm_sec = to_int(date_array[5]);
|
||||
return mktime(expire_time);
|
||||
}
|
||||
}
|
||||
|
||||
bool getSubInfoFromHeader(std::string &header, std::string &result)
|
||||
@@ -1645,7 +1764,7 @@ bool getSubInfoFromHeader(std::string &header, std::string &result)
|
||||
bool getSubInfoFromNodes(std::vector<nodeInfo> &nodes, string_array &stream_rules, string_array &time_rules, std::string &result)
|
||||
{
|
||||
std::string remarks, pattern, target, stream_info, time_info, retStr;
|
||||
string_array vArray;
|
||||
string_size spos;
|
||||
|
||||
for(nodeInfo &x : nodes)
|
||||
{
|
||||
@@ -1654,11 +1773,11 @@ bool getSubInfoFromNodes(std::vector<nodeInfo> &nodes, string_array &stream_rule
|
||||
{
|
||||
for(std::string &y : stream_rules)
|
||||
{
|
||||
vArray = split(y, "|");
|
||||
if(vArray.size() != 2)
|
||||
spos = y.rfind("|");
|
||||
if(spos == y.npos)
|
||||
continue;
|
||||
pattern = vArray[0];
|
||||
target = vArray[1];
|
||||
pattern = y.substr(0, spos);
|
||||
target = y.substr(spos + 1);
|
||||
if(regMatch(remarks, pattern))
|
||||
{
|
||||
retStr = regReplace(remarks, pattern, target);
|
||||
@@ -1678,11 +1797,11 @@ bool getSubInfoFromNodes(std::vector<nodeInfo> &nodes, string_array &stream_rule
|
||||
{
|
||||
for(std::string &y : time_rules)
|
||||
{
|
||||
vArray = split(y, "|");
|
||||
if(vArray.size() != 2)
|
||||
spos = y.rfind("|");
|
||||
if(spos == y.npos)
|
||||
continue;
|
||||
pattern = vArray[0];
|
||||
target = vArray[1];
|
||||
pattern = y.substr(0, spos);
|
||||
target = y.substr(spos + 1);
|
||||
if(regMatch(remarks, pattern))
|
||||
{
|
||||
retStr = regReplace(remarks, pattern, target);
|
||||
|
||||
@@ -8,7 +8,7 @@ typedef uint64_t hash_t;
|
||||
constexpr hash_t prime = 0x100000001B3ull;
|
||||
constexpr hash_t basis = 0xCBF29CE484222325ull;
|
||||
|
||||
hash_t hash_(char const* str)
|
||||
inline hash_t hash_(char const* str)
|
||||
{
|
||||
hash_t ret{basis};
|
||||
while(*str)
|
||||
@@ -20,7 +20,7 @@ hash_t hash_(char const* str)
|
||||
return ret;
|
||||
}
|
||||
|
||||
hash_t hash_(const std::string &str)
|
||||
inline hash_t hash_(const std::string &str)
|
||||
{
|
||||
return hash_(str.data());
|
||||
}
|
||||
|
||||
@@ -8,10 +8,13 @@
|
||||
#include "multithread.h"
|
||||
#include "socket.h"
|
||||
#include "string_hash.h"
|
||||
#include "logger.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <numeric>
|
||||
#include <cmath>
|
||||
#include <climits>
|
||||
#include <rapidjson/writer.h>
|
||||
#include <rapidjson/document.h>
|
||||
#include <yaml-cpp/yaml.h>
|
||||
@@ -243,14 +246,61 @@ std::string vmessLinkConstruct(std::string remarks, std::string add, std::string
|
||||
return sb.GetString();
|
||||
}
|
||||
|
||||
bool matchRange(std::string &range, int target)
|
||||
{
|
||||
string_array vArray = split(range, ",");
|
||||
bool match = false;
|
||||
int range_begin = 0, range_end = 0;
|
||||
const std::string reg_num = "\\d+", reg_range = "(\\d+)-(\\d+)", reg_not = "\\!(\\d+)", reg_not_range = "\\!(\\d+)-(\\d+)", reg_less = "(\\d+)-", reg_more = "(\\d+)\\+";
|
||||
for(std::string &x : vArray)
|
||||
{
|
||||
if(regMatch(x, reg_num))
|
||||
{
|
||||
if(to_int(x, INT_MAX) == target)
|
||||
match = true;
|
||||
}
|
||||
else if(regMatch(x, reg_range))
|
||||
{
|
||||
range_begin = to_int(regReplace(x, reg_range, "$1"), INT_MAX);
|
||||
range_end = to_int(regReplace(x, reg_range, "$2"), INT_MIN);
|
||||
if(target >= range_begin && target <= range_end)
|
||||
match = true;
|
||||
}
|
||||
else if(regMatch(x, reg_not))
|
||||
{
|
||||
if(to_int(regReplace(x, reg_not, "$1"), INT_MAX) == target)
|
||||
match = false;
|
||||
}
|
||||
else if(regMatch(x, reg_not_range))
|
||||
{
|
||||
range_begin = to_int(regReplace(x, reg_range, "$1"), INT_MAX);
|
||||
range_end = to_int(regReplace(x, reg_range, "$2"), INT_MIN);
|
||||
if(target >= range_begin && target <= range_end)
|
||||
match = false;
|
||||
}
|
||||
else if(regMatch(x, reg_less))
|
||||
{
|
||||
if(to_int(regReplace(x, reg_less, "$1"), INT_MAX) <= target)
|
||||
match = true;
|
||||
}
|
||||
else if(regMatch(x, reg_more))
|
||||
{
|
||||
if(to_int(regReplace(x, reg_more, "$1"), INT_MIN) >= target)
|
||||
match = true;
|
||||
}
|
||||
}
|
||||
return match;
|
||||
}
|
||||
|
||||
std::string nodeRename(std::string remark, int groupID, const string_array &rename_array)
|
||||
{
|
||||
string_array vArray;
|
||||
int targetGroupID = groupID;
|
||||
std::string targetRange;
|
||||
string_size pos;
|
||||
|
||||
for(const std::string &x : rename_array)
|
||||
{
|
||||
targetRange = std::to_string(groupID);
|
||||
vArray = split(x, "@");
|
||||
if(vArray.size() == 1)
|
||||
{
|
||||
@@ -263,13 +313,13 @@ std::string nodeRename(std::string remark, int groupID, const string_array &rena
|
||||
pos = vArray[0].find("!!", vArray[0].find("!!") + 2);
|
||||
if(pos != vArray[0].npos)
|
||||
{
|
||||
targetGroupID = to_int(vArray[0].substr(10, pos - 10), groupID);
|
||||
targetRange = vArray[0].substr(10, pos - 10);
|
||||
vArray[0] = vArray[0].substr(pos + 2);
|
||||
}
|
||||
else
|
||||
continue;
|
||||
}
|
||||
if(groupID == targetGroupID)
|
||||
if(matchRange(targetRange, groupID))
|
||||
remark = regReplace(remark, vArray[0], vArray[1]);
|
||||
}
|
||||
return remark;
|
||||
@@ -291,11 +341,12 @@ std::string removeEmoji(std::string remark)
|
||||
std::string addEmoji(std::string remark, int groupID, const string_array &emoji_array)
|
||||
{
|
||||
string_array vArray;
|
||||
int targetGroupID = groupID;
|
||||
std::string targetRange;
|
||||
string_size pos;
|
||||
|
||||
for(const std::string &x : emoji_array)
|
||||
{
|
||||
targetRange = std::to_string(groupID);
|
||||
vArray = split(x, ",");
|
||||
if(vArray.size() != 2)
|
||||
continue;
|
||||
@@ -304,13 +355,13 @@ std::string addEmoji(std::string remark, int groupID, const string_array &emoji_
|
||||
pos = vArray[0].find("!!", vArray[0].find("!!") + 2);
|
||||
if(pos != vArray[0].npos)
|
||||
{
|
||||
targetGroupID = to_int(vArray[0].substr(10, pos - 10), groupID);
|
||||
targetRange = vArray[0].substr(10, pos - 10);
|
||||
vArray[0] = vArray[0].substr(pos + 2);
|
||||
}
|
||||
else
|
||||
continue;
|
||||
}
|
||||
if(groupID == targetGroupID && regFind(remark, vArray[0]))
|
||||
if(matchRange(targetRange, groupID) && regFind(remark, vArray[0]))
|
||||
{
|
||||
remark = vArray[1] + " " + remark;
|
||||
break;
|
||||
@@ -352,11 +403,18 @@ void rulesetToClash(YAML::Node &base_rule, std::vector<ruleset_content> &ruleset
|
||||
while(getline(strStrm, strLine, delimiter))
|
||||
{
|
||||
lineSize = strLine.size();
|
||||
/*
|
||||
if(lineSize && strLine[lineSize - 1] == '\r') //remove line break
|
||||
{
|
||||
strLine.erase(lineSize - 1);
|
||||
lineSize--;
|
||||
}
|
||||
*/
|
||||
if(lineSize)
|
||||
{
|
||||
strLine = regTrim(strLine);
|
||||
lineSize = strLine.size();
|
||||
}
|
||||
if(!lineSize || strLine[0] == ';' || strLine[0] == '#' || (lineSize >= 2 && strLine[0] == '/' && strLine[1] == '/')) //empty lines and comments are ignored
|
||||
continue;
|
||||
if(strLine.find("USER-AGENT") == 0 || strLine.find("URL-REGEX") == 0 || strLine.find("PROCESS-NAME") == 0 || strLine.find("AND") == 0 || strLine.find("OR") == 0) //remove unsupported types
|
||||
@@ -491,11 +549,18 @@ void rulesetToSurge(INIReader &base_rule, std::vector<ruleset_content> &ruleset_
|
||||
while(getline(strStrm, strLine, delimiter))
|
||||
{
|
||||
lineSize = strLine.size();
|
||||
/*
|
||||
if(lineSize && strLine[lineSize - 1] == '\r') //remove line break
|
||||
{
|
||||
strLine.erase(lineSize - 1);
|
||||
lineSize--;
|
||||
}
|
||||
*/
|
||||
if(lineSize)
|
||||
{
|
||||
strLine = regTrim(strLine);
|
||||
lineSize = strLine.size();
|
||||
}
|
||||
if(!lineSize || strLine[0] == ';' || strLine[0] == '#' || (lineSize >= 2 && strLine[0] == '/' && strLine[1] == '/')) //empty lines and comments are ignored
|
||||
continue;
|
||||
if((surge_ver == -1 || surge_ver == -2) && (strLine.find("IP-CIDR6") == 0 || strLine.find("URL-REGEX") == 0 || strLine.find("PROCESS-NAME") == 0 || strLine.find("AND") == 0 || strLine.find("OR") == 0)) //remove unsupported types
|
||||
@@ -565,7 +630,7 @@ void groupGenerate(std::string &rule, std::vector<nodeInfo> &nodelist, std::vect
|
||||
|
||||
for(nodeInfo &y : nodelist)
|
||||
{
|
||||
if(y.groupID == to_int(group) && regFind(y.remarks, rule) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end())
|
||||
if(matchRange(group, y.groupID) && regFind(y.remarks, rule) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end())
|
||||
filtered_nodelist.emplace_back(y.remarks);
|
||||
}
|
||||
}
|
||||
@@ -575,7 +640,7 @@ void groupGenerate(std::string &rule, std::vector<nodeInfo> &nodelist, std::vect
|
||||
|
||||
for(nodeInfo &y : nodelist)
|
||||
{
|
||||
if(y.groupID == to_int(group) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end())
|
||||
if(matchRange(group, y.groupID) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end())
|
||||
filtered_nodelist.emplace_back(y.remarks);
|
||||
}
|
||||
}
|
||||
@@ -627,7 +692,7 @@ void netchToClash(std::vector<nodeInfo> &nodes, YAML::Node &yamlnode, string_arr
|
||||
|
||||
type = GetMember(json, "Type");
|
||||
if(ext.append_proxy_type)
|
||||
x.remarks = "[" + type + "]" + x.remarks;
|
||||
x.remarks = "[" + type + "] " + x.remarks;
|
||||
|
||||
while(std::count(remarks_list.begin(), remarks_list.end(), x.remarks) > 0)
|
||||
x.remarks += "$";
|
||||
@@ -654,6 +719,8 @@ void netchToClash(std::vector<nodeInfo> &nodes, YAML::Node &yamlnode, string_arr
|
||||
singleproxy["type"] = "ss";
|
||||
singleproxy["cipher"] = method;
|
||||
singleproxy["password"] = password;
|
||||
if(std::all_of(password.begin(), password.end(), ::isdigit))
|
||||
singleproxy["password"].SetTag("str");
|
||||
if(plugin == "simple-obfs" || plugin == "obfs-local")
|
||||
{
|
||||
singleproxy["plugin"] = "obfs";
|
||||
@@ -723,6 +790,8 @@ void netchToClash(std::vector<nodeInfo> &nodes, YAML::Node &yamlnode, string_arr
|
||||
singleproxy["type"] = "ssr";
|
||||
singleproxy["cipher"] = method;
|
||||
singleproxy["password"] = password;
|
||||
if(std::all_of(password.begin(), password.end(), ::isdigit))
|
||||
singleproxy["password"].SetTag("str");
|
||||
singleproxy["protocol"] = protocol;
|
||||
singleproxy["protocolparam"] = protoparam;
|
||||
singleproxy["obfs"] = obfs;
|
||||
@@ -732,6 +801,8 @@ void netchToClash(std::vector<nodeInfo> &nodes, YAML::Node &yamlnode, string_arr
|
||||
singleproxy["type"] = "socks5";
|
||||
singleproxy["username"] = username;
|
||||
singleproxy["password"] = password;
|
||||
if(std::all_of(password.begin(), password.end(), ::isdigit))
|
||||
singleproxy["password"].SetTag("str");
|
||||
if(ext.skip_cert_verify)
|
||||
singleproxy["skip-cert-verify"] = true;
|
||||
break;
|
||||
@@ -739,6 +810,8 @@ void netchToClash(std::vector<nodeInfo> &nodes, YAML::Node &yamlnode, string_arr
|
||||
singleproxy["type"] = "http";
|
||||
singleproxy["username"] = username;
|
||||
singleproxy["password"] = password;
|
||||
if(std::all_of(password.begin(), password.end(), ::isdigit))
|
||||
singleproxy["password"].SetTag("str");
|
||||
singleproxy["tls"] = type == "HTTPS";
|
||||
if(ext.skip_cert_verify)
|
||||
singleproxy["skip-cert-verify"] = true;
|
||||
@@ -780,20 +853,23 @@ void netchToClash(std::vector<nodeInfo> &nodes, YAML::Node &yamlnode, string_arr
|
||||
singlegroup["name"] = vArray[0];
|
||||
singlegroup["type"] = vArray[1];
|
||||
|
||||
if(vArray[1] == "select")
|
||||
rules_upper_bound = vArray.size();
|
||||
switch(hash_(vArray[1]))
|
||||
{
|
||||
rules_upper_bound = vArray.size();
|
||||
}
|
||||
else if(vArray[1] == "url-test" || vArray[1] == "fallback" || vArray[1] == "load-balance")
|
||||
{
|
||||
if(vArray.size() < 5)
|
||||
case "select"_hash:
|
||||
break;
|
||||
case "url-test"_hash:
|
||||
case "fallback"_hash:
|
||||
case "load-balance"_hash:
|
||||
if(rules_upper_bound < 5)
|
||||
continue;
|
||||
rules_upper_bound = vArray.size() - 2;
|
||||
singlegroup["url"] = vArray[vArray.size() - 2];
|
||||
singlegroup["interval"] = to_int(vArray[vArray.size() - 1]);
|
||||
}
|
||||
else
|
||||
rules_upper_bound -= 2;
|
||||
singlegroup["url"] = vArray[rules_upper_bound];
|
||||
singlegroup["interval"] = to_int(vArray[rules_upper_bound + 1]);
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
for(unsigned int i = 2; i < rules_upper_bound; i++)
|
||||
groupGenerate(vArray[i], nodelist, filtered_nodelist, true);
|
||||
@@ -865,6 +941,12 @@ std::string netchToSurge(std::vector<nodeInfo> &nodes, std::string &base_conf, s
|
||||
string_array vArray, remarks_list, filtered_nodelist, args;
|
||||
|
||||
ini.store_any_line = true;
|
||||
// filter out sections that requires direct-save
|
||||
ini.AddDirectSaveSection("Rule");
|
||||
ini.AddDirectSaveSection("MITM");
|
||||
ini.AddDirectSaveSection("Script");
|
||||
ini.AddDirectSaveSection("URL Rewrite");
|
||||
ini.AddDirectSaveSection("Header Rewrite");
|
||||
if(ini.Parse(base_conf) != 0 && !ext.nodelist)
|
||||
return std::string();
|
||||
|
||||
@@ -896,7 +978,7 @@ std::string netchToSurge(std::vector<nodeInfo> &nodes, std::string &base_conf, s
|
||||
type = GetMember(json, "Type");
|
||||
|
||||
if(ext.append_proxy_type)
|
||||
x.remarks = "[" + type + "]" + x.remarks;
|
||||
x.remarks = "[" + type + "] " + x.remarks;
|
||||
remark = x.remarks;
|
||||
|
||||
while(std::count(remarks_list.begin(), remarks_list.end(), x.remarks) > 0)
|
||||
@@ -939,9 +1021,9 @@ std::string netchToSurge(std::vector<nodeInfo> &nodes, std::string &base_conf, s
|
||||
proxy = "vmess, " + hostname + ", " + port + ", username=" + id + ", tls=" + (tlssecure ? "true" : "false");
|
||||
if(transproto == "ws")
|
||||
{
|
||||
proxy += ", ws=true, ws-path=" + path + ", ws-headers=Host:" + host;
|
||||
proxy += ", ws=true, ws-path=" + path + ", ws-headers=Host:\"" + host + "\"";
|
||||
if(edge.size())
|
||||
proxy += "|Edge:" + edge;
|
||||
proxy += "|Edge:\"" + edge + "\"";
|
||||
}
|
||||
if(ext.skip_cert_verify)
|
||||
proxy += ", skip-cert-verify=1";
|
||||
@@ -1029,14 +1111,14 @@ std::string netchToSurge(std::vector<nodeInfo> &nodes, std::string &base_conf, s
|
||||
break;
|
||||
case "url-test"_hash:
|
||||
case "fallback"_hash:
|
||||
if(vArray.size() < 5)
|
||||
if(rules_upper_bound < 5)
|
||||
continue;
|
||||
rules_upper_bound -= 2;
|
||||
url = vArray[rules_upper_bound];
|
||||
interval = to_int(vArray[rules_upper_bound + 1]);
|
||||
break;
|
||||
case "ssid"_hash:
|
||||
if(vArray.size() < 4)
|
||||
if(rules_upper_bound < 4)
|
||||
continue;
|
||||
proxy = vArray[1] + ",default=" + vArray[2] + ",";
|
||||
proxy += std::accumulate(vArray.begin() + 4, vArray.end(), vArray[3], [](std::string a, std::string b)
|
||||
@@ -1044,7 +1126,6 @@ std::string netchToSurge(std::vector<nodeInfo> &nodes, std::string &base_conf, s
|
||||
return std::move(a) + "," + std::move(b);
|
||||
});
|
||||
ini.Set("{NONAME}", vArray[0] + " = " + proxy); //insert order
|
||||
continue;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
@@ -1350,11 +1431,13 @@ std::string netchToQuan(std::vector<nodeInfo> &nodes, std::string &base_conf, st
|
||||
if(ext.nodelist)
|
||||
{
|
||||
string_array allnodes;
|
||||
std::string allLinks;
|
||||
ini.GetAll("SERVER", "{NONAME}", allnodes);
|
||||
std::string allLinks = std::accumulate(std::next(allnodes.begin()), allnodes.end(), allnodes[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "\n" + std::move(b);
|
||||
});
|
||||
if(allnodes.size())
|
||||
allLinks = std::accumulate(std::next(allnodes.begin()), allnodes.end(), allnodes[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "\n" + std::move(b);
|
||||
});
|
||||
return base64_encode(allLinks);
|
||||
}
|
||||
return ini.ToString();
|
||||
@@ -1399,7 +1482,7 @@ void netchToQuan(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rules
|
||||
type = GetMember(json, "Type");
|
||||
|
||||
if(ext.append_proxy_type)
|
||||
x.remarks = "[" + type + "]" + x.remarks;
|
||||
x.remarks = "[" + type + "] " + x.remarks;
|
||||
|
||||
while(std::count(remarks_list.begin(), remarks_list.end(), x.remarks) > 0)
|
||||
x.remarks += "$";
|
||||
@@ -1517,8 +1600,16 @@ void netchToQuan(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rules
|
||||
break;
|
||||
case "fallback"_hash:
|
||||
type = "static";
|
||||
if(vArray.size() < 5)
|
||||
continue;
|
||||
rules_upper_bound -= 2;
|
||||
break;
|
||||
case "url-test"_hash:
|
||||
type = "auto";
|
||||
if(vArray.size() < 5)
|
||||
continue;
|
||||
rules_upper_bound -= 2;
|
||||
break;
|
||||
case "load-balance"_hash:
|
||||
type = "balance, round-robin";
|
||||
if(vArray.size() < 5)
|
||||
@@ -1557,6 +1648,7 @@ std::string netchToQuanX(std::vector<nodeInfo> &nodes, std::string &base_conf, s
|
||||
{
|
||||
INIReader ini;
|
||||
ini.store_any_line = true;
|
||||
ini.AddDirectSaveSection("rewrite_local");
|
||||
if(!ext.nodelist && ini.Parse(base_conf) != 0)
|
||||
return std::string();
|
||||
|
||||
@@ -1565,11 +1657,13 @@ std::string netchToQuanX(std::vector<nodeInfo> &nodes, std::string &base_conf, s
|
||||
if(ext.nodelist)
|
||||
{
|
||||
string_array allnodes;
|
||||
std::string allLinks;
|
||||
ini.GetAll("server_local", "{NONAME}", allnodes);
|
||||
std::string allLinks = std::accumulate(std::next(allnodes.begin()), allnodes.end(), allnodes[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "\n" + std::move(b);
|
||||
});
|
||||
if(allnodes.size())
|
||||
allLinks = std::accumulate(std::next(allnodes.begin()), allnodes.end(), allnodes[0], [](std::string a, std::string b)
|
||||
{
|
||||
return std::move(a) + "\n" + std::move(b);
|
||||
});
|
||||
return allLinks;
|
||||
}
|
||||
return ini.ToString();
|
||||
@@ -1614,7 +1708,7 @@ void netchToQuanX(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rule
|
||||
type = GetMember(json, "Type");
|
||||
|
||||
if(ext.append_proxy_type)
|
||||
x.remarks = "[" + type + "]" + x.remarks;
|
||||
x.remarks = "[" + type + "] " + x.remarks;
|
||||
|
||||
while(std::count(remarks_list.begin(), remarks_list.end(), x.remarks) > 0)
|
||||
x.remarks += "$";
|
||||
@@ -1677,6 +1771,7 @@ void netchToQuanX(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rule
|
||||
proxyStr += ", udp-relay=true";
|
||||
proxyStr += ", tag=" + remark;
|
||||
|
||||
remarks_list.push_back(remark);
|
||||
ini.Set("{NONAME}", proxyStr);
|
||||
nodelist.emplace_back(x);
|
||||
}
|
||||
@@ -1711,11 +1806,16 @@ void netchToQuanX(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rule
|
||||
case "url-test"_hash:
|
||||
case "fallback"_hash:
|
||||
type = "available";
|
||||
case "load-balance"_hash:
|
||||
type = "round-robin";
|
||||
if(vArray.size() < 5)
|
||||
if(rules_upper_bound < 5)
|
||||
continue;
|
||||
rules_upper_bound -= 2;
|
||||
break;
|
||||
case "load-balance"_hash:
|
||||
type = "round-robin";
|
||||
if(rules_upper_bound < 5)
|
||||
continue;
|
||||
rules_upper_bound -= 2;
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
@@ -1732,7 +1832,7 @@ void netchToQuanX(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rule
|
||||
{
|
||||
std::string groupdata = n.second;
|
||||
std::string::size_type cpos = groupdata.find(",");
|
||||
if(cpos != std::string::npos)
|
||||
if(cpos != groupdata.npos)
|
||||
return trim(groupdata.substr(0, cpos)) == name;
|
||||
else
|
||||
return false;
|
||||
@@ -1807,9 +1907,9 @@ void netchToQuanX(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rule
|
||||
{
|
||||
pos = content.find(",");
|
||||
url = ext.managed_config_prefix + "/qx-rewrite?id=" + ext.quanx_dev_id + "&url=" + urlsafe_base64_encode(content.substr(0, pos));
|
||||
content = url;
|
||||
if(pos != content.npos)
|
||||
content += content.substr(content.find(","));
|
||||
url += content.substr(pos);
|
||||
content = url;
|
||||
}
|
||||
ini.Set("{NONAME}", content);
|
||||
}
|
||||
@@ -1999,7 +2099,7 @@ void netchToMellow(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rul
|
||||
type = GetMember(json, "Type");
|
||||
|
||||
if(ext.append_proxy_type)
|
||||
x.remarks = "[" + type + "]" + x.remarks;
|
||||
x.remarks = "[" + type + "] " + x.remarks;
|
||||
remark = x.remarks;
|
||||
|
||||
while(std::count(remarks_list.begin(), remarks_list.end(), remark) > 0)
|
||||
@@ -2076,6 +2176,7 @@ void netchToMellow(std::vector<nodeInfo> &nodes, INIReader &ini, std::vector<rul
|
||||
continue;
|
||||
rules_upper_bound -= 2;
|
||||
url = vArray[vArray.size() - 2];
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
@@ -2169,7 +2270,7 @@ std::string netchToLoon(std::vector<nodeInfo> &nodes, std::string &base_conf, st
|
||||
type = GetMember(json, "Type");
|
||||
|
||||
if(ext.append_proxy_type)
|
||||
x.remarks = "[" + type + "]" + x.remarks;
|
||||
x.remarks = "[" + type + "] " + x.remarks;
|
||||
remark = x.remarks;
|
||||
|
||||
while(std::count(remarks_list.begin(), remarks_list.end(), x.remarks) > 0)
|
||||
@@ -2195,7 +2296,7 @@ std::string netchToLoon(std::vector<nodeInfo> &nodes, std::string &base_conf, st
|
||||
if(pluginopts.size())
|
||||
proxy += "," + replace_all_distinct(replace_all_distinct(pluginopts, ";obfs-host=", ","), "obfs=", "");
|
||||
}
|
||||
else
|
||||
else if(plugin.size())
|
||||
continue;
|
||||
break;
|
||||
case SPEEDTEST_MESSAGE_FOUNDVMESS:
|
||||
@@ -2299,7 +2400,6 @@ std::string netchToLoon(std::vector<nodeInfo> &nodes, std::string &base_conf, st
|
||||
return std::move(a) + "," + std::move(b);
|
||||
});
|
||||
ini.Set("{NONAME}", vArray[0] + " = " + proxy); //insert order
|
||||
continue;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
@@ -2361,21 +2461,24 @@ int uploadGist(std::string name, std::string path, std::string content, bool wri
|
||||
|
||||
if(!fileExist("gistconf.ini"))
|
||||
{
|
||||
std::cerr<<"gistconf.ini not found. Skipping...\n";
|
||||
//std::cerr<<"gistconf.ini not found. Skipping...\n";
|
||||
writeLog(0, "gistconf.ini not found. Skipping...", LOG_LEVEL_ERROR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ini.ParseFile("gistconf.ini");
|
||||
if(ini.EnterSection("common") != 0)
|
||||
{
|
||||
std::cerr<<"gistconf.ini has incorrect format. Skipping...\n";
|
||||
//std::cerr<<"gistconf.ini has incorrect format. Skipping...\n";
|
||||
writeLog(0, "gistconf.ini has incorrect format. Skipping...", LOG_LEVEL_ERROR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
token = ini.Get("token");
|
||||
if(!token.size())
|
||||
{
|
||||
std::cerr<<"No token is provided. Skipping...\n";
|
||||
//std::cerr<<"No token is provided. Skipping...\n";
|
||||
writeLog(0, "No token is provided. Skipping...", LOG_LEVEL_ERROR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2391,24 +2494,28 @@ int uploadGist(std::string name, std::string path, std::string content, bool wri
|
||||
|
||||
if(!id.size())
|
||||
{
|
||||
std::cerr<<"No gist id is provided. Creating new gist...\n";
|
||||
retVal = curlPost("https://api.github.com/gists", buildGistData(path, content), getSystemProxy(), token, &retData);
|
||||
//std::cerr<<"No gist id is provided. Creating new gist...\n";
|
||||
writeLog(0, "No Gist id is provided. Creating new Gist...", LOG_LEVEL_ERROR);
|
||||
retVal = webPost("https://api.github.com/gists", buildGistData(path, content), getSystemProxy(), token, &retData);
|
||||
if(retVal != 201)
|
||||
{
|
||||
std::cerr<<"Create new Gist failed! Return data:\n"<<retData<<"\n";
|
||||
//std::cerr<<"Create new Gist failed! Return data:\n"<<retData<<"\n";
|
||||
writeLog(0, "Create new Gist failed! Return data:\n" + retData, LOG_LEVEL_ERROR);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
url = "https://gist.githubusercontent.com/" + username + "/" + id + "/raw/" + path;
|
||||
std::cerr<<"Gist id provided. Modifying gist...\n";
|
||||
//std::cerr<<"Gist id provided. Modifying Gist...\n";
|
||||
writeLog(0, "Gist id provided. Modifying Gist...", LOG_LEVEL_INFO);
|
||||
if(writeManageURL)
|
||||
content = "#!MANAGED-CONFIG " + url + "\n" + content;
|
||||
retVal = curlPatch("https://api.github.com/gists/" + id, buildGistData(path, content), getSystemProxy(), token, &retData);
|
||||
retVal = webPatch("https://api.github.com/gists/" + id, buildGistData(path, content), getSystemProxy(), token, &retData);
|
||||
if(retVal != 200)
|
||||
{
|
||||
std::cerr<<"Modify gist failed! Return data:\n"<<retData<<"\n";
|
||||
//std::cerr<<"Modify gist failed! Return data:\n"<<retData<<"\n";
|
||||
writeLog(0, "Modify Gist failed! Return data:\n" + retData, LOG_LEVEL_ERROR);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -2417,7 +2524,8 @@ int uploadGist(std::string name, std::string path, std::string content, bool wri
|
||||
if(json.HasMember("owner"))
|
||||
GetMember(json["owner"], "login", username);
|
||||
url = "https://gist.githubusercontent.com/" + username + "/" + id + "/raw/" + path;
|
||||
std::cerr<<"Writing to Gist success!\nGenerator: "<<name<<"\nPath: "<<path<<"\nRaw URL: "<<url<<"\nGist owner: "<<username<<"\n";
|
||||
//std::cerr<<"Writing to Gist success!\nGenerator: "<<name<<"\nPath: "<<path<<"\nRaw URL: "<<url<<"\nGist owner: "<<username<<"\n";
|
||||
writeLog(0, "Writing to Gist success!\nGenerator: " + name + "\nPath: " + path + "\nRaw URL: " + url + "\nGist owner: " + username, LOG_LEVEL_INFO);
|
||||
|
||||
ini.EraseSection();
|
||||
ini.Set("token", token);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#ifndef VERSION_H_INCLUDED
|
||||
#define VERSION_H_INCLUDED
|
||||
|
||||
#define VERSION "v0.4.0"
|
||||
#define VERSION "v0.4.3"
|
||||
|
||||
#endif // VERSION_H_INCLUDED
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <mutex>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
@@ -16,6 +17,10 @@
|
||||
#endif // _WIN32
|
||||
|
||||
extern bool print_debug_info;
|
||||
extern int global_log_level;
|
||||
|
||||
typedef std::lock_guard<std::mutex> guarded_mutex;
|
||||
std::mutex cache_rw_lock;
|
||||
|
||||
//std::string user_agent_str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36";
|
||||
std::string user_agent_str = "subconverter/" + std::string(VERSION) + " cURL/" + std::string(LIBCURL_VERSION);
|
||||
@@ -43,7 +48,7 @@ static int writer(char *data, size_t size, size_t nmemb, std::string *writerData
|
||||
static inline void curl_set_common_options(CURL *curl_handle, const char *url)
|
||||
{
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, print_debug_info ? 1L : 0L);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, global_log_level == LOG_LEVEL_VERBOSE ? 1L : 0L);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1L);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
@@ -57,6 +62,7 @@ static std::string curlGet(std::string url, std::string proxy, std::string &resp
|
||||
{
|
||||
CURL *curl_handle;
|
||||
std::string data;
|
||||
long retVal = 0;
|
||||
|
||||
curl_init();
|
||||
|
||||
@@ -70,10 +76,12 @@ static std::string curlGet(std::string url, std::string proxy, std::string &resp
|
||||
curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy.data());
|
||||
|
||||
return_code = curl_easy_perform(curl_handle);
|
||||
curl_easy_getinfo(curl_handle, CURLINFO_HTTP_CODE, &retVal);
|
||||
curl_easy_cleanup(curl_handle);
|
||||
|
||||
if(return_code != CURLE_OK)
|
||||
if(return_code != CURLE_OK || retVal != 200)
|
||||
data.clear();
|
||||
data.shrink_to_fit();
|
||||
|
||||
return data;
|
||||
}
|
||||
@@ -121,6 +129,7 @@ std::string webGet(std::string url, std::string proxy, std::string &response_hea
|
||||
if(difftime(now, mtime) <= cache_ttl) // within TTL
|
||||
{
|
||||
writeLog(0, "CACHE HIT: '" + url + "', using local cache.");
|
||||
guarded_mutex guard(cache_rw_lock);
|
||||
response_headers = fileGet(path_header, true);
|
||||
return fileGet(path, true);
|
||||
}
|
||||
@@ -131,6 +140,7 @@ std::string webGet(std::string url, std::string proxy, std::string &response_hea
|
||||
content = curlGet(url, proxy, response_headers, return_code); // try to fetch data
|
||||
if(return_code == CURLE_OK) // success, save new cache
|
||||
{
|
||||
guarded_mutex guard(cache_rw_lock);
|
||||
fileWrite(path, content, true);
|
||||
fileWrite(path_header, response_headers, true);
|
||||
}
|
||||
@@ -139,6 +149,7 @@ std::string webGet(std::string url, std::string proxy, std::string &response_hea
|
||||
if(fileExist(path)) // failed, check if cache exist
|
||||
{
|
||||
writeLog(0, "Fetch failed. Serving cached content."); // cache exist, serving cache
|
||||
guarded_mutex guard(cache_rw_lock);
|
||||
content = fileGet(path, true);
|
||||
response_headers = fileGet(path_header, true);
|
||||
}
|
||||
@@ -161,7 +172,7 @@ int curlPost(std::string url, std::string data, std::string proxy, std::string a
|
||||
CURL *curl_handle;
|
||||
CURLcode res;
|
||||
struct curl_slist *list = NULL;
|
||||
int retVal = 0;
|
||||
long retVal = 0;
|
||||
|
||||
curl_init();
|
||||
curl_handle = curl_easy_init();
|
||||
@@ -193,11 +204,16 @@ int curlPost(std::string url, std::string data, std::string proxy, std::string a
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int webPost(std::string url, std::string data, std::string proxy, std::string auth_token, std::string *retData)
|
||||
{
|
||||
return curlPost(url, data, proxy, auth_token, retData);
|
||||
}
|
||||
|
||||
int curlPatch(std::string url, std::string data, std::string proxy, std::string auth_token, std::string *retData)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURLcode res;
|
||||
int retVal = 0;
|
||||
long retVal = 0;
|
||||
struct curl_slist *list = NULL;
|
||||
|
||||
curl_init();
|
||||
@@ -230,3 +246,8 @@ int curlPatch(std::string url, std::string data, std::string proxy, std::string
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int webPatch(std::string url, std::string data, std::string proxy, std::string auth_token, std::string *retData)
|
||||
{
|
||||
return curlPatch(url, data, proxy, auth_token, retData);
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
|
||||
std::string webGet(std::string url, std::string proxy);
|
||||
std::string webGet(std::string url, std::string proxy, std::string &response_headers, unsigned int cache_ttl = 0);
|
||||
int curlPost(std::string url, std::string data, std::string proxy, std::string auth_token, std::string *retData);
|
||||
int curlPatch(std::string url, std::string data, std::string proxy, std::string auth_token, std::string *retData);
|
||||
int webPost(std::string url, std::string data, std::string proxy, std::string auth_token, std::string *retData);
|
||||
int webPatch(std::string url, std::string data, std::string proxy, std::string auth_token, std::string *retData);
|
||||
std::string buildSocks5ProxyString(std::string addr, int port, std::string username, std::string password);
|
||||
|
||||
// Unimplemented: (CURLOPT_HTTPHEADER: Host:)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "misc.h"
|
||||
#include "webserver.h"
|
||||
#include "socket.h"
|
||||
#include "logger.h"
|
||||
|
||||
extern std::string user_agent_str;
|
||||
std::atomic_bool SERVER_EXIT_FLAG(false);
|
||||
@@ -41,7 +42,8 @@ static inline void buffer_cleanup(struct evbuffer *eb)
|
||||
static inline int process_request(const char *method_str, std::string uri, std::string &postdata, std::string &content_type, std::string &return_data, int *status_code, std::map<std::string, std::string> &extra_headers)
|
||||
{
|
||||
std::string path, arguments;
|
||||
std::cerr << "handle_cmd: " << method_str << std::endl << "handle_uri: " << uri << std::endl;
|
||||
//std::cerr << "handle_cmd: " << method_str << std::endl << "handle_uri: " << uri << std::endl;
|
||||
writeLog(0, "handle_cmd: " + std::string(method_str) + " handle_uri: " + uri, LOG_LEVEL_VERBOSE);
|
||||
|
||||
if(strFind(uri, "?"))
|
||||
{
|
||||
@@ -77,7 +79,8 @@ void OnReq(evhttp_request *req, void *args)
|
||||
char *client_ip;
|
||||
u_short client_port;
|
||||
evhttp_connection_get_peer(evhttp_request_get_connection(req), &client_ip, &client_port);
|
||||
std::cerr<<"Accept connection from client "<<client_ip<<":"<<client_port<<"\n";
|
||||
//std::cerr<<"Accept connection from client "<<client_ip<<":"<<client_port<<"\n";
|
||||
writeLog(0, "Accept connection from client " + std::string(client_ip) + ":" + std::to_string(client_port), LOG_LEVEL_DEBUG);
|
||||
int retVal;
|
||||
std::string postdata, content_type, return_data;
|
||||
|
||||
@@ -154,7 +157,8 @@ int start_web_server(void *argv)
|
||||
int port = args->port;
|
||||
if (!event_init())
|
||||
{
|
||||
std::cerr << "Failed to init libevent." << std::endl;
|
||||
//std::cerr << "Failed to init libevent." << std::endl;
|
||||
writeLog(0, "Failed to init libevent.", LOG_LEVEL_FATAL);
|
||||
return -1;
|
||||
}
|
||||
const char *SrvAddress = listen_address.c_str();
|
||||
@@ -162,7 +166,8 @@ int start_web_server(void *argv)
|
||||
std::unique_ptr<evhttp, decltype(&evhttp_free)> Server(evhttp_start(SrvAddress, SrvPort), &evhttp_free);
|
||||
if (!Server)
|
||||
{
|
||||
std::cerr << "Failed to init http server." << std::endl;
|
||||
//std::cerr << "Failed to init http server." << std::endl;
|
||||
writeLog(0, "Failed to init http server.", LOG_LEVEL_FATAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -171,7 +176,8 @@ int start_web_server(void *argv)
|
||||
evhttp_set_timeout(Server.get(), 30);
|
||||
if (event_dispatch() == -1)
|
||||
{
|
||||
std::cerr << "Failed to run message loop." << std::endl;
|
||||
//std::cerr << "Failed to run message loop." << std::endl;
|
||||
writeLog(0, "Failed to run message loop.", LOG_LEVEL_FATAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user