├── .gitignore ├── README.md ├── clash-node.yaml ├── package.json ├── pnpm-lock.yaml └── src ├── config └── template.yaml ├── index.js ├── lib ├── filterWithDelay.js ├── flagMap.js ├── formateName.js └── fsYaml.js └── pipe └── delayNode.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /src/nodes/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | - github地址: https://raw.githubusercontent.com/visiti/clash-node/main/clash-node.yaml 3 | - gitee地址: https://gitee.com/visti/clash-node/raw/main/clash-node.yaml 4 | 5 | # 脚本执行 6 | 将需要合并的配置文件放在`nodes`目录 执行下面命令 7 | > npm i 8 | npm run start 9 | 10 | 11 | # clash客户 12 | 13 | - [clash.net](https://github.com/ClashDotNetFramework/ClashDotNetFramework/releases) 14 | - clash_for_windows [CFW](https://github.com/Fndroid/clash_for_windows_pkg/releases) 15 | - [CFW汉化](https://github.com/BoyceLig/Clash_Chinese_Patch/releases) 16 | 17 | # 中国境内ip 18 | - geoIP2-CN: https://github.com/Hackl0us/GeoIP2-CN 19 | - [geoIP2-CN 数据库](https://cdn.jsdelivr.net/gh/Hackl0us/GeoIP2-CN@release/Country.mmdb) 20 | 21 | -------------------------------------------------------------------------------- /clash-node.yaml: -------------------------------------------------------------------------------- 1 | port: 7890 2 | socks-port: 7891 3 | allow-lan: true 4 | mode: Rule 5 | log-level: info 6 | external-controller: 127.0.0.1:9090 7 | dns: 8 | enable: false 9 | ipv6: false 10 | rule-providers: 11 | reject: 12 | type: http 13 | behavior: domain 14 | url: https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt 15 | path: ./ruleset/reject.yaml 16 | interval: 86400 17 | lancidr: 18 | type: http 19 | behavior: ipcidr 20 | url: https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt 21 | path: ./ruleset/lancidr.yaml 22 | interval: 86400 23 | rules: 24 | - RULE-SET,reject,REJECT 25 | - RULE-SET,lancidr,DIRECT,no-resolve 26 | - GEOIP,CN,DIRECT,no-resolve 27 | - MATCH,自动选择 28 | proxies: 29 | - name: 🇺🇳 其他 1 30 | password: 7x42LetRa0 31 | port: 1443 32 | server: 106.180.225.69 33 | skip-cert-verify: true 34 | type: trojan 35 | udp: true 36 | uuid: 610f9780-84b3-6767-c21c-2bdc35565c89 37 | success_rate: 100 38 | minimum: 63.69 39 | maximum: 100.02 40 | average: 87.53 41 | UpdateDay: 2022-09-30T09:32:03.711477 42 | PFirstFoundDay: 2022-03-11T23:05:01.549769 43 | Rank: 288102 44 | - name: 🇺🇳 其他 2 45 | server: www.gomacau.gq 46 | type: trojan 47 | country: 🇺🇸 US 48 | port: 443 49 | password: b5fc9fa9-796d-4185-a316-395ecac04a85 50 | skip-cert-verify: true 51 | udp: true 52 | success_rate: 100 53 | minimum: 60.88 54 | maximum: 62.02 55 | average: 61.31 56 | UpdateDay: 2022-04-02T15:35:09.325376 57 | PFirstFoundDay: 2022-03-14T10:28:14.224892 58 | Rank: 143465 59 | - name: 🇺🇳 其他 3 60 | server: cn2hn.sub-nthu.com 61 | port: 35003 62 | type: trojan 63 | country: 🇨🇳 CN 64 | password: eda8a8e5-1076-4d7b-b1d0-5003a0350073 65 | skip-cert-verify: true 66 | udp: true 67 | success_rate: 100 68 | minimum: 9.24 69 | maximum: 14.07 70 | average: 12.32 71 | UpdateDay: 2022-09-29T15:30:27.833784 72 | PFirstFoundDay: 2022-06-06T12:34:15.587806 73 | Rank: 65570 74 | - name: 🇺🇳 其他 4 75 | password: 28d98f761aca9d636f44db62544628eb 76 | port: 443 77 | server: 45.66.134.219 78 | skip-cert-verify: true 79 | type: trojan 80 | udp: true 81 | uuid: 1d407d8c-d053-d711-94eb-5ac2d32d3588 82 | success_rate: 100 83 | minimum: 43.3 84 | maximum: 59.07 85 | average: 48.82 86 | UpdateDay: 2022-09-30T09:32:03.636617 87 | PFirstFoundDay: 2022-09-25T09:32:40.474459 88 | Rank: 41382 89 | - name: 🇺🇳 其他 5 90 | server: sunmoon01.abzoones.xyz 91 | port: 36301 92 | type: trojan 93 | country: 🇨🇳 CN 94 | password: 1b5eff5a-f36b-4149-8001-7c8c0c4ed2eb 95 | skip-cert-verify: true 96 | udp: true 97 | success_rate: 100 98 | minimum: 23.32 99 | maximum: 33.44 100 | average: 28.56 101 | UpdateDay: 2022-09-28T21:30:12.122362 102 | PFirstFoundDay: 2022-09-12T00:32:41.419501 103 | Rank: 37043 104 | - name: 🇺🇳 其他 6 105 | password: 8697fe6b-1lWNFc1RmRBNk5NQU5KSnga3fa58ac5a3ef0-b4ab-11eb-b65e-1239d0255272 106 | port: 443 107 | server: 185.44.76.188 108 | skip-cert-verify: true 109 | type: trojan 110 | udp: true 111 | uuid: d7405728-e25f-c165-7fdb-b6575b83df76 112 | success_rate: 100 113 | minimum: 199.66 114 | maximum: 227.77 115 | average: 209.32 116 | UpdateDay: 2022-08-25T12:32:07.765989 117 | PFirstFoundDay: 2022-08-25T12:32:07.765993 118 | Rank: 34680 119 | - name: 🇺🇳 其他 7 120 | server: ygzyd.sub-nthu.com 121 | port: 35000 122 | type: trojan 123 | country: 🇨🇳 CN 124 | password: eda8a8e5-1076-4d7b-b1d0-5003a0350073 125 | skip-cert-verify: true 126 | udp: true 127 | success_rate: 100 128 | minimum: 12.22 129 | maximum: 13.68 130 | average: 13.04 131 | UpdateDay: 2022-09-29T15:30:27.806367 132 | PFirstFoundDay: 2022-06-06T12:34:15.598076 133 | Rank: 15722 134 | - name: 🇺🇳 其他 8 135 | server: 211.72.35.158 136 | port: 3389 137 | type: trojan 138 | country: 🇹🇼 TW 139 | password: d66013c645b93c5c 140 | skip-cert-verify: true 141 | udp: true 142 | success_rate: 100 143 | minimum: 38.93 144 | maximum: 49.16 145 | average: 43.4 146 | UpdateDay: 2022-07-14T21:31:30.841519 147 | PFirstFoundDay: 2022-06-08T12:35:41.103420 148 | Rank: 3187 149 | - name: 🇺🇳 其他 9 150 | server: 2.58.242.43 151 | port: 443 152 | type: trojan 153 | country: 🇹🇼 TW 154 | password: YWVzLTI1Ni1nY206eHBRd3lWNFc1RmRBNk5NQU5KSng3M1VT 155 | skip-cert-verify: true 156 | udp: true 157 | success_rate: 100 158 | minimum: 44.28 159 | maximum: 56.11 160 | average: 48.58 161 | UpdateDay: 2022-09-29T15:30:28.223257 162 | PFirstFoundDay: 2022-09-23T15:32:27.669547 163 | Rank: 1916 164 | - alterId: 0 165 | cipher: auto 166 | name: 🇺🇳 其他 10 167 | network: ws 168 | port: 80 169 | server: 104.22.25.131 170 | skip-cert-verify: false 171 | tls: false 172 | type: vmess 173 | udp: true 174 | uuid: 781be00e-1e09-4e27-a464-e14197418c8f 175 | ws-opts: 176 | headers: 177 | Host: id5.v2rayserv.com 178 | path: / 179 | success_rate: 100 180 | minimum: 136.12 181 | maximum: 137.39 182 | average: 136.62 183 | UpdateDay: 2022-12-07T09:33:25.339453 184 | PFirstFoundDay: 2022-12-07T09:33:25.339486 185 | Rank: -222 186 | - name: 🇺🇳 其他 11 187 | password: 8078dd51-d4d9-4024-89df-50e358a00a54 188 | port: 443 189 | server: 103.81.85.238 190 | skip-cert-verify: true 191 | type: trojan 192 | udp: true 193 | uuid: 02543944-97e3-75d5-639d-61e2f810aad9 194 | success_rate: 100 195 | minimum: 348.08 196 | maximum: 365.41 197 | average: 354.21 198 | UpdateDay: 2022-12-07T12:33:25.387026 199 | PFirstFoundDay: 2022-11-28T15:32:28.050459 200 | Rank: -469 201 | - name: 🇺🇳 其他 12 202 | server: www.cjf0423.cf 203 | port: 443 204 | type: trojan 205 | country: 🇺🇸 US 206 | password: "111111" 207 | skip-cert-verify: true 208 | udp: true 209 | success_rate: 100 210 | minimum: 45.74 211 | maximum: 65.31 212 | average: 54.09 213 | UpdateDay: 2022-09-29T15:30:28.079382 214 | PFirstFoundDay: 2022-09-12T00:32:43.496454 215 | Rank: -3178 216 | - name: 🇺🇳 其他 13 217 | password: idc117okt 218 | port: 443 219 | server: 103.176.78.153 220 | skip-cert-verify: true 221 | type: trojan 222 | udp: true 223 | uuid: f3562cb7-0641-0f22-c3de-b9d986fec0da 224 | success_rate: 100 225 | minimum: 124.3 226 | maximum: 133.01 227 | average: 128.55 228 | UpdateDay: 2022-10-26T03:32:45.052312 229 | PFirstFoundDay: 2022-10-24T03:31:54.019177 230 | Rank: -4439 231 | - name: 🇺🇳 其他 14 232 | server: 103.173.155.72 233 | port: 28443 234 | type: trojan 235 | country: 🏁 ZZ 236 | password: 6f6ae34d-fe7f-4ca1-a912-ecc01386bdc4 237 | skip-cert-verify: true 238 | udp: true 239 | success_rate: 100 240 | minimum: 251.01 241 | maximum: 263.21 242 | average: 257.92 243 | UpdateDay: 2022-09-29T15:30:28.533430 244 | PFirstFoundDay: 2022-06-09T06:34:57.503154 245 | Rank: -5357 246 | - name: 🇺🇳 其他 15 247 | password: c51d3975-a40c-4a5b-929b-c8595ed87850 248 | port: 443 249 | server: 1.apcdn.6641634715834932.me 250 | skip-cert-verify: true 251 | sni: wel-usgt.optage.moe 252 | type: trojan 253 | udp: true 254 | uuid: c1d43576-d707-2c74-ebe5-912a57857e41 255 | success_rate: 100 256 | minimum: 40.83 257 | maximum: 45.45 258 | average: 42.67 259 | UpdateDay: 2022-11-23T12:33:45.698279 260 | PFirstFoundDay: 2022-11-23T12:33:45.698283 261 | Rank: -11776 262 | - name: 🇺🇳 其他 16 263 | password: 7x42LetRa0 264 | port: 1443 265 | server: 106.180.225.69 266 | skip-cert-verify: true 267 | type: trojan 268 | udp: true 269 | uuid: 610f9780-84b3-6767-c21c-2bdc35565c89 270 | success_rate: 100 271 | minimum: 63.69 272 | maximum: 100.02 273 | average: 87.53 274 | UpdateDay: 2022-09-30T09:32:03.711477 275 | PFirstFoundDay: 2022-03-11T23:05:01.549769 276 | Rank: 288102 277 | - name: 🇺🇳 其他 17 278 | server: www.gomacau.gq 279 | type: trojan 280 | country: 🇺🇸 US 281 | port: 443 282 | password: b5fc9fa9-796d-4185-a316-395ecac04a85 283 | skip-cert-verify: true 284 | udp: true 285 | success_rate: 100 286 | minimum: 60.88 287 | maximum: 62.02 288 | average: 61.31 289 | UpdateDay: 2022-04-02T15:35:09.325376 290 | PFirstFoundDay: 2022-03-14T10:28:14.224892 291 | Rank: 143465 292 | - name: 🇺🇳 其他 18 293 | server: cn2hn.sub-nthu.com 294 | port: 35003 295 | type: trojan 296 | country: 🇨🇳 CN 297 | password: eda8a8e5-1076-4d7b-b1d0-5003a0350073 298 | skip-cert-verify: true 299 | udp: true 300 | success_rate: 100 301 | minimum: 9.24 302 | maximum: 14.07 303 | average: 12.32 304 | UpdateDay: 2022-09-29T15:30:27.833784 305 | PFirstFoundDay: 2022-06-06T12:34:15.587806 306 | Rank: 65570 307 | - name: 🇺🇳 其他 19 308 | password: 28d98f761aca9d636f44db62544628eb 309 | port: 443 310 | server: 45.66.134.219 311 | skip-cert-verify: true 312 | type: trojan 313 | udp: true 314 | uuid: 1d407d8c-d053-d711-94eb-5ac2d32d3588 315 | success_rate: 100 316 | minimum: 43.3 317 | maximum: 59.07 318 | average: 48.82 319 | UpdateDay: 2022-09-30T09:32:03.636617 320 | PFirstFoundDay: 2022-09-25T09:32:40.474459 321 | Rank: 41382 322 | - name: 🇺🇳 其他 20 323 | password: 8697fe6b-1lWNFc1RmRBNk5NQU5KSnga3fa58ac5a3ef0-b4ab-11eb-b65e-1239d0255272 324 | port: 443 325 | server: 185.44.76.188 326 | skip-cert-verify: true 327 | type: trojan 328 | udp: true 329 | uuid: d7405728-e25f-c165-7fdb-b6575b83df76 330 | success_rate: 100 331 | minimum: 199.66 332 | maximum: 227.77 333 | average: 209.32 334 | UpdateDay: 2022-08-25T12:32:07.765989 335 | PFirstFoundDay: 2022-08-25T12:32:07.765993 336 | Rank: 34680 337 | - name: 🇺🇳 其他 21 338 | server: ygzyd.sub-nthu.com 339 | port: 35000 340 | type: trojan 341 | country: 🇨🇳 CN 342 | password: eda8a8e5-1076-4d7b-b1d0-5003a0350073 343 | skip-cert-verify: true 344 | udp: true 345 | success_rate: 100 346 | minimum: 12.22 347 | maximum: 13.68 348 | average: 13.04 349 | UpdateDay: 2022-09-29T15:30:27.806367 350 | PFirstFoundDay: 2022-06-06T12:34:15.598076 351 | Rank: 15722 352 | - name: 🇺🇳 其他 22 353 | server: 211.72.35.158 354 | port: 3389 355 | type: trojan 356 | country: 🇹🇼 TW 357 | password: d66013c645b93c5c 358 | skip-cert-verify: true 359 | udp: true 360 | success_rate: 100 361 | minimum: 38.93 362 | maximum: 49.16 363 | average: 43.4 364 | UpdateDay: 2022-07-14T21:31:30.841519 365 | PFirstFoundDay: 2022-06-08T12:35:41.103420 366 | Rank: 3187 367 | - name: 🇺🇳 其他 23 368 | server: 2.58.242.43 369 | port: 443 370 | type: trojan 371 | country: 🇹🇼 TW 372 | password: YWVzLTI1Ni1nY206eHBRd3lWNFc1RmRBNk5NQU5KSng3M1VT 373 | skip-cert-verify: true 374 | udp: true 375 | success_rate: 100 376 | minimum: 44.28 377 | maximum: 56.11 378 | average: 48.58 379 | UpdateDay: 2022-09-29T15:30:28.223257 380 | PFirstFoundDay: 2022-09-23T15:32:27.669547 381 | Rank: 1916 382 | - alterId: 0 383 | cipher: auto 384 | name: 🇺🇳 其他 24 385 | network: ws 386 | port: 80 387 | server: 104.22.25.131 388 | skip-cert-verify: false 389 | tls: false 390 | type: vmess 391 | udp: true 392 | uuid: 781be00e-1e09-4e27-a464-e14197418c8f 393 | ws-opts: 394 | headers: 395 | Host: id5.v2rayserv.com 396 | path: / 397 | success_rate: 100 398 | minimum: 136.12 399 | maximum: 137.39 400 | average: 136.62 401 | UpdateDay: 2022-12-07T09:33:25.339453 402 | PFirstFoundDay: 2022-12-07T09:33:25.339486 403 | Rank: -222 404 | - name: 🇺🇳 其他 25 405 | password: 8078dd51-d4d9-4024-89df-50e358a00a54 406 | port: 443 407 | server: 103.81.85.238 408 | skip-cert-verify: true 409 | type: trojan 410 | udp: true 411 | uuid: 02543944-97e3-75d5-639d-61e2f810aad9 412 | success_rate: 100 413 | minimum: 348.08 414 | maximum: 365.41 415 | average: 354.21 416 | UpdateDay: 2022-12-07T12:33:25.387026 417 | PFirstFoundDay: 2022-11-28T15:32:28.050459 418 | Rank: -469 419 | - name: 🇺🇳 其他 26 420 | server: www.cjf0423.cf 421 | port: 443 422 | type: trojan 423 | country: 🇺🇸 US 424 | password: "111111" 425 | skip-cert-verify: true 426 | udp: true 427 | success_rate: 100 428 | minimum: 45.74 429 | maximum: 65.31 430 | average: 54.09 431 | UpdateDay: 2022-09-29T15:30:28.079382 432 | PFirstFoundDay: 2022-09-12T00:32:43.496454 433 | Rank: -3178 434 | - name: 🇺🇳 其他 27 435 | password: idc117okt 436 | port: 443 437 | server: 103.176.78.153 438 | skip-cert-verify: true 439 | type: trojan 440 | udp: true 441 | uuid: f3562cb7-0641-0f22-c3de-b9d986fec0da 442 | success_rate: 100 443 | minimum: 124.3 444 | maximum: 133.01 445 | average: 128.55 446 | UpdateDay: 2022-10-26T03:32:45.052312 447 | PFirstFoundDay: 2022-10-24T03:31:54.019177 448 | Rank: -4439 449 | - name: 🇺🇳 其他 28 450 | server: 103.173.155.72 451 | port: 28443 452 | type: trojan 453 | country: 🏁 ZZ 454 | password: 6f6ae34d-fe7f-4ca1-a912-ecc01386bdc4 455 | skip-cert-verify: true 456 | udp: true 457 | success_rate: 100 458 | minimum: 251.01 459 | maximum: 263.21 460 | average: 257.92 461 | UpdateDay: 2022-09-29T15:30:28.533430 462 | PFirstFoundDay: 2022-06-09T06:34:57.503154 463 | Rank: -5357 464 | - name: 🇺🇳 其他 29 465 | password: c51d3975-a40c-4a5b-929b-c8595ed87850 466 | port: 443 467 | server: 1.apcdn.6641634715834932.me 468 | skip-cert-verify: true 469 | sni: wel-usgt.optage.moe 470 | type: trojan 471 | udp: true 472 | uuid: c1d43576-d707-2c74-ebe5-912a57857e41 473 | success_rate: 100 474 | minimum: 40.83 475 | maximum: 45.45 476 | average: 42.67 477 | UpdateDay: 2022-11-23T12:33:45.698279 478 | PFirstFoundDay: 2022-11-23T12:33:45.698283 479 | Rank: -11776 480 | - name: 🇯🇵 日本 1 481 | server: jp2.czs1000.com 482 | port: 8886 483 | type: vmess 484 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 485 | alterId: 0 486 | cipher: auto 487 | tls: true 488 | skip-cert-verify: false 489 | servername: jp2.czs1000.com 490 | udp: true 491 | - name: 🇦🇷 阿根廷 1 492 | server: relay1.wl-node1.com 493 | port: 39014 494 | type: ss 495 | cipher: aes-128-gcm 496 | password: 3a848bf3-a464-4d33-9b18-02439d513a97 497 | udp: true 498 | - name: 🇦🇺 澳洲 1 499 | server: ap.stablize.top 500 | port: 443 501 | type: trojan 502 | password: 8e3fdb7d-401d-42a4-92f2-b12fb805cd0f 503 | skip-cert-verify: false 504 | udp: true 505 | - name: 🇸🇬 新加坡 1 506 | server: sg01.trojanyyds.xyz 507 | port: 443 508 | type: trojan 509 | password: a6bebbb9-c6bc-42af-9ea2-434a2164a978 510 | sni: sg01.trojanyyds.xyz 511 | skip-cert-verify: false 512 | udp: true 513 | - name: 🇨🇳 中国 1 514 | server: tw7.czs1000.com 515 | port: 1001 516 | type: vmess 517 | uuid: f2e1b008-6f6d-4098-900e-a8029cf608bd 518 | alterId: 0 519 | cipher: auto 520 | tls: true 521 | skip-cert-verify: false 522 | servername: tw7.czs1000.com 523 | udp: true 524 | - name: 🇯🇵 日本 2 525 | server: jp5.tejiewm.com 526 | port: 4106 527 | type: vmess 528 | uuid: f2e1b008-6f6d-4098-900e-a8029cf608bd 529 | alterId: 0 530 | cipher: auto 531 | tls: true 532 | skip-cert-verify: false 533 | servername: jp5.tejiewm.com 534 | udp: true 535 | - name: 🇰🇷 韩国 1 536 | server: kr4.czs1000.com 537 | port: 6687 538 | type: vmess 539 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 540 | alterId: 0 541 | cipher: auto 542 | tls: true 543 | skip-cert-verify: false 544 | servername: kr4.czs1000.com 545 | udp: true 546 | - name: 🇷🇺 俄罗斯 1 547 | server: ru01.trojanyyds.xyz 548 | port: 443 549 | type: trojan 550 | password: a6bebbb9-c6bc-42af-9ea2-434a2164a978 551 | sni: ru01.trojanyyds.xyz 552 | skip-cert-verify: false 553 | udp: true 554 | - name: 🇯🇵 日本 3 555 | server: jp5.tejiewm.com 556 | port: 4106 557 | type: vmess 558 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 559 | alterId: 0 560 | cipher: auto 561 | tls: true 562 | skip-cert-verify: false 563 | servername: jp5.tejiewm.com 564 | udp: true 565 | - name: 🇯🇵 日本 4 566 | server: jp-orcle.clientsconnect.live 567 | port: 10086 568 | type: vmess 569 | uuid: 04a6bef1-3285-4044-84ee-82a9ee20b82d 570 | alterId: 0 571 | cipher: auto 572 | tls: false 573 | skip-cert-verify: false 574 | network: ws 575 | ws-opts: 576 | path: /yuefei 577 | headers: 578 | Host: jp-orcle.clientsconnect.live 579 | udp: true 580 | - name: 🇳🇱 荷兰 1 581 | server: 162.159.160.104 582 | port: 8080 583 | type: vmess 584 | uuid: e3dba91f-b31c-473a-8f17-92e1dedda38f 585 | alterId: 0 586 | cipher: auto 587 | tls: false 588 | skip-cert-verify: false 589 | network: ws 590 | ws-opts: 591 | path: / 592 | headers: 593 | Host: v6nt.gongyiyun.cf 594 | udp: true 595 | - name: 🇷🇺 俄罗斯 2 596 | server: ru.mjt001.com 597 | port: 443 598 | type: trojan 599 | password: 5a035db3-34ea-48ca-9aa2-72c8229e1532 600 | sni: ru.mjt001.com 601 | skip-cert-verify: false 602 | udp: true 603 | - name: 🇨🇳 中国 2 604 | server: tw4.czs1000.com 605 | port: 1001 606 | type: vmess 607 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 608 | alterId: 0 609 | cipher: auto 610 | tls: true 611 | skip-cert-verify: false 612 | servername: tw4.czs1000.com 613 | udp: true 614 | - name: 🇭🇰 香港 1 615 | server: 20.189.76.88 616 | port: 10021 617 | type: vmess 618 | uuid: cb4172af-65a6-4717-87ad-e96cfee20666 619 | alterId: 0 620 | cipher: auto 621 | tls: false 622 | skip-cert-verify: false 623 | network: ws 624 | ws-opts: 625 | path: cctv13/hdd.m3u8 626 | headers: 627 | Host: 20.189.76.88:49 628 | udp: true 629 | - name: 🇸🇬 新加坡 2 630 | server: 04.123445566.xyz 631 | port: 42716 632 | type: ss 633 | cipher: chacha20-ietf-poly1305 634 | password: 02b430e1-abf7-4fd0-b534-6b701322cb6e 635 | udp: true 636 | - name: 🇯🇵 日本 5 637 | server: jp1.awslcn.cc 638 | port: 25219 639 | type: vmess 640 | uuid: a6bebbb9-c6bc-42af-9ea2-434a2164a978 641 | alterId: 0 642 | cipher: auto 643 | tls: false 644 | skip-cert-verify: false 645 | network: ws 646 | ws-opts: 647 | path: / 648 | headers: 649 | Host: jp1.awslcn.cc 650 | udp: true 651 | - name: 🇨🇳 中国 3 652 | server: kqs-moble.gatknqh.cn 653 | port: 44813 654 | type: ss 655 | cipher: aes-256-gcm 656 | password: 7fd4c200-368b-415c-8612-d04eae7941e3 657 | udp: true 658 | - name: 🇯🇵 日本 6 659 | server: kqs-unicom.gatknqh.cn 660 | port: 42375 661 | type: ss 662 | cipher: aes-256-gcm 663 | password: 7fd4c200-368b-415c-8612-d04eae7941e3 664 | udp: true 665 | - name: 🇺🇸 美国 1 666 | server: 104.19.30.243 667 | port: 2095 668 | type: vmess 669 | uuid: e3dba91f-b31c-473a-8f17-92e1dedda38f 670 | alterId: 0 671 | cipher: auto 672 | tls: false 673 | skip-cert-verify: false 674 | network: ws 675 | ws-opts: 676 | path: / 677 | headers: 678 | Host: dknbyn3lw16n5elj.gongyiyun.cf 679 | udp: true 680 | - name: 🇭🇰 香港 2 681 | server: hk2.czs1000.com 682 | port: 3886 683 | type: vmess 684 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 685 | alterId: 0 686 | cipher: auto 687 | tls: true 688 | skip-cert-verify: false 689 | servername: hk2.czs1000.com 690 | udp: true 691 | - name: 🇯🇵 日本 7 692 | server: jp-orcle.clientsconnect.live 693 | port: 10086 694 | type: vmess 695 | uuid: 63bf2251-7e4a-4981-a3d2-5b8efc788b46 696 | alterId: 0 697 | cipher: auto 698 | tls: false 699 | skip-cert-verify: false 700 | network: ws 701 | ws-opts: 702 | path: /yuefei 703 | headers: 704 | Host: jp-orcle.clientsconnect.live 705 | udp: true 706 | - name: 🇯🇵 日本 8 707 | server: jp1.czs1000.com 708 | port: 4144 709 | type: vmess 710 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 711 | alterId: 0 712 | cipher: auto 713 | tls: true 714 | skip-cert-verify: false 715 | servername: jp1.czs1000.com 716 | udp: true 717 | - name: 🇭🇰 香港 3 718 | server: kr1.czs1000.com 719 | port: 8869 720 | type: vmess 721 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 722 | alterId: 0 723 | cipher: auto 724 | tls: true 725 | skip-cert-verify: false 726 | servername: kr1.czs1000.com 727 | udp: true 728 | - name: 🇯🇵 日本 9 729 | server: jp.stablize.top 730 | port: 443 731 | type: trojan 732 | password: 8e3fdb7d-401d-42a4-92f2-b12fb805cd0f 733 | skip-cert-verify: false 734 | udp: true 735 | - name: 🇨🇳 中国 4 736 | server: cm.awslcn.cc 737 | port: 25232 738 | type: vmess 739 | uuid: a6bebbb9-c6bc-42af-9ea2-434a2164a978 740 | alterId: 0 741 | cipher: auto 742 | tls: false 743 | skip-cert-verify: false 744 | network: ws 745 | ws-opts: 746 | path: / 747 | headers: 748 | Host: cm.awslcn.cc 749 | udp: true 750 | - name: 🇯🇵 日本 10 751 | server: jp9.tejiewm.com 752 | port: 4104 753 | type: vmess 754 | uuid: 395bb2dc-2561-475d-b568-c10c8228d659 755 | alterId: 0 756 | cipher: auto 757 | tls: true 758 | skip-cert-verify: false 759 | servername: jp9.tejiewm.com 760 | udp: true 761 | proxy-groups: 762 | - name: 自动选择 763 | interval: 300 764 | type: select 765 | url: http://www.gstatic.com/generate_204 766 | proxies: 767 | - 🇦🇷 阿根廷 1 768 | - 🇦🇺 澳洲 1 769 | - 🇨🇳 中国 1 770 | - 🇨🇳 中国 2 771 | - 🇨🇳 中国 3 772 | - 🇨🇳 中国 4 773 | - 🇭🇰 香港 1 774 | - 🇭🇰 香港 2 775 | - 🇭🇰 香港 3 776 | - 🇯🇵 日本 1 777 | - 🇯🇵 日本 10 778 | - 🇯🇵 日本 2 779 | - 🇯🇵 日本 3 780 | - 🇯🇵 日本 4 781 | - 🇯🇵 日本 5 782 | - 🇯🇵 日本 6 783 | - 🇯🇵 日本 7 784 | - 🇯🇵 日本 8 785 | - 🇯🇵 日本 9 786 | - 🇰🇷 韩国 1 787 | - 🇳🇱 荷兰 1 788 | - 🇷🇺 俄罗斯 1 789 | - 🇷🇺 俄罗斯 2 790 | - 🇸🇬 新加坡 1 791 | - 🇸🇬 新加坡 2 792 | - 🇺🇳 其他 1 793 | - 🇺🇳 其他 10 794 | - 🇺🇳 其他 11 795 | - 🇺🇳 其他 12 796 | - 🇺🇳 其他 13 797 | - 🇺🇳 其他 14 798 | - 🇺🇳 其他 15 799 | - 🇺🇳 其他 16 800 | - 🇺🇳 其他 17 801 | - 🇺🇳 其他 18 802 | - 🇺🇳 其他 19 803 | - 🇺🇳 其他 2 804 | - 🇺🇳 其他 20 805 | - 🇺🇳 其他 21 806 | - 🇺🇳 其他 22 807 | - 🇺🇳 其他 23 808 | - 🇺🇳 其他 24 809 | - 🇺🇳 其他 25 810 | - 🇺🇳 其他 26 811 | - 🇺🇳 其他 27 812 | - 🇺🇳 其他 28 813 | - 🇺🇳 其他 29 814 | - 🇺🇳 其他 3 815 | - 🇺🇳 其他 4 816 | - 🇺🇳 其他 5 817 | - 🇺🇳 其他 6 818 | - 🇺🇳 其他 7 819 | - 🇺🇳 其他 8 820 | - 🇺🇳 其他 9 821 | - 🇺🇸 美国 1 822 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "clash-node", 3 | "version": "1.0.0", 4 | "description": "clash-node", 5 | "main": "src/index.js", 6 | "type": "module", 7 | "scripts": { 8 | "start": "node src/index.js", 9 | "delay": "node src/lib/filterWithDelay.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/visiti/clash-node.git" 14 | }, 15 | "keywords": [], 16 | "author": "", 17 | "license": "ISC", 18 | "bugs": { 19 | "url": "https://github.com/visiti/clash-node/issues" 20 | }, 21 | "homepage": "https://github.com/visiti/clash-node#readme", 22 | "dependencies": { 23 | "rxjs": "^7.2.0", 24 | "xhr2": "^0.2.1", 25 | "xmlhttprequest": "^1.8.0", 26 | "yaml": "^1.10.2" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | rxjs: ^7.2.0 5 | xhr2: ^0.2.1 6 | xmlhttprequest: ^1.8.0 7 | yaml: ^1.10.2 8 | 9 | dependencies: 10 | rxjs: 7.5.1 11 | xhr2: 0.2.1 12 | xmlhttprequest: 1.8.0 13 | yaml: 1.10.2 14 | 15 | packages: 16 | 17 | /rxjs/7.5.1: 18 | resolution: {integrity: sha512-KExVEeZWxMZnZhUZtsJcFwz8IvPvgu4G2Z2QyqjZQzUGr32KDYuSxrEYO4w3tFFNbfLozcrKUTvTPi+E9ywJkQ==} 19 | dependencies: 20 | tslib: 2.3.1 21 | dev: false 22 | 23 | /tslib/2.3.1: 24 | resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} 25 | dev: false 26 | 27 | /xhr2/0.2.1: 28 | resolution: {integrity: sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==} 29 | engines: {node: '>= 6'} 30 | dev: false 31 | 32 | /xmlhttprequest/1.8.0: 33 | resolution: {integrity: sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=} 34 | engines: {node: '>=0.4.0'} 35 | dev: false 36 | 37 | /yaml/1.10.2: 38 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 39 | engines: {node: '>= 6'} 40 | dev: false 41 | -------------------------------------------------------------------------------- /src/config/template.yaml: -------------------------------------------------------------------------------- 1 | port: 7890 2 | socks-port: 7891 3 | allow-lan: true 4 | mode: Rule 5 | log-level: info 6 | external-controller: 127.0.0.1:9090 7 | 8 | dns: 9 | enable: false 10 | ipv6: false 11 | 12 | rule-providers: 13 | #广告域名列表 14 | reject: 15 | type: http 16 | behavior: domain 17 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt" 18 | path: ./ruleset/reject.yaml 19 | interval: 86400 20 | 21 | #局域网 IP 及保留 IP 地址列表 22 | lancidr: 23 | type: http 24 | behavior: ipcidr 25 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt" 26 | path: ./ruleset/lancidr.yaml 27 | interval: 86400 28 | 29 | rules: 30 | - RULE-SET,reject,REJECT 31 | - RULE-SET,lancidr,DIRECT,no-resolve 32 | - GEOIP,CN,DIRECT,no-resolve 33 | - MATCH,自动选择 34 | 35 | proxies: 36 | 37 | proxy-groups: 38 | - name: 自动选择 39 | interval: 300 40 | type: select 41 | url: http://www.gstatic.com/generate_204 42 | proxies: -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { readNodes, writeNode } from './lib/fsYaml.js'; 2 | import { formateName } from './lib/formateName.js'; 3 | 4 | const nodesDir = 'src/nodes/' 5 | 6 | const proxies = readNodes(nodesDir); 7 | formateName(proxies); 8 | writeNode(proxies); -------------------------------------------------------------------------------- /src/lib/filterWithDelay.js: -------------------------------------------------------------------------------- 1 | import { ajax } from 'rxjs/ajax' 2 | import xhr2 from 'xhr2' 3 | import { delayNode } from '../pipe/delayNode.js' 4 | import { readYaml, writeNode } from '../lib/fsYaml.js'; 5 | const XHR2 = typeof XMLHttpRequest !== 'undefined' ? XMLHttpRequest : xhr2 6 | 7 | // 接口地址 host(127.0.0.1) + 控制端口 8 | ajax({ 9 | url: "http://127.0.0.1:19090/proxies", 10 | createXHR: () => new XHR2(), 11 | method: 'GET', 12 | }).pipe( 13 | delayNode() 14 | ).subscribe(val => { 15 | let clashConfig = readYaml('clash-node.yaml'); 16 | let proxies = clashConfig.proxies; 17 | let flagMap = new Map(); 18 | let newProxies = []; 19 | for (let proxie of proxies) { 20 | for (let Id of val) { 21 | let nameId = Id.split(' '); 22 | if (proxie.name === Id) { 23 | flagMap.set(nameId[0], flagMap.get(nameId[0]) + 1 || 1); 24 | nameId[nameId.length - 1] = flagMap.get(nameId[0]); 25 | proxie.name = nameId.join(' '); 26 | newProxies.push(proxie); 27 | break; 28 | } 29 | } 30 | } 31 | writeNode(newProxies, './clash-node.yaml', './clash-node.yaml') 32 | }) -------------------------------------------------------------------------------- /src/lib/flagMap.js: -------------------------------------------------------------------------------- 1 | // https://www.ifreesite.com/emoji/flag.htm 2 | /** 3 | * 仅代表节点地址 不涉及政治 4 | * 5 | */ 6 | export const flagMap ={ 7 | "🇦🇨 阿森松岛": "🇦🇨|阿森松岛", 8 | "🇦🇩 安道尔": "🇦🇩|安道尔", 9 | "🇦🇪 阿拉伯联合大公国": "🇦🇪|阿拉伯联合大公国", 10 | "🇦🇫 阿富汗": "🇦🇫|阿富汗", 11 | "🇦🇬 安地卡及巴布达": "🇦🇬|安地卡及巴布达", 12 | "🇦🇮 安圭拉": "🇦🇮|安圭拉", 13 | "🇦🇱 阿尔巴尼亚": "🇦🇱|阿尔巴尼亚", 14 | "🇦🇲 亚美尼亚": "🇦🇲|亚美尼亚", 15 | "🇦🇴 安哥拉": "🇦🇴|安哥拉", 16 | "🇦🇶 南极洲": "🇦🇶|南极洲", 17 | "🇦🇷 阿根廷": "🇦🇷|阿根廷", 18 | "🇦🇸 美属萨摩亚": "🇦🇸|美属萨摩亚", 19 | "🇦🇹 奥地利": "🇦🇹|奥地利", 20 | "🇦🇺 澳洲": "🇦🇺|澳洲", 21 | "🇦🇼 阿鲁巴": "🇦🇼|阿鲁巴", 22 | "🇦🇽 奥兰群岛": "🇦🇽|奥兰群岛", 23 | "🇦🇿 亚塞拜然": "🇦🇿|亚塞拜然", 24 | "🇧🇦 波士尼亚与赫塞哥维纳": "🇧🇦|波士尼亚与赫塞哥维纳", 25 | "🇧🇧 巴贝多": "🇧🇧|巴贝多", 26 | "🇧🇩 孟加拉": "🇧🇩|孟加拉", 27 | "🇧🇪 比利时": "🇧🇪|比利时", 28 | "🇧🇫 布吉纳法索": "🇧🇫|布吉纳法索", 29 | "🇧🇬 保加利亚": "🇧🇬|保加利亚", 30 | "🇧🇭 巴林": "🇧🇭|巴林", 31 | "🇧🇮 蒲隆地": "🇧🇮|蒲隆地", 32 | "🇧🇯 贝南": "🇧🇯|贝南", 33 | "🇧🇱 圣巴泰勒米": "🇧🇱|圣巴泰勒米", 34 | "🇧🇲 百慕达": "🇧🇲|百慕达", 35 | "🇧🇳 汶莱": "🇧🇳|汶莱", 36 | "🇧🇴 玻利维亚": "🇧🇴|玻利维亚", 37 | "🇧🇶 荷兰加勒比": "🇧🇶|荷兰加勒比", 38 | "🇧🇷 巴西": "🇧🇷|巴西", 39 | "🇧🇸 巴哈马": "🇧🇸|巴哈马", 40 | "🇧🇹 不丹": "🇧🇹|不丹", 41 | "🇧🇻 布威岛": "🇧🇻|布威岛", 42 | "🇧🇼 波札那": "🇧🇼|波札那", 43 | "🇧🇾 白俄罗斯": "🇧🇾|白俄罗斯", 44 | "🇧🇿 贝里斯": "🇧🇿|贝里斯", 45 | "🇨🇦 加拿大": "🇨🇦|加拿大", 46 | "🇨🇨 科科斯(基林)群岛": "🇨🇨|科科斯(基林)群岛", 47 | "🇨🇩 刚果民主共和国": "🇨🇩|刚果民主共和国", 48 | "🇨🇫 中非共和国": "🇨🇫|中非共和国", 49 | "🇨🇬 刚果共和国": "🇨🇬|刚果共和国", 50 | "🇨🇭 瑞士": "🇨🇭|瑞士", 51 | "🇨🇮 象牙海岸": "🇨🇮|象牙海岸", 52 | "🇨🇰 库克群岛": "🇨🇰|库克群岛", 53 | "🇨🇱 智利": "🇨🇱|智利", 54 | "🇨🇲 喀麦隆": "🇨🇲|喀麦隆", 55 | "🇨🇳 中国": "中国|CN|CHINA|🇨🇳", 56 | "🇨🇴 哥伦比亚": "🇨🇴|哥伦比亚", 57 | "🇨🇵 克利珀顿岛": "🇨🇵|克利珀顿岛", 58 | "🇨🇷 哥斯大黎加": "🇨🇷|哥斯大黎加", 59 | "🇨🇺 古巴": "🇨🇺|古巴", 60 | "🇨🇻 维德角": "🇨🇻|维德角", 61 | "🇨🇼 古拉索": "🇨🇼|古拉索", 62 | "🇨🇽 圣诞岛": "🇨🇽|圣诞岛", 63 | "🇨🇾 赛普勒斯": "🇨🇾|赛普勒斯", 64 | "🇨🇿 捷克": "🇨🇿|捷克", 65 | "🇩🇪 德国": "🇩🇪|德国", 66 | "🇩🇬 迪亚哥加西亚岛": "🇩🇬|迪亚哥加西亚岛", 67 | "🇩🇯 吉布地": "🇩🇯|吉布地", 68 | "🇩🇰 丹麦": "🇩🇰|丹麦", 69 | "🇩🇲 多米尼克": "🇩🇲|多米尼克", 70 | "🇩🇴 多明尼加": "🇩🇴|多明尼加", 71 | "🇩🇿 阿尔及利亚": "🇩🇿|阿尔及利亚", 72 | "🇪🇦 休达与梅利利亚": "🇪🇦|休达与梅利利亚", 73 | "🇪🇨 厄瓜多尔": "🇪🇨|厄瓜多尔", 74 | "🇪🇪 爱沙尼亚": "🇪🇪|爱沙尼亚", 75 | "🇪🇬 埃及": "🇪🇬|埃及", 76 | "🇪🇭 西撒哈拉": "🇪🇭|西撒哈拉", 77 | "🇪🇷 厄利垂亚": "🇪🇷|厄利垂亚", 78 | "🇪🇸 西班牙": "🇪🇸|西班牙", 79 | "🇪🇹 衣索比亚": "🇪🇹|衣索比亚", 80 | "🇪🇺 欧洲联盟": "🇪🇺|欧洲联盟", 81 | "🇫🇮 芬兰": "🇫🇮|芬兰", 82 | "🇫🇯 斐济": "🇫🇯|斐济", 83 | "🇫🇰 福克兰群岛": "🇫🇰|福克兰群岛", 84 | "🇫🇲 密克罗尼西亚联邦": "🇫🇲|密克罗尼西亚联邦", 85 | "🇫🇴 法罗群岛": "🇫🇴|法罗群岛", 86 | "🇫🇷 法国": "🇫🇷|法国", 87 | "🇬🇦 加彭": "🇬🇦|加彭", 88 | "🇬🇧 英国": "🇬🇧|英国", 89 | "🇬🇩 格瑞那达": "🇬🇩|格瑞那达", 90 | "🇬🇪 乔治亚": "🇬🇪|乔治亚", 91 | "🇬🇫 法属圭亚那": "🇬🇫|法属圭亚那", 92 | "🇬🇬 根西": "🇬🇬|根西", 93 | "🇬🇭 迦纳": "🇬🇭|迦纳", 94 | "🇬🇮 直布罗陀": "🇬🇮|直布罗陀", 95 | "🇬🇱 格陵兰": "🇬🇱|格陵兰", 96 | "🇬🇲 甘比亚": "🇬🇲|甘比亚", 97 | "🇬🇳 几内亚": "🇬🇳|几内亚", 98 | "🇬🇵 瓜德罗普": "🇬🇵|瓜德罗普", 99 | "🇬🇶 赤道几内亚": "🇬🇶|赤道几内亚", 100 | "🇬🇷 希腊": "🇬🇷|希腊", 101 | "🇬🇸 南乔治亚与南桑威奇": "🇬🇸|南乔治亚与南桑威奇", 102 | "🇬🇹 瓜地马拉": "🇬🇹|瓜地马拉", 103 | "🇬🇺 关岛": "🇬🇺|关岛", 104 | "🇬🇼 几内亚比索": "🇬🇼|几内亚比索", 105 | "🇬🇾 盖亚那": "🇬🇾|盖亚那", 106 | "🇭🇰 香港": "🇭🇰|香港", 107 | "🇭🇲 赫德岛和麦克唐纳群岛": "🇭🇲|赫德岛和麦克唐纳群岛", 108 | "🇭🇳 宏都拉斯": "🇭🇳|宏都拉斯", 109 | "🇭🇷 克罗埃西亚": "🇭🇷|克罗埃西亚", 110 | "🇭🇹 海地": "🇭🇹|海地", 111 | "🇭🇺 匈牙利": "🇭🇺|匈牙利", 112 | "🇮🇨 加那利群岛": "🇮🇨|加那利群岛", 113 | "🇮🇩 印尼": "🇮🇩|印尼", 114 | "🇮🇪 爱尔兰": "🇮🇪|爱尔兰", 115 | "🇮🇱 以色列": "🇮🇱|以色列", 116 | "🇮🇲 曼岛": "🇮🇲|曼岛", 117 | "🇮🇳 印度": "🇮🇳|印度", 118 | "🇮🇴 英属印度洋领地": "🇮🇴|英属印度洋领地", 119 | "🇮🇶 伊拉克": "🇮🇶|伊拉克", 120 | "🇮🇷 伊朗": "🇮🇷|伊朗", 121 | "🇮🇸 冰岛": "🇮🇸|冰岛", 122 | "🇮🇹 意大利": "🇮🇹|意大利", 123 | "🇯🇪 泽西": "🇯🇪|泽西", 124 | "🇯🇲 牙买加": "🇯🇲|牙买加", 125 | "🇯🇴 约旦": "🇯🇴|约旦", 126 | "🇯🇵 日本": "🇯🇵|日本", 127 | "🇰🇪 肯亚": "🇰🇪|肯亚", 128 | "🇰🇬 吉尔吉斯": "🇰🇬|吉尔吉斯", 129 | "🇰🇭 柬埔寨": "🇰🇭|柬埔寨", 130 | "🇰🇮 吉里巴斯": "🇰🇮|吉里巴斯", 131 | "🇰🇲 葛摩": "🇰🇲|葛摩", 132 | "🇰🇳 圣克里斯多福及尼维斯": "🇰🇳|圣克里斯多福及尼维斯", 133 | "🇰🇵 朝鲜": "🇰🇵|朝鲜", 134 | "🇰🇷 韩国": "🇰🇷|韩国", 135 | "🇰🇼 科威特": "🇰🇼|科威特", 136 | "🇰🇾 开曼群岛": "🇰🇾|开曼群岛", 137 | "🇰🇿 哈萨克斯坦": "🇰🇿|哈萨克斯坦", 138 | "🇱🇦 寮国": "🇱🇦|寮国", 139 | "🇱🇧 黎巴嫩": "🇱🇧|黎巴嫩", 140 | "🇱🇨 圣露西亚": "🇱🇨|圣露西亚", 141 | "🇱🇮 列支敦斯登": "🇱🇮|列支敦斯登", 142 | "🇱🇰 斯里兰卡": "🇱🇰|斯里兰卡", 143 | "🇱🇷 赖比瑞亚": "🇱🇷|赖比瑞亚", 144 | "🇱🇸 赖索托": "🇱🇸|赖索托", 145 | "🇱🇹 立陶宛": "🇱🇹|立陶宛", 146 | "🇱🇺 卢森堡": "🇱🇺|卢森堡", 147 | "🇱🇻 拉脱维亚": "🇱🇻|拉脱维亚", 148 | "🇱🇾 利比亚": "🇱🇾|利比亚", 149 | "🇲🇦 摩洛哥": "🇲🇦|摩洛哥", 150 | "🇲🇨 摩纳哥": "🇲🇨|摩纳哥", 151 | "🇲🇩 摩尔多瓦": "🇲🇩|摩尔多瓦", 152 | "🇲🇪 蒙特内哥罗": "🇲🇪|蒙特内哥罗", 153 | "🇲🇫 圣马丁岛": "🇲🇫|圣马丁岛", 154 | "🇲🇬 马达加斯加": "🇲🇬|马达加斯加", 155 | "🇲🇭 马绍尔群岛": "🇲🇭|马绍尔群岛", 156 | "🇲🇰 北马其顿": "🇲🇰|北马其顿", 157 | "🇲🇱 马利": "🇲🇱|马利", 158 | "🇲🇲 缅甸": "🇲🇲|缅甸", 159 | "🇲🇳 蒙古": "🇲🇳|蒙古", 160 | "🇲🇴 澳门": "🇲🇴|澳门", 161 | "🇲🇵 北马利安纳群岛": "🇲🇵|北马利安纳", 162 | "🇲🇶 马丁尼克": "🇲🇶|马丁尼克", 163 | "🇲🇷 茅利塔尼亚": "🇲🇷|茅利塔尼亚", 164 | "🇲🇸 蒙哲腊": "🇲🇸|蒙哲腊", 165 | "🇲🇹 马尔他": "🇲🇹|马尔他", 166 | "🇲🇺 模里西斯": "🇲🇺|模里西斯", 167 | "🇲🇻 马尔地夫": "🇲🇻|马尔地夫", 168 | "🇲🇼 马拉威": "🇲🇼|马拉威", 169 | "🇲🇽 墨西哥": "🇲🇽|墨西哥", 170 | "🇲🇾 马来西亚": "🇲🇾|马来西亚", 171 | "🇲🇿 莫三比克": "🇲🇿|莫三比克", 172 | "🇳🇦 纳米比亚": "🇳🇦|纳米比亚", 173 | "🇳🇨 新喀里多尼亚": "🇳🇨|新喀里多尼亚", 174 | "🇳🇪 尼日尔": "🇳🇪|尼日尔", 175 | "🇳🇫 诺福克岛": "🇳🇫|诺福克岛", 176 | "🇳🇬 奈及利亚": "🇳🇬|奈及利亚", 177 | "🇳🇮 尼加拉瓜": "🇳🇮|尼加拉瓜", 178 | "🇳🇱 荷兰": "🇳🇱|荷兰", 179 | "🇳🇴 挪威": "🇳🇴|挪威", 180 | "🇳🇵 尼泊尔": "🇳🇵|尼泊尔", 181 | "🇳🇷 诺鲁": "🇳🇷|诺鲁", 182 | "🇳🇺 纽埃": "🇳🇺|纽埃", 183 | "🇳🇿 纽西兰": "🇳🇿|纽西兰", 184 | "🇴🇲 阿曼": "🇴🇲|阿曼", 185 | "🇵🇦 巴拿马": "🇵🇦|巴拿马", 186 | "🇵🇪 秘鲁": "🇵🇪|秘鲁", 187 | "🇵🇫 法属玻里尼西亚": "🇵🇫|法属玻里尼西亚", 188 | "🇵🇬 巴布亚纽几内亚": "🇵🇬|巴布亚纽几内亚", 189 | "🇵🇭 菲律宾": "🇵🇭|菲律宾", 190 | "🇵🇰 巴基斯坦": "🇵🇰|巴基斯坦", 191 | "🇵🇱 波兰": "🇵🇱|波兰", 192 | "🇵🇲 圣皮耶与密克隆群岛": "🇵🇲|圣皮耶与密克隆群岛", 193 | "🇵🇳 皮特肯群岛": "🇵🇳|皮特肯群岛", 194 | "🇵🇷 波多黎各": "🇵🇷|波多黎各", 195 | "🇵🇸 巴勒斯坦": "🇵🇸|巴勒斯坦", 196 | "🇵🇹 葡萄牙": "🇵🇹|葡萄牙", 197 | "🇵🇼 帛琉": "🇵🇼|帛琉", 198 | "🇵🇾 巴拉圭": "🇵🇾|巴拉圭", 199 | "🇶🇦 卡达": "🇶🇦|卡达", 200 | "🇷🇪 留尼旺": "🇷🇪|留尼旺", 201 | "🇷🇴 罗马尼亚": "🇷🇴|罗马尼亚", 202 | "🇷🇸 塞尔维亚": "🇷🇸|塞尔维亚", 203 | "🇷🇺 俄罗斯": "🇷🇺|俄罗斯", 204 | "🇷🇼 卢安达": "🇷🇼|卢安达", 205 | "🇸🇦 沙乌地阿拉伯": "🇸🇦|沙乌地阿拉伯", 206 | "🇸🇧 索罗门群岛": "🇸🇧|索罗门群岛", 207 | "🇸🇨 塞席尔": "🇸🇨|塞席尔", 208 | "🇸🇩 苏丹共和国": "🇸🇩|苏丹共和国", 209 | "🇸🇪 瑞典": "🇸🇪|瑞典", 210 | "🇸🇬 新加坡": "🇸🇬|新加坡", 211 | "🇸🇭 圣海伦娜": "🇸🇭|圣海伦娜", 212 | "🇸🇮 斯洛维尼亚": "🇸🇮|斯洛维尼亚", 213 | "🇸🇯 斯瓦巴和扬马延": "🇸🇯|斯瓦巴和扬马延", 214 | "🇸🇰 斯洛伐克": "🇸🇰|斯洛伐克", 215 | "🇸🇱 狮子山": "🇸🇱|狮子山", 216 | "🇸🇲 圣马利诺": "🇸🇲|圣马利诺", 217 | "🇸🇳 塞内加尔": "🇸🇳|塞内加尔", 218 | "🇸🇴 索马利亚": "🇸🇴|索马利亚", 219 | "🇸🇷 苏利南": "🇸🇷|苏利南", 220 | "🇸🇸 南苏丹": "🇸🇸|南苏丹", 221 | "🇸🇹 圣多美普林西比": "🇸🇹|圣多美普林西比", 222 | "🇸🇻 萨尔瓦多": "🇸🇻|萨尔瓦多", 223 | "🇸🇽 荷属圣马丁": "🇸🇽|荷属圣马丁", 224 | "🇸🇾 叙利亚": "🇸🇾|叙利亚", 225 | "🇸🇿 史瓦帝尼": "🇸🇿|史瓦帝尼", 226 | "🇹🇦 崔斯坦达库尼亚": "🇹🇦|崔斯坦达库尼亚", 227 | "🇹🇨 土克凯可群岛": "🇹🇨|土克凯可群岛", 228 | "🇹🇩 查德": "🇹🇩|查德", 229 | "🇹🇫 法属南部领地": "🇹🇫|法属南部领地", 230 | "🇹🇬 多哥": "🇹🇬|多哥", 231 | "🇹🇭 泰国": "🇹🇭|泰国", 232 | "🇹🇯 塔吉克": "🇹🇯|塔吉克", 233 | "🇹🇰 托克劳": "🇹🇰|托克劳", 234 | "🇹🇱 东帝汶": "🇹🇱|东帝汶", 235 | "🇹🇲 土库曼": "🇹🇲|土库曼", 236 | "🇹🇳 突尼西亚": "🇹🇳|突尼西亚", 237 | "🇹🇴 东加": "🇹🇴|东加", 238 | "🇹🇷 土耳其": "🇹🇷|土耳其", 239 | "🇹🇹 千里达及托巴哥": "🇹🇹|千里达及托巴哥", 240 | "🇹🇻 吐瓦鲁": "🇹🇻|吐瓦鲁", 241 | "🇹🇼 台湾": "🇹🇼|台湾", 242 | "🇹🇿 坦尚尼亚": "🇹🇿|坦尚尼亚", 243 | "🇺🇦 乌克兰": "🇺🇦|乌克兰", 244 | "🇺🇬 乌干达": "🇺🇬|乌干达", 245 | "🇺🇲 美国本土外小岛屿": "🇺🇲|美国本土外小岛屿", 246 | "🇺🇳 联合国": "🇺🇳|联合国", 247 | "🇺🇸 美国": "🇺🇸|美国|USA|us", 248 | "🇺🇾 乌拉圭": "🇺🇾|乌拉圭", 249 | "🇺🇿 乌兹别克": "🇺🇿|乌兹别克", 250 | "🇻🇦 梵蒂冈": "🇻🇦|梵蒂冈", 251 | "🇻🇨 圣文森及格瑞那丁": "🇻🇨|圣文森及格瑞那丁", 252 | "🇻🇪 委内瑞拉": "🇻🇪|委内瑞拉", 253 | "🇻🇬 英属维京群岛": "🇻🇬|英属维京群岛", 254 | "🇻🇮 美属维京群岛": "🇻🇮|美属维京群岛", 255 | "🇻🇳 越南": "🇻🇳|越南", 256 | "🇻🇺 万那杜": "🇻🇺|万那杜", 257 | "🇼🇫 瓦利斯和富图纳": "🇼🇫|瓦利斯和富图纳", 258 | "🇼🇸 萨摩亚": "🇼🇸|萨摩亚", 259 | "🇽🇰 科索沃": "🇽🇰|科索沃", 260 | "🇾🇪 叶门": "🇾🇪|叶门", 261 | "🇾🇹 马约特": "🇾🇹|马约特", 262 | "🇿🇦 南非": "🇿🇦|南非", 263 | "🇿🇲 尚比亚": "🇿🇲|尚比亚", 264 | '🇺🇳 其他': '/\s/\S|' 265 | } 266 | -------------------------------------------------------------------------------- /src/lib/formateName.js: -------------------------------------------------------------------------------- 1 | import { flagMap } from './flagMap.js'; 2 | export function formateName(proxies) { 3 | let nameMap = new Map(); 4 | for (const proxie of proxies) { 5 | for (const key in flagMap) { 6 | let reg = new RegExp(flagMap[key]); 7 | if (reg.test(proxie.name)) { 8 | nameMap.set(key, nameMap.get(key) + 1 || 1) 9 | proxie.name = `${key} ${nameMap.get(key)}` 10 | break; 11 | } 12 | } 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /src/lib/fsYaml.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import YAML from 'yaml' 3 | 4 | export function readNodes(dirPath = 'src/nodes/') { 5 | try { 6 | const files = fs.readdirSync(dirPath) 7 | const proxies = []; 8 | const proxiesSet = new Set(); 9 | files.forEach(file => { 10 | let clashConfig = readYaml(dirPath + file) 11 | if (!clashConfig || !clashConfig.proxies) { return } 12 | let clashNodes = clashConfig.proxies; 13 | for (const clashNode of clashNodes) { 14 | let vpnID = `${clashNode.server}:${clashNode.port}` 15 | if (proxiesSet.has(proxiesSet.has(vpnID))) { 16 | continue; 17 | } 18 | proxiesSet.add(vpnID); 19 | proxies.push(clashNode) 20 | } 21 | } 22 | ) 23 | return proxies; 24 | } catch (error) { 25 | console.log(error) 26 | } 27 | } 28 | 29 | export function writeNode(bolb, path = './clash-node.yaml', templatePath = 'src/config/template.yaml') { 30 | try { 31 | let template = YAML.parse(fs.readFileSync(templatePath, 'utf-8')); 32 | template.proxies = bolb; 33 | template['proxy-groups'][0].proxies = bolb.map(item => item.name).sort() 34 | fs.writeFileSync(path, YAML.stringify(template)); 35 | } catch (error) { 36 | console.log(error); 37 | } 38 | } 39 | 40 | export function readYaml(path) { 41 | return YAML.parse(fs.readFileSync(path, 'utf-8')); 42 | } -------------------------------------------------------------------------------- /src/pipe/delayNode.js: -------------------------------------------------------------------------------- 1 | import { Observable } from 'rxjs'; 2 | export function delayNode() { 3 | return (observable) => 4 | new Observable((subscriber) => { 5 | const subscription = observable.subscribe({ 6 | next(value) { 7 | let proxies = value.response.proxies 8 | let nodeList = [] 9 | for (const key in proxies) { 10 | let item = proxies[key] 11 | if (item.history.length > 0) { 12 | if (item.history.every(node => node.delay > 0 && node.delay < 1500)) { 13 | nodeList.push(item.name) 14 | } 15 | } 16 | } 17 | subscriber.next(nodeList); 18 | }, 19 | error(err) { 20 | subscriber.error(err); 21 | }, 22 | }); 23 | return () => { 24 | subscription.unsubscribe(); 25 | }; 26 | }); 27 | } 28 | --------------------------------------------------------------------------------