Compare commits

..

32 Commits

Author SHA1 Message Date
Tindy X
22582a9bd5 Bump version to v0.4.3 2020-03-12 15:59:38 +08:00
Tindy X
55ad853a2c Update local rulesets and configs 2020-03-12 15:55:02 +08:00
Tindy X
5594070657 Enhancements
Fix not processing quotes in ws-headers in Surge VMess configurations.
Fix when default_url is set and insert_url is not set in YAML configuration and access /sub without url argument, the nodes in default_url will be added twice.
Add /version interface to compatible with some front-end.
2020-03-11 23:54:08 +08:00
Tindy X
550670006d Fix a bug which may cause crash at startup on some platforms 2020-03-10 22:40:15 +08:00
Tindy X
b5e3763978 Fix INIReader not checking direct save/ignore section for isolated items 2020-03-09 23:02:16 +08:00
Tindy X
000dffce23 Enhancements
Fix potential crash when parsing some stream nodes.
Add support for some other types of stream/expiry time nodes.
Update build scripts.
2020-03-09 16:20:10 +08:00
Tindy X
98599f3b61 Enhancement
Add support for keeping the original order of proxies when parsing Surge/Quantumult X subscriptions.
2020-03-09 13:06:18 +08:00
Tindy X
7bbd9af989 Enhancements
Fix compatibility problem with some non-standard subscriptions.
Add support for specifying token for each profile.
2020-03-09 12:28:24 +08:00
Tindy X
4eda0edb26 Clean up basic function names 2020-03-07 23:52:25 +08:00
Tindy X
9aa64c4132 Bug fixes
Fix when importing rulesets, some invisible characters are also added to the result.
Fix proxy group/ruleset settings not working properly with YAML format external configurations.
2020-03-06 00:43:13 +08:00
Tindy X
908d8ec19d Add log_level option to filter output logs 2020-03-05 13:57:58 +08:00
Tindy X
15a66609af Update local rulesets and configs
Update docker README.
2020-03-05 13:38:23 +08:00
Tindy X
27c3b10b04 Bump version to v0.4.2 2020-03-03 01:28:45 +08:00
at404bot
5cd8827bd4 📝 追加近期更新内容 (#77)
📝 补充近期新增内容
2020-03-03 01:27:22 +08:00
Tindy X
849483fd43 Optimizations
Fix stream/time node matcher not working with YAML configuration.
Add PCRE2 JIT optimization for filtering nodes.
Add space after adding proxy type to node remarks.
Add displaying Subscription User Info when generating artifacts in generator mode.
Add support for another type of time node.
Optimize codes.
2020-03-02 17:37:26 +08:00
Tindy X
1b6e877724 Enhancements
Add mutex lock to prevent reading and writing a cached file at the same time.
Optimize codes.
2020-03-01 01:58:59 +08:00
Tindy X
6c2192b4f8 Add support for another type of stream nodes 2020-02-28 06:40:42 -06:00
Tindy X
6ff431ef10 Enhancements
Fix compatibility with some broken Shadowrocket links.
Add direct option to generator to download subscriptions or use local files directly.
Add return code to report generator error.
Add output code page restore.
2020-02-28 11:39:01 +08:00
Tindy X
8fe8dcbe86 Fix compile error with USE_STD_REGEX
Issue [#74](https://github.com/tindy2013/subconverter/issues/74).
2020-02-26 22:51:36 -06:00
Tindy X
0eaec3a162 Fix a bug
Fix a crash when no nodes are found when generating Quantumult (X) node lists.
2020-02-26 23:46:54 +08:00
Tindy X
4958e30657 Fix stack overflow problem on some platform 2020-02-26 02:11:06 +08:00
Tindy X
844c68df9a Bump version to v0.4.1 2020-02-25 15:48:12 +08:00
Tindy X
4dbb9ef983 Enhancements
Fix filename option in web interface.
Fix when failed to download any files, the program still treat it as succeeded.
Add --artifact startup option to specify which artifact(s) should be generated.
Tweak Emoji matching rules.
Update local rulesets and configurations.
2020-02-25 14:23:51 +08:00
Tindy X
5d144c32a4 Update README-docker.md 2020-02-24 15:18:05 +08:00
Tindy X
8ed0a620fd Fix compile error on some platform
Update build script.
2020-02-24 00:19:50 +08:00
Tindy X
24ef7f9e9e Enhancements
Fix logical error in generating Quantumult X configurations.
Fix overwrite_original_rules option not working in pref configuration.
Add range support for group ID match condition.
2020-02-23 23:39:39 +08:00
Tindy X
782caaf082 Bugs fix
Fix some Shadowsocks nodes are missing in Loon configurations.
Fix Quantumult X nodes not handling duplicated remarks.
Force expand all local rules instead of generating /getruleset urls for generator mode.
2020-02-23 21:26:28 +08:00
Tindy X
fa06e8def9 Fix incorrect group type conversion for Quantumult (X) 2020-02-23 20:51:22 +08:00
Tindy X
f01b7b6d2d Bug fixes
Fix a bug that some groups are missing in the exported Quantumult X/Mellow configurations.
Optimize codes.
2020-02-23 20:36:16 +08:00
Tindy X
9bf13e792b Fix a bug that internal parser may incorrectly process spaces in configs
Issue [#70](https://github.com/tindy2013/subconverter/issues/70).
2020-02-23 18:06:02 +08:00
Tindy X
ac0dedecf0 Enhancements
Fix a bug that Clash may interpret pure number password as float64 type (Issue [#58](https://github.com/tindy2013/subconverter/issues/58)).
Fix support for parsing some non-standard Clash configurations.
Add generator-only mode to save configurations to files or upload to Gists.
Optimize codes.
Fix typo.
2020-02-23 15:49:16 +08:00
Tindy X
c51affc3cc Fix compile error on some platform
Update local rulesets
2020-02-23 01:35:24 +08:00
76 changed files with 2183 additions and 726 deletions

View File

@@ -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:

View File

@@ -7,6 +7,14 @@
[![GitHub release](https://img.shields.io/github/release/tindy2013/subconverter.svg)](https://github.com/tindy2013/subconverter/releases)
[![GitHub license](https://img.shields.io/github/license/tindy2013/subconverter.svg)](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 将在上述间隔后要求强制更新 |
举个例子:

View File

@@ -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
```

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View 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

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View 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

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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

View 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

View 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

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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

View File

@@ -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

View File

@@ -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*

View File

@@ -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

View 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

View File

@@ -0,0 +1,2 @@
# > letv
DOMAIN-SUFFIX,api.mob.app.letv.com

View File

@@ -0,0 +1,3 @@
# > MOO
USER-AGENT,MOO*
USER-AGENT,TencentMidasConnect*

View File

@@ -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

View File

@@ -0,0 +1,4 @@
# > SoundCloud
USER-AGENT,SoundCloud*
DOMAIN-SUFFIX,sndcdn.com
DOMAIN-SUFFIX,soundcloud.com

View File

@@ -0,0 +1,2 @@
# > Tencent Video
DOMAIN-SUFFIX,vv.video.qq.com

View File

@@ -0,0 +1,2 @@
# > Youku
IP-CIDR,106.11.0.0/16,no-resolve

View File

@@ -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

View File

@@ -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

View 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)

View 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

View File

@@ -37,4 +37,4 @@ EU,🇪🇺
(VN|越南),🇻🇳
(ZA|南非),🇿🇦
(?i:TW|Taiwan|新北|彰化|CHT|台湾|[^-]台|HINET),🇨🇳
(?i:CN|China|回国|中国|江苏|北京|上海|广州|深圳|杭州|徐州|青岛|宁波|镇江|back),🇨🇳
(?i:CN|China|回国|中国|江苏|北京|上海|广州|深圳|杭州|常州|徐州|青岛|宁波|镇江|back),🇨🇳

View File

@@ -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/

View File

@@ -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

View File

@@ -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 &section)
{
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 &section)
{
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);
}
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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();
/*

View File

@@ -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

View File

@@ -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 &reg)
}
}
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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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());
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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:)

View File

@@ -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;
}