├── .github └── workflows │ └── merge.yml ├── .gitignore ├── GeoLite2-City.mmdb ├── LICENSE ├── README.md ├── merge.py ├── meta_merge.py ├── requirements.txt ├── sing-box.py ├── sub ├── base64.txt ├── merged_proxies_new.yaml └── sing-box.json ├── templates └── clash_template.yaml └── urls ├── clash_urls.txt ├── hysteria2_urls.txt ├── hysteria_urls.txt ├── naiverproxy_urls.txt ├── sb_urls.txt ├── ss_urls.txt └── xray_urls.txt /.github/workflows/merge.yml: -------------------------------------------------------------------------------- 1 | name: Merge Script 2 | 3 | on: 4 | # push: 5 | # branches: 6 | # - main # 替换为你的默认分支 7 | schedule: 8 | - cron: '0 0/6 * * *' # 每 6h 一次 9 | workflow_dispatch: # 触发手动事件 10 | jobs: 11 | merge: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v2 17 | 18 | - name: Set up Python 19 | uses: actions/setup-python@v2 20 | with: 21 | python-version: 3.11 22 | 23 | - name: Install dependencies 24 | run: pip install -r requirements.txt 25 | 26 | - name: Run merge script 27 | run: python meta_merge.py 28 | 29 | - name: Run shadowrocket merge script 30 | run: python merge.py 31 | - name: Run sing-box script 32 | run: python sing-box.py 33 | - name: Commit Changes 34 | run: | 35 | if [[ -n "$(git status --porcelain)" ]]; then 36 | echo "Changes detected in the repository." 37 | git config core.ignorecase false 38 | git config --local user.email "actions@github.com" 39 | git config --local user.name "GitHub Action" 40 | git add . 41 | git commit -m "Updated at $(date '+%Y-%m-%d %H:%M:%S')" 42 | git push 43 | else 44 | echo "No changes detected in the repository." 45 | fi 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode -------------------------------------------------------------------------------- /GeoLite2-City.mmdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Misaka-blog/chromego_merge/7ec4d6e24dd1fc02d4c13fc96faa438b5dd96848/GeoLite2-City.mmdb -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2004 Sam Hocevar 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chromego_merge 2 | 3 | 不仅限于 ChromeGo 工具包的免费订阅合集 4 | 5 | ## 注意事项 6 | 7 | 1. 服务器节点不稳定,最好可以每日更新一次网站订阅 8 | 2. 部分节点有可能无法访问某些网站 9 | 10 | ## 订阅链接分享 11 | 12 | ### Clash Meta 客户端订阅 13 | 14 | ``` 15 | https://chromego-sub.netlify.app/sub/merged_proxies_new.yaml 16 | ``` 17 | 18 | ### 通用 base64 订阅 19 | 20 | ``` 21 | https://chromego-sub.netlify.app/sub/base64.txt 22 | ``` 23 | 24 | ### sing-box 订阅(适用于 1.8.0 以上) 25 | 26 | ``` 27 | https://chromego-sub.netlify.app/sub/sing-box.json 28 | ``` 29 | 30 | 31 | ## 客户端推荐 32 | 33 | ### Windows 34 | 35 | - [clash verge](https://github.com/clash-verge-rev/clash-verge-rev) 36 | - [clash nyanpasu]( https://github.com/LibNyanpasu/clash-nyanpasu) 37 | - [nekoray](https://github.com/MatsuriDayo/nekoray) 38 | 39 | ### Android 40 | 41 | - [nekobox](https://github.com/MatsuriDayo/NekoBoxForAndroid) 42 | - [clashmeta for android](https://github.com/MetaCubeX/ClashMetaForAndroid/releases) 43 | 44 | ### ios 45 | 46 | - sing-box 47 | - shadowrocket 48 | 49 | ### macos 50 | 51 | - [clashx.meta](https://github.com/MetaCubeX/ClashX.Meta/releases) 52 | - [clash verge](https://github.com/clash-verge-rev/clash-verge-rev) 53 | - shadowrocket 54 | 55 | ## 致谢 56 | 57 | - [Alvin9999](https://github.com/Alvin9999/pac2/tree/master) 58 | - [sing-box-subscribe](https://github.com/Toperlock/sing-box-subscribe) 59 | 60 | 区域设置代码截取自: 61 | 62 | - [chromegopacs](https://github.com/markbang/chromegopacs) -------------------------------------------------------------------------------- /merge.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import json 3 | import urllib.request 4 | import yaml 5 | import codecs 6 | import logging 7 | import geoip2.database 8 | import socket 9 | import re 10 | 11 | 12 | # 提取节点 13 | def process_urls(url_file, processor): 14 | try: 15 | with open(url_file, "r") as file: 16 | urls = file.read().splitlines() 17 | 18 | for index, url in enumerate(urls): 19 | try: 20 | response = urllib.request.urlopen(url) 21 | data = response.read().decode("utf-8") 22 | processor(data, index) 23 | except Exception as e: 24 | logging.error(f"Error processing URL {url}: {e}") 25 | except Exception as e: 26 | logging.error(f"Error reading file {url_file}: {e}") 27 | 28 | 29 | def get_physical_location(address): 30 | address = re.sub(":.*", "", address) # 用正则表达式去除端口部分 31 | try: 32 | ip_address = socket.gethostbyname(address) 33 | except socket.gaierror: 34 | ip_address = address 35 | 36 | try: 37 | reader = geoip2.database.Reader( 38 | "GeoLite2-City.mmdb" 39 | ) # 这里的路径需要指向你自己的数据库文件 40 | response = reader.city(ip_address) 41 | country = response.country.name 42 | city = response.city.name 43 | # return f"{country}_{city}" 44 | return f"{country}" 45 | except geoip2.errors.AddressNotFoundError as e: 46 | print(f"Error: {e}") 47 | return "Unknown" 48 | 49 | 50 | # 提取clash节点 51 | def process_clash(data, index): 52 | # 解析YAML格式的内容 53 | content = yaml.safe_load(data) 54 | 55 | # 提取proxies部分并合并到merged_proxies中 56 | proxies = content.get("proxies", []) 57 | 58 | for proxy in proxies: 59 | # 如果类型是vless 60 | if proxy["type"] == "vless": 61 | server = proxy.get("server", "") 62 | port = int(proxy.get("port", 443)) 63 | udp = proxy.get("udp", "") 64 | uuid = proxy.get("uuid", "") 65 | network = proxy.get("network", "") 66 | tls = int(proxy.get("tls", 0)) 67 | xudp = proxy.get("xudp", "") 68 | sni = proxy.get("servername", "") 69 | flow = proxy.get("flow", "") 70 | publicKey = proxy.get("reality-opts", {}).get("public-key", "") 71 | short_id = proxy.get("reality-opts", {}).get("short-id", "") 72 | fp = proxy.get("client-fingerprint", "") 73 | insecure = int(proxy.get("skip-cert-verify", 0)) 74 | grpc_serviceName = proxy.get("grpc-opts", {}).get("grpc-service-name", "") 75 | 76 | ws_path = proxy.get("ws-opts", {}).get("path", "") 77 | ws_headers_host = ( 78 | proxy.get("ws-opts", {}).get("headers", {}).get("Host", "") 79 | ) 80 | if tls == 0: 81 | security = "none" 82 | elif tls == 1 and publicKey != "": 83 | security = "reality" 84 | else: 85 | security = "tls" 86 | location = get_physical_location(server) 87 | name = f"{location}_vless_{index}" 88 | vless_meta = f"vless://{uuid}@{server}:{port}?security={security}&allowInsecure{insecure}&flow={flow}&type={network}&fp={fp}&pbk={publicKey}&sid={short_id}&sni={sni}&serviceName={grpc_serviceName}&path={ws_path}&host={ws_headers_host}#{name}" 89 | 90 | merged_proxies.append(vless_meta) 91 | 92 | if proxy["type"] == "vmess": 93 | server = proxy.get("server", "") 94 | port = int(proxy.get("port", 443)) 95 | uuid = proxy.get("uuid", "") 96 | # cipher = proxy.get("cipher", "") 97 | alterId = proxy.get("alterId", "") 98 | network = proxy.get("network", "") 99 | tls = int(proxy.get("tls", 0)) 100 | if tls == 0: 101 | security = "none" 102 | elif tls == 1: 103 | security = "tls" 104 | sni = proxy.get("servername", "") 105 | ws_path = proxy.get("ws-opts", {}).get("path", "") 106 | ws_headers_host = ( 107 | proxy.get("ws-opts", {}).get("headers", {}).get("Host", "") 108 | ) 109 | location = get_physical_location(server) 110 | name = f"{location}_vmess_{index}" 111 | vmess_meta = f"vmess://{uuid}@{server}:{port}?security={security}&allowInsecure{insecure}&type={network}&fp={fp}&sni={sni}&path={ws_path}&host={ws_headers_host}#{name}" 112 | 113 | merged_proxies.append(vmess_meta) 114 | 115 | elif proxy["type"] == "tuic": 116 | server = proxy.get("server", "") 117 | port = int(proxy.get("port", 443)) 118 | uuid = proxy.get("uuid", "") 119 | password = proxy.get("password", "") 120 | sni = proxy.get("sni", "") 121 | insecure = int(proxy.get("skip-cert-verify", 0)) 122 | udp_relay_mode = proxy.get("udp-relay-mode", "naive") 123 | congestion = proxy.get("congestion-controller", "bbr") 124 | alpn = ( 125 | proxy.get("alpn", [])[0] 126 | if proxy.get("alpn") and len(proxy["alpn"]) > 0 127 | else None 128 | ) 129 | location = get_physical_location(server) 130 | name = f"{location}_tuic_{index}" 131 | # tuic_meta_neko = f"tuic://{server}:{port}?uuid={uuid}&version=5&password={password}&insecure={insecure}&alpn={alpn}&mode={udp_relay_mode}" 132 | tuic_meta = f"tuic://{uuid}:{password}@{server}:{port}?sni={sni}&congestion_control={congestion}&udp_relay_mode={udp_relay_mode}&alpn={alpn}&allow_insecure={insecure}#{name}" 133 | merged_proxies.append(tuic_meta) 134 | 135 | elif proxy["type"] == "hysteria2": 136 | server = proxy.get("server", "") 137 | port = int(proxy.get("port", 443)) 138 | auth = proxy.get("password", "") 139 | obfs = proxy.get("obfs", "") 140 | obfs_password = proxy.get("obfs-password", "") 141 | sni = proxy.get("sni", "") 142 | insecure = int(proxy.get("skip-cert-verify", 0)) 143 | location = get_physical_location(server) 144 | name = f"{location}_hy2_{index}" 145 | hy2_meta = f"hysteria2://{auth}@{server}:{port}?insecure={insecure}&sni={sni}&obfs={obfs}&obfs-password={obfs_password}#{name}" 146 | merged_proxies.append(hy2_meta) 147 | 148 | elif proxy["type"] == "hysteria": 149 | server = proxy.get("server", "") 150 | port = int(proxy.get("port", 443)) 151 | ports = proxy.get("port", "") 152 | protocol = proxy.get("protocol", "udp") 153 | up_mbps = 50 154 | down_mbps = 80 155 | alpn = ( 156 | proxy.get("alpn", [])[0] 157 | if proxy.get("alpn") and len(proxy["alpn"]) > 0 158 | else None 159 | ) 160 | obfs = proxy.get("obfs", "") 161 | insecure = int(proxy.get("skip-cert-verify", 0)) 162 | sni = proxy.get("sni", "") 163 | fast_open = int(proxy.get("fast_open", 1)) 164 | auth = proxy.get("auth-str", "") 165 | # 生成URL 166 | location = get_physical_location(server) 167 | name = f"{location}_hy_{index}" 168 | hysteria_meta = f"hysteria://{server}:{port}?peer={sni}&auth={auth}&insecure={insecure}&upmbps={up_mbps}&downmbps={down_mbps}&alpn={alpn}&mport={ports}&obfs={obfs}&protocol={protocol}&fastopen={fast_open}#{name}" 169 | merged_proxies.append(hysteria_meta) 170 | 171 | elif proxy["type"] == "ssr": 172 | server = proxy.get("server", "") 173 | port = int(proxy.get("port", 443)) 174 | password = proxy.get("password", "") 175 | password = base64.b64encode(password.encode()).decode() 176 | cipher = proxy.get("cipher", "") 177 | obfs = proxy.get("obfs", "") 178 | protocol = proxy.get("protocol", "") 179 | protocol_param = proxy.get("protocol-param", "") 180 | protocol_param = base64.b64encode(protocol_param.encode()).decode() 181 | obfs_param = proxy.get("obfs-param", "") 182 | obfs_param = base64.b64encode(obfs_param.encode()).decode() 183 | # 生成URL 184 | ssr_source = f"{server}:{port}:{protocol}:{cipher}:{obfs}:{password}/?obfsparam={obfs_param}&protoparam={protocol_param}&remarks=ssr_meta_{index}&protoparam{protocol_param}=&obfsparam={obfs_param}" 185 | ssr_source = base64.b64encode(ssr_source.encode()).decode() 186 | ssr_meta = f"ssr://{ssr_source}" 187 | merged_proxies.append(ssr_meta) 188 | # 目前仅支持最原始版本ss,无插件支持 189 | elif proxy["type"] == "sstest": 190 | server = proxy.get("server", "") 191 | port = int(proxy.get("port", 443)) 192 | password = proxy.get("password", "") 193 | cipher = proxy.get("cipher", "") 194 | # 生成URL 195 | ss_source = f"{cipher}:{password}@{server}:{port}" 196 | 197 | ss_source = base64.b64encode(ss_source.encode()).decode() 198 | ss_meta = f"ss://{ss_source}" 199 | merged_proxies.append(ss_meta) 200 | 201 | 202 | def process_naive(data, index): 203 | try: 204 | json_data = json.loads(data) 205 | 206 | proxy_str = json_data["proxy"] 207 | # proxy_str = proxy_str.replace("https://", "") 208 | naiveproxy = base64.b64encode(proxy_str.encode()).decode() 209 | merged_proxies.append(naiveproxy) 210 | 211 | except Exception as e: 212 | logging.error(f"Error processing naive data for index {index}: {e}") 213 | 214 | 215 | # 处理sing-box节点,待办 216 | def process_sb(data, index): 217 | try: 218 | json_data = json.loads(data) 219 | # 处理 shadowtls 数据 220 | server = json_data["outbounds"][1].get("server", "") 221 | server_port = json_data["outbounds"][1].get("server_port", "") 222 | method = json_data["outbounds"][0].get("method", "") 223 | password = json_data["outbounds"][0].get("password", "") 224 | version = int(json_data["outbounds"][1].get("version", 0)) 225 | host = json_data["outbounds"][1]["tls"].get("server_name", "") 226 | shadowtls_password = json_data["outbounds"][1].get("password", "") 227 | 228 | ss = f"{method}:{password}@{server}:{server_port}" 229 | shadowtls = f'{{"version": "{version}", "host": "{host}","password":{shadowtls_password}}}' 230 | shadowtls_proxy = ( 231 | "ss://" 232 | + base64.b64encode(ss.encode()).decode() 233 | + "?shadow-tls=" 234 | + base64.b64encode(shadowtls.encode()).decode() 235 | + f"#shadowtls{index}" 236 | ) 237 | 238 | merged_proxies.append(shadowtls_proxy) 239 | 240 | except Exception as e: 241 | logging.error(f"Error processing shadowtls data for index {index}: {e}") 242 | 243 | 244 | # hysteria 245 | def process_hysteria(data, index): 246 | try: 247 | json_data = json.loads(data) 248 | # 处理 hysteria 数据 249 | # 提取字段值 250 | server = json_data.get("server", "") 251 | protocol = json_data.get("protocol", "") 252 | up_mbps = json_data.get("up_mbps", "") 253 | down_mbps = json_data.get("down_mbps", "") 254 | alpn = json_data.get("alpn", "") 255 | obfs = json_data.get("obfs", "") 256 | insecure = int(json_data.get("insecure", 0)) 257 | server_name = json_data.get("server_name", "") 258 | fast_open = int(json_data.get("fast_open", 0)) 259 | auth = json_data.get("auth_str", "") 260 | # 生成URL 261 | location = get_physical_location(server) 262 | name = f"{location}_hysteria_{index}" 263 | hysteria = f"hysteria://{server}?peer={server_name}&auth={auth}&insecure={insecure}&upmbps={up_mbps}&downmbps={down_mbps}&alpn={alpn}&obfs={obfs}&protocol={protocol}&fastopen={fast_open}#{name}" 264 | merged_proxies.append(hysteria) 265 | 266 | except Exception as e: 267 | logging.error(f"Error processing hysteria data for index {index}: {e}") 268 | 269 | 270 | # 处理hysteria2 271 | def process_hysteria2(data, index): 272 | try: 273 | json_data = json.loads(data) 274 | # 处理 hysteria2 数据 275 | # 提取字段值 276 | server = json_data["server"] 277 | insecure = int(json_data["tls"]["insecure"]) 278 | sni = json_data["tls"]["sni"] 279 | auth = json_data["auth"] 280 | # 生成URL 281 | location = get_physical_location(server) 282 | name = f"{location}_hysteria2_{index}" 283 | hysteria2 = f"hysteria2://{auth}@{server}?insecure={insecure}&sni={sni}#{name}" 284 | 285 | merged_proxies.append(hysteria2) 286 | except Exception as e: 287 | logging.error(f"Error processing hysteria2 data for index {index}: {e}") 288 | 289 | 290 | # 处理xray 291 | def process_xray(data, index): 292 | try: 293 | json_data = json.loads(data) 294 | # 处理 xray 数据 295 | protocol = json_data["outbounds"][0].get("protocol") 296 | 297 | if protocol == "vless": 298 | vnext = json_data["outbounds"][0]["settings"]["vnext"] 299 | 300 | if vnext: 301 | server = vnext[0].get("address", "") 302 | port = vnext[0].get("port", "") 303 | users = vnext[0]["users"] 304 | 305 | if users: 306 | user = users[0] 307 | uuid = user.get("id", "") 308 | flow = user.get("flow", "") 309 | 310 | stream_settings = json_data["outbounds"][0].get("streamSettings", {}) 311 | network = stream_settings.get("network", "") 312 | security = stream_settings.get("security", "") 313 | reality_settings = stream_settings.get("realitySettings", {}) 314 | 315 | publicKey = reality_settings.get("publicKey", "") 316 | short_id = reality_settings.get("shortId", "") 317 | sni = reality_settings.get("serverName", "") 318 | # tls 319 | tls_settings = stream_settings.get("tlsSettings", {}) 320 | sni = tls_settings.get("serverName", sni) 321 | insecure = int(tls_settings.get("allowInsecure", 0)) 322 | 323 | fp = reality_settings.get("fingerprint", "") 324 | fp = tls_settings.get("fingerprint", fp) 325 | spx = reality_settings.get("spiderX", "") 326 | 327 | grpc_settings = stream_settings.get("grpcSettings", {}) 328 | grpc_serviceName = grpc_settings.get("serviceName", "") 329 | 330 | ws_settings = stream_settings.get("wsSettings", {}) 331 | ws_path = ws_settings.get("path", "") 332 | ws_headers_host = ws_settings.get("headers", {}).get("Host", "") 333 | location = get_physical_location(server) 334 | name = f"{location}_vless_{index}" 335 | xray_proxy = f"vless://{uuid}@{server}:{port}?security={security}&allowInsecure={insecure}&flow={flow}&type={network}&fp={fp}&pbk={publicKey}&sid={short_id}&sni={sni}&serviceName={grpc_serviceName}&path={ws_path}&host={ws_headers_host}#{name}" 336 | 337 | # 将当前proxy字典添加到所有proxies列表中 338 | merged_proxies.append(xray_proxy) 339 | # 不支持插件 340 | if protocol == "shadowsocks": 341 | server = json_data["outbounds"][0]["settings"]["servers"]["address"] 342 | method = json_data["outbounds"][0]["settings"]["servers"]["method"] 343 | password = json_data["outbounds"][0]["settings"]["servers"]["password"] 344 | port = json_data["outbounds"][0]["settings"]["servers"]["port"] 345 | # 生成URL 346 | ss_source = f"{method}:{password}@{server}:{port}" 347 | ss_source = base64.b64encode(ss_source.encode()).decode() 348 | xray_proxy = f"ss://{ss_source}" 349 | 350 | # 将当前proxy字典添加到所有proxies列表中 351 | merged_proxies.append(xray_proxy) 352 | except Exception as e: 353 | logging.error(f"Error processing xray data for index {index}: {e}") 354 | 355 | 356 | # 定义一个空列表用于存储合并后的代理配置 357 | merged_proxies = [] 358 | 359 | # 处理 clash URLs 360 | process_urls("./urls/clash_urls.txt", process_clash) 361 | 362 | # 处理 shadowtls URLs 363 | # process_urls('./urls/sb_urls.txt', process_sb) 364 | 365 | # 处理 naive URLs 366 | process_urls("./urls/naiverproxy_urls.txt", process_naive) 367 | 368 | # 处理 hysteria URLs 369 | process_urls("./urls/hysteria_urls.txt", process_hysteria) 370 | 371 | # 处理 hysteria2 URLs 372 | process_urls("./urls/hysteria2_urls.txt", process_hysteria2) 373 | 374 | # 处理 xray URLs 375 | process_urls("./urls/xray_urls.txt", process_xray) 376 | 377 | # 将结果写入文件 378 | merged_content = "\n".join(merged_proxies) 379 | 380 | try: 381 | encoded_content = base64.b64encode(merged_content.encode("utf-8")).decode("utf-8") 382 | 383 | with open("./sub/base64.txt", "w") as encoded_file: 384 | encoded_file.write(encoded_content) 385 | 386 | print("Content successfully encoded and written to base64.txt.") 387 | except Exception as e: 388 | print(f"Error encoding and writing to file: {e}") 389 | -------------------------------------------------------------------------------- /meta_merge.py: -------------------------------------------------------------------------------- 1 | import yaml 2 | import json 3 | import urllib.request 4 | import logging 5 | import geoip2.database 6 | import socket 7 | import re 8 | 9 | 10 | # 提取节点 11 | def process_urls(url_file, processor): 12 | try: 13 | with open(url_file, "r") as file: 14 | urls = file.read().splitlines() 15 | 16 | for index, url in enumerate(urls): 17 | try: 18 | response = urllib.request.urlopen(url) 19 | data = response.read().decode("utf-8") 20 | processor(data, index) 21 | except Exception as e: 22 | logging.error(f"Error processing URL {url}: {e}") 23 | except Exception as e: 24 | logging.error(f"Error reading file {url_file}: {e}") 25 | 26 | 27 | # 提取clash节点 28 | def process_clash(data, index): 29 | content = yaml.safe_load(data) 30 | proxies = content.get("proxies", []) 31 | for i, proxy in enumerate(proxies): 32 | location = get_physical_location(proxy["server"]) 33 | proxy["name"] = f"{location}_{proxy['type']}_{index}{i+1}" 34 | merged_proxies.extend(proxies) 35 | 36 | 37 | def get_physical_location(address): 38 | address = re.sub(":.*", "", address) # 用正则表达式去除端口部分 39 | try: 40 | ip_address = socket.gethostbyname(address) 41 | except socket.gaierror: 42 | ip_address = address 43 | 44 | try: 45 | reader = geoip2.database.Reader( 46 | "GeoLite2-City.mmdb" 47 | ) # 这里的路径需要指向你自己的数据库文件 48 | response = reader.city(ip_address) 49 | country = response.country.name 50 | city = response.city.name 51 | return f"{country}_{city}" 52 | # return f"油管绵阿羊_{country}" 53 | except geoip2.errors.AddressNotFoundError as e: 54 | print(f"Error: {e}") 55 | return "Unknown" 56 | 57 | 58 | # 处理sb,待办 59 | def process_sb(data, index): 60 | try: 61 | json_data = json.loads(data) 62 | # 处理 shadowtls 数据 63 | 64 | # 提取所需字段 65 | method = json_data["outbounds"][0]["method"] 66 | password = json_data["outbounds"][0]["password"] 67 | server = json_data["outbounds"][1]["server"] 68 | server_port = json_data["outbounds"][1]["server_port"] 69 | server_name = json_data["outbounds"][1]["tls"]["server_name"] 70 | shadowtls_password = json_data["outbounds"][1]["password"] 71 | version = json_data["outbounds"][1]["version"] 72 | location = get_physical_location(server) 73 | name = f"{location}_shadowtls_{index}" 74 | # 创建当前网址的proxy字典 75 | proxy = { 76 | "name": name, 77 | "type": "ss", 78 | "server": server, 79 | "port": server_port, 80 | "cipher": method, 81 | "password": password, 82 | "plugin": "shadow-tls", 83 | "client-fingerprint": "chrome", 84 | "plugin-opts": { 85 | "host": server_name, 86 | "password": shadowtls_password, 87 | "version": int(version), 88 | }, 89 | } 90 | 91 | # 将当前proxy字典添加到所有proxies列表中 92 | merged_proxies.append(proxy) 93 | 94 | except Exception as e: 95 | logging.error(f"Error processing shadowtls data for index {index}: {e}") 96 | 97 | 98 | def process_hysteria(data, index): 99 | try: 100 | json_data = json.loads(data) 101 | # 处理 hysteria 数据 102 | # 提取所需字段 103 | auth = json_data["auth_str"] 104 | server_ports = json_data["server"] 105 | server_ports_slt = server_ports.split(":") 106 | server = server_ports_slt[0] 107 | ports = server_ports_slt[1] 108 | ports_slt = ports.split(",") 109 | server_port = int(ports_slt[0]) 110 | if len(ports_slt) > 1: 111 | mport = ports_slt[1] 112 | else: 113 | mport = server_port 114 | # fast_open = json_data["fast_open"] 115 | fast_open = True 116 | insecure = json_data["insecure"] 117 | server_name = json_data["server_name"] 118 | alpn = json_data["alpn"] 119 | protocol = json_data["protocol"] 120 | location = get_physical_location(server) 121 | name = f"{location}_hy_{index}" 122 | 123 | # 创建当前网址的proxy字典 124 | proxy = { 125 | "name": name, 126 | "type": "hysteria", 127 | "server": server, 128 | "port": server_port, 129 | "ports": mport, 130 | "auth_str": auth, 131 | "up": 1000, 132 | "down": 1000, 133 | "fast-open": fast_open, 134 | "protocol": protocol, 135 | "sni": server_name, 136 | "skip-cert-verify": insecure, 137 | "alpn": [alpn], 138 | } 139 | 140 | # 将当前proxy字典添加到所有proxies列表中 141 | merged_proxies.append(proxy) 142 | 143 | except Exception as e: 144 | logging.error(f"Error processing hysteria data for index {index}: {e}") 145 | 146 | 147 | # 处理hysteria2 148 | def process_hysteria2(data, index): 149 | try: 150 | json_data = json.loads(data) 151 | # 处理 hysteria2 数据 152 | # 提取所需字段 153 | auth = json_data["auth"] 154 | server_ports = json_data["server"] 155 | server_ports_slt = server_ports.split(":") 156 | server = server_ports_slt[0] 157 | ports = server_ports_slt[1] 158 | ports_slt = ports.split(",") 159 | server_port = int(ports_slt[0]) 160 | # fast_open = json_data["fastOpen"] 161 | fast_open = True 162 | insecure = json_data["tls"]["insecure"] 163 | sni = json_data["tls"]["sni"] 164 | location = get_physical_location(server) 165 | name = f"{location}_hy2_{index}" 166 | 167 | # 创建当前网址的proxy字典 168 | proxy = { 169 | "name": name, 170 | "type": "hysteria2", 171 | "server": server, 172 | "port": server_port, 173 | "password": auth, 174 | "fast-open": fast_open, 175 | "sni": sni, 176 | "skip-cert-verify": insecure, 177 | } 178 | 179 | # 将当前proxy字典添加到所有proxies列表中 180 | merged_proxies.append(proxy) 181 | 182 | except Exception as e: 183 | logging.error(f"Error processing hysteria2 data for index {index}: {e}") 184 | 185 | 186 | # 处理xray 187 | def process_xray(data, index): 188 | try: 189 | json_data = json.loads(data) 190 | # 处理 xray 数据 191 | protocol = json_data["outbounds"][0]["protocol"] 192 | # vless操作 193 | if protocol == "vless": 194 | # 提取所需字段 195 | server = json_data["outbounds"][0]["settings"]["vnext"][0]["address"] 196 | port = json_data["outbounds"][0]["settings"]["vnext"][0]["port"] 197 | uuid = json_data["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] 198 | istls = True 199 | flow = json_data["outbounds"][0]["settings"]["vnext"][0]["users"][0]["flow"] 200 | # 传输方式 201 | network = json_data["outbounds"][0]["streamSettings"]["network"] 202 | publicKey = json_data["outbounds"][0]["streamSettings"]["realitySettings"][ 203 | "publicKey" 204 | ] 205 | shortId = json_data["outbounds"][0]["streamSettings"]["realitySettings"][ 206 | "shortId" 207 | ] 208 | serverName = json_data["outbounds"][0]["streamSettings"]["realitySettings"][ 209 | "serverName" 210 | ] 211 | fingerprint = json_data["outbounds"][0]["streamSettings"][ 212 | "realitySettings" 213 | ]["fingerprint"] 214 | # udp转发 215 | isudp = True 216 | location = get_physical_location(server) 217 | name = f"{location}_reality_{index}" 218 | 219 | # 根据network判断tcp 220 | if network == "tcp": 221 | proxy = { 222 | "name": name, 223 | "type": protocol, 224 | "server": server, 225 | "port": port, 226 | "uuid": uuid, 227 | "network": network, 228 | "tls": istls, 229 | "udp": isudp, 230 | "flow": flow, 231 | "client-fingerprint": fingerprint, 232 | "servername": serverName, 233 | "reality-opts": {"public-key": publicKey, "short-id": shortId}, 234 | } 235 | 236 | # 根据network判断grpc 237 | elif network == "grpc": 238 | serviceName = json_data["outbounds"][0]["streamSettings"][ 239 | "grpcSettings" 240 | ]["serviceName"] 241 | 242 | # 创建当前网址的proxy字典 243 | proxy = { 244 | "name": name, 245 | "type": protocol, 246 | "server": server, 247 | "port": port, 248 | "uuid": uuid, 249 | "network": network, 250 | "tls": istls, 251 | "udp": isudp, 252 | "flow": flow, 253 | "client-fingerprint": fingerprint, 254 | "servername": serverName, 255 | "grpc-opts": {"grpc-service-name": serviceName}, 256 | "reality-opts": {"public-key": publicKey, "short-id": shortId}, 257 | } 258 | 259 | # 将当前proxy字典添加到所有proxies列表中 260 | merged_proxies.append(proxy) 261 | except Exception as e: 262 | logging.error(f"Error processing xray data for index {index}: {e}") 263 | 264 | 265 | def update_proxy_groups(config_data, merged_proxies): 266 | for group in config_data["proxy-groups"]: 267 | if group["name"] in ["自动选择", "节点选择"]: 268 | if "proxies" not in group or not group["proxies"]: 269 | group["proxies"] = [proxy["name"] for proxy in merged_proxies] 270 | else: 271 | group["proxies"].extend(proxy["name"] for proxy in merged_proxies) 272 | 273 | 274 | def update_warp_proxy_groups(config_warp_data, merged_proxies): 275 | for group in config_warp_data["proxy-groups"]: 276 | if group["name"] in ["自动选择", "手动选择", "负载均衡"]: 277 | if "proxies" not in group or not group["proxies"]: 278 | group["proxies"] = [proxy["name"] for proxy in merged_proxies] 279 | else: 280 | group["proxies"].extend(proxy["name"] for proxy in merged_proxies) 281 | 282 | 283 | # 包含hysteria2 284 | merged_proxies = [] 285 | 286 | # 处理 clash URLs 287 | process_urls("./urls/clash_urls.txt", process_clash) 288 | 289 | # 处理 shadowtls URLs 290 | # process_urls('./urls/sb_urls.txt', process_sb) 291 | 292 | # 处理 hysteria URLs 293 | process_urls("./urls/hysteria_urls.txt", process_hysteria) 294 | 295 | # 处理 hysteria2 URLs 296 | process_urls("./urls/hysteria2_urls.txt", process_hysteria2) 297 | 298 | # 处理 xray URLs 299 | process_urls("./urls/xray_urls.txt", process_xray) 300 | 301 | # 读取普通的配置文件内容 302 | with open("./templates/clash_template.yaml", "r", encoding="utf-8") as file: 303 | config_data = yaml.safe_load(file) 304 | 305 | # 添加合并后的代理到proxies部分 306 | if "proxies" not in config_data or not config_data["proxies"]: 307 | config_data["proxies"] = merged_proxies 308 | else: 309 | config_data["proxies"].extend(merged_proxies) 310 | 311 | 312 | # 更新自动选择和节点选择的proxies的name部分 313 | update_proxy_groups(config_data, merged_proxies) 314 | 315 | # 将更新后的数据写入到一个YAML文件中,并指定编码格式为UTF-8 316 | with open("./sub/merged_proxies_new.yaml", "w", encoding="utf-8") as file: 317 | yaml.dump(config_data, file, sort_keys=False, allow_unicode=True) 318 | 319 | print("聚合完成") 320 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | PyYAML==6.0.1 2 | geoip2 -------------------------------------------------------------------------------- /sing-box.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import os 3 | 4 | url = "https://sing-box-subscribe-doraemon.vercel.app/config/https://raw.githubusercontent.com/Misaka-blog/chromego_merge/main/sub/base64.txt" 5 | output_folder = "sub" 6 | output_filename = "sing-box.json" 7 | 8 | # 发送HTTP请求 9 | response = requests.get(url) 10 | 11 | # 检查请求是否成功 12 | if response.status_code == 200: 13 | # 创建输出 14 | # 确保输出文件夹存在 15 | if not os.path.exists(output_folder): 16 | os.makedirs(output_folder) 17 | 18 | # 构建输出文件路径 19 | output_path = os.path.join(output_folder, output_filename) 20 | 21 | # 将响应内容写入文件,使用utf-8编码 22 | with open(output_path, "w", encoding="utf-8") as file: 23 | file.write(response.text) 24 | 25 | print(f"成功将内容写入 {output_path}") 26 | else: 27 | print(f"HTTP请求失败,状态码: {response.status_code}") 28 | -------------------------------------------------------------------------------- /sub/base64.txt: -------------------------------------------------------------------------------- 1 | aHlzdGVyaWE6Ly8yMDguODcuMjQzLjE1MToxNzU0OT9wZWVyPXd3dy5iaW5nLmNvbSZhdXRoPSZpbnNlY3VyZT0xJnVwbWJwcz01MCZkb3dubWJwcz04MCZhbHBuPWgzJm1wb3J0PTE3NTQ5Jm9iZnM9JnByb3RvY29sPXVkcCZmYXN0b3Blbj0xI1VuaXRlZCBTdGF0ZXNfaHlfNgpoeXN0ZXJpYTovLzEwOC4xODEuMjQuNzc6MTE1MTI/cGVlcj1hcHBsZS5jb20mYXV0aD1kb25ndGFpd2FuZy5jb20maW5zZWN1cmU9MSZ1cG1icHM9NTAmZG93bm1icHM9ODAmYWxwbj1oMyZtcG9ydD0xMTUxMiZvYmZzPSZwcm90b2NvbD11ZHAmZmFzdG9wZW49MSNVbml0ZWQgU3RhdGVzX2h5XzcKaHlzdGVyaWE6Ly8xODUuMjIuMTU1LjcxOjEwODAzP3BlZXI9d3d3LmJpbmcuY29tJmF1dGg9Jmluc2VjdXJlPTEmdXBtYnBzPTUwJmRvd25tYnBzPTgwJmFscG49aDMmbXBvcnQ9MTA4MDMmb2Jmcz0mcHJvdG9jb2w9dWRwJmZhc3RvcGVuPTEjUnVzc2lhX2h5XzgKaHlzdGVyaWE6Ly8yMDguODcuMjQzLjE1MToxNzU0OT9wZWVyPXd3dy5iaW5nLmNvbSZhdXRoPSZpbnNlY3VyZT0xJnVwbWJwcz01MCZkb3dubWJwcz04MCZhbHBuPWgzJm1wb3J0PTE3NTQ5Jm9iZnM9JnByb3RvY29sPXVkcCZmYXN0b3Blbj0xI1VuaXRlZCBTdGF0ZXNfaHlfOQphSFIwY0hNNkx5OWtiMjVuZEdGcGQyRnVaeTVqYjIwNlpHOXVaM1JoYVhkaGJtY3VZMjl0UUc1aGFYWmxNak11WTJaalpHNHpMbmg1ZWpvME5ETT0KYUhSMGNITTZMeTlrYjI1bmRHRnBkMkZ1Wnk1amIyMDZaRzl1WjNSaGFYZGhibWN1WTI5dFFHNWhhWFpsTWpRdVkyWmpaRzR6TG5oNWVqbzBORE09Cmh5c3RlcmlhOi8vMTg1LjIyLjE1NS43MToxMDgwMz9wZWVyPWFwcGxlLmNvbSZhdXRoPWRvbmd0YWl3YW5nLmNvbSZpbnNlY3VyZT0xJnVwbWJwcz0xMSZkb3dubWJwcz01NSZhbHBuPWgzJm9iZnM9JnByb3RvY29sPXVkcCZmYXN0b3Blbj0xI1J1c3NpYV9oeXN0ZXJpYV8wCmh5c3RlcmlhOi8vMTg1LjIyLjE1NS43MToxMDgwMz9wZWVyPWFwcGxlLmNvbSZhdXRoPWRvbmd0YWl3YW5nLmNvbSZpbnNlY3VyZT0xJnVwbWJwcz0xMSZkb3dubWJwcz01NSZhbHBuPWgzJm9iZnM9JnByb3RvY29sPXVkcCZmYXN0b3Blbj0xI1J1c3NpYV9oeXN0ZXJpYV8xCmh5c3RlcmlhOi8vMTg1LjIyLjE1NS43MToxMDgwMz9wZWVyPWFwcGxlLmNvbSZhdXRoPWRvbmd0YWl3YW5nLmNvbSZpbnNlY3VyZT0xJnVwbWJwcz0xMSZkb3dubWJwcz01NSZhbHBuPWgzJm9iZnM9JnByb3RvY29sPXVkcCZmYXN0b3Blbj0xI1J1c3NpYV9oeXN0ZXJpYV8yCmh5c3RlcmlhOi8vMTg1LjIyLjE1NS43MToxMDgwMz9wZWVyPWFwcGxlLmNvbSZhdXRoPWRvbmd0YWl3YW5nLmNvbSZpbnNlY3VyZT0xJnVwbWJwcz0xMSZkb3dubWJwcz01NSZhbHBuPWgzJm9iZnM9JnByb3RvY29sPXVkcCZmYXN0b3Blbj0xI1J1c3NpYV9oeXN0ZXJpYV8zCmh5c3RlcmlhMjovL2Rvbmd0YWl3YW5nLmNvbUA0NS4xMjkuMi4xMDg6MzAwMzM/aW5zZWN1cmU9MSZzbmk9d3d3LmJpbmcuY29tI1J1c3NpYV9oeXN0ZXJpYTJfMApoeXN0ZXJpYTI6Ly9kb25ndGFpd2FuZy5jb21ANDYuMTcuNDEuMjE3OjMwMDMzP2luc2VjdXJlPTEmc25pPXd3dy5iaW5nLmNvbSNSdXNzaWFfaHlzdGVyaWEyXzEKaHlzdGVyaWEyOi8vZG9uZ3RhaXdhbmcuY29tQDQ2LjI5LjE2My4xNzE6MzAwMzM/aW5zZWN1cmU9MSZzbmk9d3d3LmJpbmcuY29tI1J1c3NpYV9oeXN0ZXJpYTJfMgpoeXN0ZXJpYTI6Ly9kb25ndGFpd2FuZy5jb21ANDYuMjkuMTYzLjE3MTozMDAzMz9pbnNlY3VyZT0xJnNuaT13d3cuYmluZy5jb20jUnVzc2lhX2h5c3RlcmlhMl8zCnZsZXNzOi8vZWMzMDJkZTQtNmIzZC00ZjAzLWEyMjgtM2M2ZDMwM2VkMzcwQDEuMTYyLjUxLjEwNjozNzg5OD9zZWN1cml0eT1yZWFsaXR5JmFsbG93SW5zZWN1cmU9MCZmbG93PXh0bHMtcnByeC12aXNpb24mdHlwZT10Y3AmZnA9Y2hyb21lJnBiaz12NnVXSkptVkdGUGQwSzA0MFFLM1BKSENiUGM3NGtYRm9RbUFocHUzMGpRJnNpZD1lMTJkN2ZkYiZzbmk9d3d3LnlhaG9vLmNvbSZzZXJ2aWNlTmFtZT0mcGF0aD0maG9zdD0jVGFpd2FuX3ZsZXNzXzAKdmxlc3M6Ly9lYzMwMmRlNC02YjNkLTRmMDMtYTIyOC0zYzZkMzAzZWQzNzBAMS4xNjIuNTEuMTA2OjM3ODk4P3NlY3VyaXR5PXJlYWxpdHkmYWxsb3dJbnNlY3VyZT0wJmZsb3c9eHRscy1ycHJ4LXZpc2lvbiZ0eXBlPXRjcCZmcD1jaHJvbWUmcGJrPXY2dVdKSm1WR0ZQZDBLMDQwUUszUEpIQ2JQYzc0a1hGb1FtQWhwdTMwalEmc2lkPWUxMmQ3ZmRiJnNuaT13d3cueWFob28uY29tJnNlcnZpY2VOYW1lPSZwYXRoPSZob3N0PSNUYWl3YW5fdmxlc3NfMQp2bGVzczovL2VjMzAyZGU0LTZiM2QtNGYwMy1hMjI4LTNjNmQzMDNlZDM3MEAxLjE2Mi41MS4xMDY6Mzc4OTg/c2VjdXJpdHk9cmVhbGl0eSZhbGxvd0luc2VjdXJlPTAmZmxvdz14dGxzLXJwcngtdmlzaW9uJnR5cGU9dGNwJmZwPWNocm9tZSZwYms9djZ1V0pKbVZHRlBkMEswNDBRSzNQSkhDYlBjNzRrWEZvUW1BaHB1MzBqUSZzaWQ9ZTEyZDdmZGImc25pPXd3dy55YWhvby5jb20mc2VydmljZU5hbWU9JnBhdGg9Jmhvc3Q9I1RhaXdhbl92bGVzc18yCnZsZXNzOi8vZWMzMDJkZTQtNmIzZC00ZjAzLWEyMjgtM2M2ZDMwM2VkMzcwQDEuMTYyLjUxLjEwNjozNzg5OD9zZWN1cml0eT1yZWFsaXR5JmFsbG93SW5zZWN1cmU9MCZmbG93PXh0bHMtcnByeC12aXNpb24mdHlwZT10Y3AmZnA9Y2hyb21lJnBiaz12NnVXSkptVkdGUGQwSzA0MFFLM1BKSENiUGM3NGtYRm9RbUFocHUzMGpRJnNpZD1lMTJkN2ZkYiZzbmk9d3d3LnlhaG9vLmNvbSZzZXJ2aWNlTmFtZT0mcGF0aD0maG9zdD0jVGFpd2FuX3ZsZXNzXzM= -------------------------------------------------------------------------------- /sub/sing-box.json: -------------------------------------------------------------------------------- 1 | { 2 | "log": { 3 | "level": "debug", 4 | "timestamp": true 5 | }, 6 | "experimental": { 7 | "clash_api": { 8 | "external_controller": "127.0.0.1:9090", 9 | "external_ui": "ui", 10 | "secret": "", 11 | "external_ui_download_url": "https://mirror.ghproxy.com/https://github.com/MetaCubeX/Yacd-meta/archive/gh-pages.zip", 12 | "external_ui_download_detour": "direct", 13 | "default_mode": "rule" 14 | }, 15 | "cache_file": { 16 | "enabled": true, 17 | "store_fakeip": false 18 | } 19 | }, 20 | "dns": { 21 | "servers": [ 22 | { 23 | "tag": "proxyDns", 24 | "address": "tls://8.8.8.8", 25 | "detour": "proxy" 26 | }, 27 | { 28 | "tag": "localDns", 29 | "address": "https://223.5.5.5/dns-query", 30 | "detour": "direct" 31 | }, 32 | { 33 | "tag": "block", 34 | "address": "rcode://success" 35 | } 36 | ], 37 | "rules": [ 38 | { 39 | "domain": [ 40 | "ghproxy.com", 41 | "cdn.jsdelivr.net", 42 | "testingcf.jsdelivr.net" 43 | ], 44 | "server": "localDns" 45 | }, 46 | { 47 | "rule_set": "geosite-category-ads-all", 48 | "server": "block" 49 | }, 50 | { 51 | "outbound": "any", 52 | "server": "localDns", 53 | "disable_cache": true 54 | }, 55 | { 56 | "rule_set": "geosite-cn", 57 | "server": "localDns" 58 | }, 59 | { 60 | "clash_mode": "direct", 61 | "server": "localDns" 62 | }, 63 | { 64 | "clash_mode": "global", 65 | "server": "proxyDns" 66 | }, 67 | { 68 | "rule_set": "geosite-geolocation-!cn", 69 | "server": "proxyDns" 70 | } 71 | ], 72 | "final": "localDns", 73 | "strategy": "ipv4_only" 74 | }, 75 | "inbounds": [ 76 | { 77 | "type": "tun", 78 | "inet4_address": "172.19.0.1/30", 79 | "mtu": 9000, 80 | "auto_route": true, 81 | "strict_route": true, 82 | "sniff": true, 83 | "endpoint_independent_nat": false, 84 | "stack": "system", 85 | "platform": { 86 | "http_proxy": { 87 | "enabled": true, 88 | "server": "127.0.0.1", 89 | "server_port": 2080 90 | } 91 | } 92 | }, 93 | { 94 | "type": "mixed", 95 | "listen": "127.0.0.1", 96 | "listen_port": 2080, 97 | "sniff": true, 98 | "users": [] 99 | } 100 | ], 101 | "outbounds": [ 102 | { 103 | "tag": "proxy", 104 | "type": "selector", 105 | "outbounds": [ 106 | "auto", 107 | "direct", 108 | "🇹🇼 Taiwan_hy_6", 109 | "🇫🇷 France_hy2_7", 110 | "🇹🇼 Taiwan_hy_9", 111 | "🇫🇷 France_hysteria_0", 112 | "🇺🇸 United States_hysteria_1", 113 | "🇹🇼 Taiwan_hysteria_2", 114 | "🇺🇸 United States_hysteria_3", 115 | "🇫🇷 France_hysteria2_0", 116 | "🇺🇸 United States_hysteria2_1", 117 | "🇫🇷 France_hysteria2_2", 118 | "🇫🇷 France_hysteria2_3", 119 | "🇺🇸 United States_vless_1", 120 | "🇺🇸 United States_vless_2", 121 | "None_vless_3" 122 | ] 123 | }, 124 | { 125 | "tag": "OpenAI", 126 | "type": "selector", 127 | "outbounds": [ 128 | "TaiWan", 129 | "Singapore", 130 | "Japan", 131 | "America", 132 | "Others" 133 | ], 134 | "default": "America" 135 | }, 136 | { 137 | "tag": "Google", 138 | "type": "selector", 139 | "outbounds": [ 140 | "HongKong", 141 | "TaiWan", 142 | "Singapore", 143 | "Japan", 144 | "America", 145 | "Others" 146 | ] 147 | }, 148 | { 149 | "tag": "Telegram", 150 | "type": "selector", 151 | "outbounds": [ 152 | "HongKong", 153 | "TaiWan", 154 | "Singapore", 155 | "Japan", 156 | "America", 157 | "Others" 158 | ] 159 | }, 160 | { 161 | "tag": "Twitter", 162 | "type": "selector", 163 | "outbounds": [ 164 | "HongKong", 165 | "TaiWan", 166 | "Singapore", 167 | "Japan", 168 | "America", 169 | "Others" 170 | ] 171 | }, 172 | { 173 | "tag": "Facebook", 174 | "type": "selector", 175 | "outbounds": [ 176 | "HongKong", 177 | "TaiWan", 178 | "Singapore", 179 | "Japan", 180 | "America", 181 | "Others" 182 | ] 183 | }, 184 | { 185 | "tag": "BiliBili", 186 | "type": "selector", 187 | "outbounds": [ 188 | "direct", 189 | "HongKong", 190 | "TaiWan" 191 | ] 192 | }, 193 | { 194 | "tag": "Bahamut", 195 | "type": "selector", 196 | "outbounds": [ 197 | "HongKong", 198 | "TaiWan", 199 | "Singapore", 200 | "Japan", 201 | "America", 202 | "Others" 203 | ], 204 | "default": "TaiWan" 205 | }, 206 | { 207 | "tag": "Spotify", 208 | "type": "selector", 209 | "outbounds": [ 210 | "HongKong", 211 | "TaiWan", 212 | "Singapore", 213 | "Japan", 214 | "America", 215 | "Others" 216 | ] 217 | }, 218 | { 219 | "tag": "TikTok", 220 | "type": "selector", 221 | "outbounds": [ 222 | "HongKong", 223 | "TaiWan", 224 | "Singapore", 225 | "Japan", 226 | "America" 227 | ], 228 | "default": "Singapore" 229 | }, 230 | { 231 | "tag": "NETFLIX", 232 | "type": "selector", 233 | "outbounds": [ 234 | "HongKong", 235 | "TaiWan", 236 | "Singapore", 237 | "Japan", 238 | "America", 239 | "Others" 240 | ] 241 | }, 242 | { 243 | "tag": "Disney+", 244 | "type": "selector", 245 | "outbounds": [ 246 | "HongKong", 247 | "TaiWan", 248 | "Singapore", 249 | "Japan", 250 | "America", 251 | "Others" 252 | ] 253 | }, 254 | { 255 | "tag": "Apple", 256 | "type": "selector", 257 | "outbounds": [ 258 | "direct", 259 | "HongKong", 260 | "TaiWan", 261 | "Singapore", 262 | "Japan", 263 | "America", 264 | "Others" 265 | ] 266 | }, 267 | { 268 | "tag": "Microsoft", 269 | "type": "selector", 270 | "outbounds": [ 271 | "direct", 272 | "HongKong", 273 | "TaiWan", 274 | "Singapore", 275 | "Japan", 276 | "America", 277 | "Others" 278 | ] 279 | }, 280 | { 281 | "tag": "Games", 282 | "type": "selector", 283 | "outbounds": [ 284 | "direct", 285 | "HongKong", 286 | "TaiWan", 287 | "Singapore", 288 | "Japan", 289 | "America", 290 | "Others" 291 | ] 292 | }, 293 | { 294 | "tag": "Streaming", 295 | "type": "selector", 296 | "outbounds": [ 297 | "HongKong", 298 | "TaiWan", 299 | "Singapore", 300 | "Japan", 301 | "America", 302 | "Others" 303 | ] 304 | }, 305 | { 306 | "tag": "Global", 307 | "type": "selector", 308 | "outbounds": [ 309 | "direct", 310 | "HongKong", 311 | "TaiWan", 312 | "Singapore", 313 | "Japan", 314 | "America", 315 | "Others" 316 | ], 317 | "default": "HongKong" 318 | }, 319 | { 320 | "tag": "China", 321 | "type": "selector", 322 | "outbounds": [ 323 | "direct", 324 | "proxy" 325 | ] 326 | }, 327 | { 328 | "tag": "AdBlock", 329 | "type": "selector", 330 | "outbounds": [ 331 | "block", 332 | "direct" 333 | ] 334 | }, 335 | { 336 | "tag": "HongKong", 337 | "type": "selector", 338 | "outbounds": [ 339 | "proxy" 340 | ] 341 | }, 342 | { 343 | "tag": "TaiWan", 344 | "type": "selector", 345 | "outbounds": [ 346 | "🇹🇼 Taiwan_hy_6", 347 | "🇹🇼 Taiwan_hy_9", 348 | "🇹🇼 Taiwan_hysteria_2", 349 | "proxy" 350 | ] 351 | }, 352 | { 353 | "tag": "Singapore", 354 | "type": "selector", 355 | "outbounds": [ 356 | "proxy" 357 | ] 358 | }, 359 | { 360 | "tag": "Japan", 361 | "type": "selector", 362 | "outbounds": [ 363 | "proxy" 364 | ] 365 | }, 366 | { 367 | "tag": "America", 368 | "type": "selector", 369 | "outbounds": [ 370 | "🇺🇸 United States_hysteria_1", 371 | "🇺🇸 United States_hysteria_3", 372 | "🇺🇸 United States_hysteria2_1", 373 | "🇺🇸 United States_vless_1", 374 | "🇺🇸 United States_vless_2", 375 | "proxy" 376 | ] 377 | }, 378 | { 379 | "tag": "Others", 380 | "type": "selector", 381 | "outbounds": [ 382 | "🇫🇷 France_hy2_7", 383 | "🇫🇷 France_hysteria_0", 384 | "🇫🇷 France_hysteria2_0", 385 | "🇫🇷 France_hysteria2_2", 386 | "🇫🇷 France_hysteria2_3", 387 | "None_vless_3", 388 | "proxy" 389 | ] 390 | }, 391 | { 392 | "tag": "auto", 393 | "type": "urltest", 394 | "outbounds": [ 395 | "🇹🇼 Taiwan_hy_6", 396 | "🇫🇷 France_hy2_7", 397 | "🇹🇼 Taiwan_hy_9", 398 | "🇫🇷 France_hysteria_0", 399 | "🇺🇸 United States_hysteria_1", 400 | "🇹🇼 Taiwan_hysteria_2", 401 | "🇺🇸 United States_hysteria_3", 402 | "🇫🇷 France_hysteria2_0", 403 | "🇺🇸 United States_hysteria2_1", 404 | "🇫🇷 France_hysteria2_2", 405 | "🇫🇷 France_hysteria2_3", 406 | "🇺🇸 United States_vless_1", 407 | "🇺🇸 United States_vless_2", 408 | "None_vless_3" 409 | ], 410 | "url": "http://www.gstatic.com/generate_204", 411 | "interval": "10m", 412 | "tolerance": 50 413 | }, 414 | { 415 | "type": "direct", 416 | "tag": "direct" 417 | }, 418 | { 419 | "type": "dns", 420 | "tag": "dns-out" 421 | }, 422 | { 423 | "type": "block", 424 | "tag": "block" 425 | }, 426 | { 427 | "tag": "🇹🇼 Taiwan_hy_6", 428 | "type": "hysteria", 429 | "server": "www2.dtku48.xyz", 430 | "server_port": 22334, 431 | "up_mbps": 50, 432 | "down_mbps": 80, 433 | "auth_str": "dongtaiwang.com", 434 | "tls": { 435 | "enabled": true, 436 | "server_name": "", 437 | "insecure": true, 438 | "alpn": [ 439 | "h3" 440 | ] 441 | } 442 | }, 443 | { 444 | "tag": "🇫🇷 France_hy2_7", 445 | "type": "hysteria2", 446 | "server": "51.159.77.153", 447 | "server_port": 33390, 448 | "password": "dongtaiwang.com", 449 | "up_mbps": 10, 450 | "down_mbps": 100, 451 | "tls": { 452 | "enabled": true, 453 | "server_name": "bing.com", 454 | "insecure": true, 455 | "alpn": [ 456 | "h3" 457 | ] 458 | } 459 | }, 460 | { 461 | "tag": "🇹🇼 Taiwan_hy_9", 462 | "type": "hysteria", 463 | "server": "www.dtku50.xyz", 464 | "server_port": 18470, 465 | "up_mbps": 50, 466 | "down_mbps": 80, 467 | "auth_str": "", 468 | "tls": { 469 | "enabled": true, 470 | "server_name": "www.amazon.cn", 471 | "insecure": true, 472 | "alpn": [ 473 | "h3" 474 | ] 475 | } 476 | }, 477 | { 478 | "tag": "🇫🇷 France_hysteria_0", 479 | "type": "hysteria", 480 | "server": "51.158.54.46", 481 | "server_port": 55396, 482 | "up_mbps": 11, 483 | "down_mbps": 55, 484 | "auth_str": "dongtaiwang.com", 485 | "tls": { 486 | "enabled": true, 487 | "server_name": "youku.com", 488 | "insecure": true, 489 | "alpn": [ 490 | "h3" 491 | ] 492 | } 493 | }, 494 | { 495 | "tag": "🇺🇸 United States_hysteria_1", 496 | "type": "hysteria", 497 | "server": "173.234.25.52", 498 | "server_port": 48919, 499 | "up_mbps": 11, 500 | "down_mbps": 55, 501 | "auth_str": "dongtaiwang.com", 502 | "tls": { 503 | "enabled": true, 504 | "server_name": "bing.com", 505 | "insecure": true, 506 | "alpn": [ 507 | "h3" 508 | ] 509 | } 510 | }, 511 | { 512 | "tag": "🇹🇼 Taiwan_hysteria_2", 513 | "type": "hysteria", 514 | "server": "www.dtku40.xyz", 515 | "server_port": 18490, 516 | "up_mbps": 11, 517 | "down_mbps": 55, 518 | "auth_str": "dongtaiwang.com", 519 | "tls": { 520 | "enabled": true, 521 | "server_name": "bing.com", 522 | "insecure": true, 523 | "alpn": [ 524 | "h3" 525 | ] 526 | } 527 | }, 528 | { 529 | "tag": "🇺🇸 United States_hysteria_3", 530 | "type": "hysteria", 531 | "server": "167.160.91.115", 532 | "server_port": 41189, 533 | "up_mbps": 11, 534 | "down_mbps": 55, 535 | "auth_str": "bWAwIqINo7XDm1fUlXQGBifVIXoYs1ylgVKqWFKzK1XyDKuwNF", 536 | "tls": { 537 | "enabled": true, 538 | "server_name": "www.amazon.cn", 539 | "insecure": true, 540 | "alpn": [ 541 | "h3" 542 | ] 543 | } 544 | }, 545 | { 546 | "tag": "🇫🇷 France_hysteria2_0", 547 | "type": "hysteria2", 548 | "server": "62.210.103.0", 549 | "server_port": 22483, 550 | "password": "dongtaiwang.com", 551 | "up_mbps": 10, 552 | "down_mbps": 100, 553 | "tls": { 554 | "enabled": true, 555 | "server_name": "www.bing.com", 556 | "insecure": true, 557 | "alpn": [ 558 | "h3" 559 | ] 560 | } 561 | }, 562 | { 563 | "tag": "🇺🇸 United States_hysteria2_1", 564 | "type": "hysteria2", 565 | "server": "64.110.25.11", 566 | "server_port": 33337, 567 | "password": "dongtaiwang.com", 568 | "up_mbps": 10, 569 | "down_mbps": 100, 570 | "tls": { 571 | "enabled": true, 572 | "server_name": "www.bing.com", 573 | "insecure": true, 574 | "alpn": [ 575 | "h3" 576 | ] 577 | } 578 | }, 579 | { 580 | "tag": "🇫🇷 France_hysteria2_2", 581 | "type": "hysteria2", 582 | "server": "62.210.103.0", 583 | "server_port": 22483, 584 | "password": "dongtaiwang.com", 585 | "up_mbps": 10, 586 | "down_mbps": 100, 587 | "tls": { 588 | "enabled": true, 589 | "server_name": "www.bing.com", 590 | "insecure": true, 591 | "alpn": [ 592 | "h3" 593 | ] 594 | } 595 | }, 596 | { 597 | "tag": "🇫🇷 France_hysteria2_3", 598 | "type": "hysteria2", 599 | "server": "51.159.77.198", 600 | "server_port": 53967, 601 | "password": "dongtaiwang.com", 602 | "up_mbps": 10, 603 | "down_mbps": 100, 604 | "tls": { 605 | "enabled": true, 606 | "server_name": "www.bing.com", 607 | "insecure": true, 608 | "alpn": [ 609 | "h3" 610 | ] 611 | } 612 | }, 613 | { 614 | "tag": "🇺🇸 United States_vless_1", 615 | "type": "vless", 616 | "server": "yh1.dtku41.xyz", 617 | "server_port": 443, 618 | "uuid": "ebfdccb6-7416-4b6e-860d-98587344d500", 619 | "packet_encoding": "xudp", 620 | "tls": { 621 | "enabled": true, 622 | "insecure": false, 623 | "server_name": "lg1.freessr2.xyz", 624 | "utls": { 625 | "enabled": true, 626 | "fingerprint": "chrome" 627 | } 628 | }, 629 | "transport": { 630 | "type": "ws", 631 | "path": "/xyakws", 632 | "headers": { 633 | "Host": "lg1.freessr2.xyz" 634 | } 635 | } 636 | }, 637 | { 638 | "tag": "🇺🇸 United States_vless_2", 639 | "type": "vless", 640 | "server": "yh6.dtku41.xyz", 641 | "server_port": 443, 642 | "uuid": "ebfdccb6-7416-4b6e-860d-98587344d500", 643 | "packet_encoding": "xudp", 644 | "tls": { 645 | "enabled": true, 646 | "insecure": false, 647 | "server_name": "lg1.freessr2.xyz", 648 | "utls": { 649 | "enabled": true, 650 | "fingerprint": "chrome" 651 | } 652 | }, 653 | "transport": { 654 | "type": "ws", 655 | "path": "/xyakws", 656 | "headers": { 657 | "Host": "lg1.freessr2.xyz" 658 | } 659 | } 660 | }, 661 | { 662 | "tag": "None_vless_3", 663 | "type": "vless", 664 | "server": "fbi.gov", 665 | "server_port": 443, 666 | "uuid": "ebfdccb6-7416-4b6e-860d-98587344d500", 667 | "packet_encoding": "xudp", 668 | "tls": { 669 | "enabled": true, 670 | "insecure": false, 671 | "server_name": "lg1.freessr2.xyz", 672 | "utls": { 673 | "enabled": true, 674 | "fingerprint": "chrome" 675 | } 676 | }, 677 | "transport": { 678 | "type": "ws", 679 | "path": "/xyakws", 680 | "headers": { 681 | "Host": "lg1.freessr2.xyz" 682 | } 683 | } 684 | } 685 | ], 686 | "route": { 687 | "auto_detect_interface": true, 688 | "final": "proxy", 689 | "rules": [ 690 | { 691 | "protocol": "dns", 692 | "outbound": "dns-out" 693 | }, 694 | { 695 | "port": 53, 696 | "outbound": "dns-out" 697 | }, 698 | { 699 | "network": "udp", 700 | "port": 443, 701 | "outbound": "block" 702 | }, 703 | { 704 | "rule_set": "geosite-category-ads-all", 705 | "outbound": "AdBlock" 706 | }, 707 | { 708 | "clash_mode": "direct", 709 | "outbound": "direct" 710 | }, 711 | { 712 | "clash_mode": "global", 713 | "outbound": "proxy" 714 | }, 715 | { 716 | "domain": [ 717 | "clash.razord.top", 718 | "yacd.metacubex.one", 719 | "yacd.haishan.me", 720 | "d.metacubex.one" 721 | ], 722 | "outbound": "direct" 723 | }, 724 | { 725 | "rule_set": "geosite-openai", 726 | "outbound": "OpenAI" 727 | }, 728 | { 729 | "rule_set": "geosite-youtube", 730 | "outbound": "Google" 731 | }, 732 | { 733 | "rule_set": "geoip-google", 734 | "outbound": "Google" 735 | }, 736 | { 737 | "rule_set": "geosite-google", 738 | "outbound": "Google" 739 | }, 740 | { 741 | "rule_set": "geosite-github", 742 | "outbound": "Google" 743 | }, 744 | { 745 | "rule_set": "geoip-telegram", 746 | "outbound": "Telegram" 747 | }, 748 | { 749 | "rule_set": "geosite-telegram", 750 | "outbound": "Telegram" 751 | }, 752 | { 753 | "rule_set": "geoip-twitter", 754 | "outbound": "Twitter" 755 | }, 756 | { 757 | "rule_set": "geosite-twitter", 758 | "outbound": "Twitter" 759 | }, 760 | { 761 | "rule_set": "geoip-facebook", 762 | "outbound": "Facebook" 763 | }, 764 | { 765 | "rule_set": [ 766 | "geosite-facebook", 767 | "geosite-instagram" 768 | ], 769 | "outbound": "Facebook" 770 | }, 771 | { 772 | "rule_set": "geoip-bilibili", 773 | "outbound": "BiliBili" 774 | }, 775 | { 776 | "rule_set": "geosite-bilibili", 777 | "outbound": "BiliBili" 778 | }, 779 | { 780 | "rule_set": "geosite-bahamut", 781 | "outbound": "Bahamut" 782 | }, 783 | { 784 | "rule_set": "geosite-spotify", 785 | "outbound": "Spotify" 786 | }, 787 | { 788 | "rule_set": "geosite-tiktok", 789 | "outbound": "TikTok" 790 | }, 791 | { 792 | "rule_set": "geoip-netflix", 793 | "outbound": "NETFLIX" 794 | }, 795 | { 796 | "rule_set": "geosite-netflix", 797 | "outbound": "NETFLIX" 798 | }, 799 | { 800 | "rule_set": "geosite-disney", 801 | "outbound": "Disney+" 802 | }, 803 | { 804 | "rule_set": "geosite-apple", 805 | "outbound": "Apple" 806 | }, 807 | { 808 | "rule_set": "geosite-amazon", 809 | "outbound": "Apple" 810 | }, 811 | { 812 | "rule_set": "geosite-microsoft", 813 | "outbound": "Microsoft" 814 | }, 815 | { 816 | "rule_set": "geosite-category-games", 817 | "outbound": "Games" 818 | }, 819 | { 820 | "rule_set": "geosite-hbo", 821 | "outbound": "Streaming" 822 | }, 823 | { 824 | "rule_set": "geosite-primevideo", 825 | "outbound": "Streaming" 826 | }, 827 | { 828 | "rule_set": "geosite-geolocation-!cn", 829 | "outbound": "Global" 830 | }, 831 | { 832 | "rule_set": "geosite-private", 833 | "outbound": "direct" 834 | }, 835 | { 836 | "ip_is_private": true, 837 | "outbound": "direct" 838 | }, 839 | { 840 | "rule_set": "geoip-cn", 841 | "outbound": "China" 842 | }, 843 | { 844 | "rule_set": "geosite-cn", 845 | "outbound": "China" 846 | } 847 | ], 848 | "rule_set": [ 849 | { 850 | "tag": "geoip-google", 851 | "type": "remote", 852 | "format": "binary", 853 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/google.srs", 854 | "download_detour": "direct" 855 | }, 856 | { 857 | "tag": "geoip-telegram", 858 | "type": "remote", 859 | "format": "binary", 860 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/telegram.srs", 861 | "download_detour": "direct" 862 | }, 863 | { 864 | "tag": "geoip-twitter", 865 | "type": "remote", 866 | "format": "binary", 867 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/twitter.srs", 868 | "download_detour": "direct" 869 | }, 870 | { 871 | "tag": "geoip-facebook", 872 | "type": "remote", 873 | "format": "binary", 874 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/facebook.srs", 875 | "download_detour": "direct" 876 | }, 877 | { 878 | "tag": "geoip-netflix", 879 | "type": "remote", 880 | "format": "binary", 881 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/netflix.srs", 882 | "download_detour": "direct" 883 | }, 884 | { 885 | "tag": "geoip-apple", 886 | "type": "remote", 887 | "format": "binary", 888 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo-lite/geoip/apple.srs", 889 | "download_detour": "direct" 890 | }, 891 | { 892 | "tag": "geoip-bilibili", 893 | "type": "remote", 894 | "format": "binary", 895 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo-lite/geoip/bilibili.srs", 896 | "download_detour": "direct" 897 | }, 898 | { 899 | "tag": "geoip-cn", 900 | "type": "remote", 901 | "format": "binary", 902 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/cn.srs", 903 | "download_detour": "direct" 904 | }, 905 | { 906 | "tag": "geosite-private", 907 | "type": "remote", 908 | "format": "binary", 909 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/private.srs", 910 | "download_detour": "direct" 911 | }, 912 | { 913 | "tag": "geosite-openai", 914 | "type": "remote", 915 | "format": "binary", 916 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/openai.srs", 917 | "download_detour": "direct" 918 | }, 919 | { 920 | "tag": "geosite-youtube", 921 | "type": "remote", 922 | "format": "binary", 923 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/youtube.srs", 924 | "download_detour": "direct" 925 | }, 926 | { 927 | "tag": "geosite-google", 928 | "type": "remote", 929 | "format": "binary", 930 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/google.srs", 931 | "download_detour": "direct" 932 | }, 933 | { 934 | "tag": "geosite-github", 935 | "type": "remote", 936 | "format": "binary", 937 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/github.srs", 938 | "download_detour": "direct" 939 | }, 940 | { 941 | "tag": "geosite-telegram", 942 | "type": "remote", 943 | "format": "binary", 944 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/telegram.srs", 945 | "download_detour": "direct" 946 | }, 947 | { 948 | "tag": "geosite-twitter", 949 | "type": "remote", 950 | "format": "binary", 951 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/twitter.srs", 952 | "download_detour": "direct" 953 | }, 954 | { 955 | "tag": "geosite-facebook", 956 | "type": "remote", 957 | "format": "binary", 958 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/facebook.srs", 959 | "download_detour": "direct" 960 | }, 961 | { 962 | "tag": "geosite-instagram", 963 | "type": "remote", 964 | "format": "binary", 965 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/instagram.srs", 966 | "download_detour": "direct" 967 | }, 968 | { 969 | "tag": "geosite-bilibili", 970 | "type": "remote", 971 | "format": "binary", 972 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/bilibili.srs", 973 | "download_detour": "direct" 974 | }, 975 | { 976 | "tag": "geosite-bahamut", 977 | "type": "remote", 978 | "format": "binary", 979 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/bahamut.srs", 980 | "download_detour": "direct" 981 | }, 982 | { 983 | "tag": "geosite-spotify", 984 | "type": "remote", 985 | "format": "binary", 986 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/spotify.srs", 987 | "download_detour": "direct" 988 | }, 989 | { 990 | "tag": "geosite-tiktok", 991 | "type": "remote", 992 | "format": "binary", 993 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/tiktok.srs", 994 | "download_detour": "direct" 995 | }, 996 | { 997 | "tag": "geosite-netflix", 998 | "type": "remote", 999 | "format": "binary", 1000 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/netflix.srs", 1001 | "download_detour": "direct" 1002 | }, 1003 | { 1004 | "tag": "geosite-disney", 1005 | "type": "remote", 1006 | "format": "binary", 1007 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/disney.srs", 1008 | "download_detour": "direct" 1009 | }, 1010 | { 1011 | "tag": "geosite-apple", 1012 | "type": "remote", 1013 | "format": "binary", 1014 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/apple.srs", 1015 | "download_detour": "direct" 1016 | }, 1017 | { 1018 | "tag": "geosite-amazon", 1019 | "type": "remote", 1020 | "format": "binary", 1021 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/amazon.srs", 1022 | "download_detour": "direct" 1023 | }, 1024 | { 1025 | "tag": "geosite-microsoft", 1026 | "type": "remote", 1027 | "format": "binary", 1028 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/microsoft.srs", 1029 | "download_detour": "direct" 1030 | }, 1031 | { 1032 | "tag": "geosite-category-games", 1033 | "type": "remote", 1034 | "format": "binary", 1035 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/category-games.srs", 1036 | "download_detour": "direct" 1037 | }, 1038 | { 1039 | "tag": "geosite-hbo", 1040 | "type": "remote", 1041 | "format": "binary", 1042 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/hbo.srs", 1043 | "download_detour": "direct" 1044 | }, 1045 | { 1046 | "tag": "geosite-primevideo", 1047 | "type": "remote", 1048 | "format": "binary", 1049 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/primevideo.srs", 1050 | "download_detour": "direct" 1051 | }, 1052 | { 1053 | "tag": "geosite-cn", 1054 | "type": "remote", 1055 | "format": "binary", 1056 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/cn.srs", 1057 | "download_detour": "direct" 1058 | }, 1059 | { 1060 | "tag": "geosite-geolocation-!cn", 1061 | "type": "remote", 1062 | "format": "binary", 1063 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/geolocation-!cn.srs", 1064 | "download_detour": "direct" 1065 | }, 1066 | { 1067 | "tag": "geosite-category-ads-all", 1068 | "type": "remote", 1069 | "format": "binary", 1070 | "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/category-ads-all.srs", 1071 | "download_detour": "direct" 1072 | } 1073 | ] 1074 | } 1075 | } -------------------------------------------------------------------------------- /templates/clash_template.yaml: -------------------------------------------------------------------------------- 1 | port: 7890 2 | allow-lan: true 3 | mode: rule 4 | log-level: info 5 | unified-delay: true 6 | global-client-fingerprint: chrome 7 | dns: 8 | enable: true 9 | listen: :53 10 | ipv6: true 11 | enhanced-mode: fake-ip 12 | fake-ip-range: 198.18.0.1/16 13 | default-nameserver: 14 | - 223.5.5.5 15 | - 8.8.8.8 16 | nameserver: 17 | - https://dns.alidns.com/dns-query 18 | - https://doh.pub/dns-query 19 | fallback: 20 | - https://1.0.0.1/dns-query 21 | - tls://dns.google 22 | fallback-filter: 23 | geoip: true 24 | geoip-code: CN 25 | ipcidr: 26 | - 240.0.0.0/4 27 | proxies: 28 | 29 | proxy-groups: 30 | - name: 节点选择 31 | type: select 32 | proxies: 33 | - 自动选择 34 | - DIRECT 35 | 36 | - name: 自动选择 37 | type: url-test 38 | url: http://www.gstatic.com/generate_204 39 | interval: 300 40 | tolerance: 50 41 | proxies: 42 | 43 | 44 | rules: 45 | - DOMAIN,clash.razord.top,DIRECT 46 | - DOMAIN,yacd.haishan.me,DIRECT 47 | - GEOIP,LAN,DIRECT 48 | - GEOIP,CN,DIRECT 49 | - MATCH,节点选择 -------------------------------------------------------------------------------- /urls/clash_urls.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/Alvin9999/pac2/master/clash.meta2/1/config.yaml 2 | https://raw.githubusercontent.com/Alvin9999/pac2/master/clash.meta2/config.yaml 3 | https://raw.githubusercontent.com/Alvin9999/pac2/master/clash.meta2/13/config.yaml 4 | https://raw.githubusercontent.com/Alvin9999/pac2/master/clash.meta2/15/config.yaml 5 | https://raw.githubusercontent.com/Alvin9999/pac2/master/clash.meta2/2/config.yaml 6 | https://raw.githubusercontent.com/Alvin9999/pac2/master/clash.meta2/3/config.yaml 7 | https://raw.githubusercontent.com/Alvin9999/pac2/master/quick/4/config.yaml 8 | https://raw.githubusercontent.com/Alvin9999/pac2/master/quick/1/config.yaml 9 | https://raw.githubusercontent.com/Alvin9999/pac2/master/quick/config.yaml 10 | https://raw.githubusercontent.com/Alvin9999/pac2/master/quick/3/config.yaml 11 | https://raw.githubusercontent.com/chengaopan/AutoMergePublicNodes/master/list.yml 12 | https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list.yml 13 | https://api.yebekhe.link/toClash/?url=https%3A%2F%2Fraw.githubusercontent.com%2Fyebekhe%2FTelegramV2rayCollector%2Fmain%2Fsub%2Fbase64%2Fmix&type=meta&process=full 14 | https://api.yebekhe.link/toClash/?url=https%3A%2F%2Fraw.githubusercontent.com%2FPawdroid%2FFree-servers%2Fmain%2Fsub&type=meta&process=full -------------------------------------------------------------------------------- /urls/hysteria2_urls.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria2/config.json 2 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria2/1/config.json 3 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria2/2/config.json 4 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria2/13/config.json -------------------------------------------------------------------------------- /urls/hysteria_urls.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria/1/config.json 2 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria/13/config.json 3 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria/2/config.json 4 | https://raw.githubusercontent.com/Alvin9999/pac2/master/hysteria/config.json -------------------------------------------------------------------------------- /urls/naiverproxy_urls.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/Alvin9999/PAC/master/naiveproxy/1/config.json 2 | https://raw.githubusercontent.com/Alvin9999/PAC/master/naiveproxy/config.json -------------------------------------------------------------------------------- /urls/sb_urls.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/Alvin9999/pac2/master/singbox/1/config.json 2 | https://raw.githubusercontent.com/Alvin9999/pac2/master/singbox/config.json -------------------------------------------------------------------------------- /urls/ss_urls.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/Alvin9999/pac2/master/ssr-wj/ssconfig.txt 2 | https://raw.githubusercontent.com/Alvin9999/pac2/master/ssr-wj/1/ssconfig.txt -------------------------------------------------------------------------------- /urls/xray_urls.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/Alvin9999/pac2/master/xray/1/config.json 2 | https://raw.githubusercontent.com/Alvin9999/pac2/master/xray/2/config.json 3 | https://raw.githubusercontent.com/Alvin9999/pac2/master/xray/3/config.json 4 | https://raw.githubusercontent.com/Alvin9999/pac2/master/xray/config.json --------------------------------------------------------------------------------