规则更新
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
proxy_name: 🇯🇵AWS日本01 | 电信移动联通推荐
|
||||
username: n0012
|
||||
mixed_port: 7897
|
||||
public_ip: 103.62.49.138
|
||||
public_ipv4: 103.62.49.138
|
||||
expired_public_ipv4: 103.62.49.138
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:17Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:08Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.162
|
||||
public_ipv4: 103.62.49.162
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:22Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:09Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.170
|
||||
public_ipv4: 103.62.49.170
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:23Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:10Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.178
|
||||
public_ipv4: 103.62.49.178
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:23Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:10Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.154
|
||||
public_ipv4: 103.62.49.154
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:24Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:11Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.154
|
||||
public_ipv4: 103.62.49.154
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:25Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:12Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.178
|
||||
public_ipv4: 103.62.49.178
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:25Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:12Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.170
|
||||
public_ipv4: 103.62.49.170
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:26Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:13Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.162
|
||||
public_ipv4: 103.62.49.162
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:27Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:14Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,8 +3,8 @@ username: n0021
|
||||
mixed_port: 7897
|
||||
public_ip: 103.62.49.138
|
||||
public_ipv4: 103.62.49.138
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:27Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:14Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.138
|
||||
public_ipv4: 103.62.49.138
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:10:58Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:46:52Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.162
|
||||
public_ipv4: 103.62.49.162
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:00Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:46:53Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.170
|
||||
public_ipv4: 103.62.49.170
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:01Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:46:55Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.178
|
||||
public_ipv4: 103.62.49.178
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:03Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:46:56Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.154
|
||||
public_ipv4: 103.62.49.154
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:05Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:46:58Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.162
|
||||
public_ipv4: 103.62.49.162
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:06Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:46:59Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.170
|
||||
public_ipv4: 103.62.49.170
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:08Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:01Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.178
|
||||
public_ipv4: 103.62.49.178
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:10Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:02Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 103.62.49.154
|
||||
public_ipv4: 103.62.49.154
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:11Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:03Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.146
|
||||
public_ipv4: 67.159.48.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:38Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:23Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.147
|
||||
public_ipv4: 67.159.48.147
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:39Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:24Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.148
|
||||
public_ipv4: 67.159.48.148
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:39Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:26Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.149
|
||||
public_ipv4: 67.159.48.149
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:40Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:26Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.150
|
||||
public_ipv4: 67.159.48.150
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:41Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:31Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.146
|
||||
public_ipv4: 67.159.48.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:51Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:34Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 203.27.106.146
|
||||
public_ipv4: 203.27.106.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:13Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:05Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.146
|
||||
public_ipv4: 67.159.48.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:28Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:15Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 203.27.106.146
|
||||
public_ipv4: 203.27.106.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:15Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:07Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.147
|
||||
public_ipv4: 67.159.48.147
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:30Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:17Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.148
|
||||
public_ipv4: 67.159.48.148
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:32Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:18Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.149
|
||||
public_ipv4: 67.159.48.149
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:34Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:20Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.150
|
||||
public_ipv4: 67.159.48.150
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:36Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:22Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 67.159.48.146
|
||||
public_ipv4: 67.159.48.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:52Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:35Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 203.27.106.146
|
||||
public_ipv4: 203.27.106.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:54Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:36Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 203.27.106.146
|
||||
public_ipv4: 203.27.106.146
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:00Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:42Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 146.235.17.47
|
||||
public_ipv4: 146.235.17.47
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:03Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:45Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,10 @@
|
||||
proxy_name: 🇹🇼台湾 | 避免晚高峰使用
|
||||
username: n0054
|
||||
mixed_port: 7897
|
||||
public_ip: 114.37.199.26
|
||||
public_ipv4: 114.37.199.26
|
||||
public_ip: 114.37.200.234
|
||||
public_ipv4: 114.37.200.234
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:19Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:01Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,10 @@
|
||||
proxy_name: 🇹🇼台湾2 | 避免晚高峰使用
|
||||
username: n0055
|
||||
mixed_port: 7897
|
||||
public_ip: 111.249.67.172
|
||||
public_ipv4: 111.249.67.172
|
||||
public_ip: 36.230.63.84
|
||||
public_ipv4: 36.230.63.84
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:23Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:00Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,10 @@
|
||||
proxy_name: 🇹🇼台湾3 | 避免晚高峰使用
|
||||
username: n0056
|
||||
mixed_port: 7897
|
||||
public_ip: 36.231.97.241
|
||||
public_ipv4: 36.231.97.241
|
||||
public_ip: 36.231.109.102
|
||||
public_ipv4: 36.231.109.102
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:24Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:08Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 108.181.24.43
|
||||
public_ipv4: 108.181.24.43
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:26Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:14Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0032
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.193
|
||||
public_ipv4: 134.195.101.193
|
||||
public_ipv6: 2602:feda:f39b:2aa8:712f:fa9f:8b1e:e57
|
||||
cached_at_utc: 2026-07-21T02:23:01Z
|
||||
public_ipv6: 2602:feda:f398:aea:e567:188a:f89d:cc2b
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:41Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:11:42Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 108.181.23.235
|
||||
public_ipv4: 108.181.23.235
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:28Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:15Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0033
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.194
|
||||
public_ipv4: 134.195.101.194
|
||||
public_ipv6: 2602:feda:f39d:e4d5:f1e3:102e:a77b:2349
|
||||
cached_at_utc: 2026-07-21T02:23:01Z
|
||||
public_ipv6: 2602:feda:f391:4542:c3c6:7f3b:43fe:75b8
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:43Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:11:43Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 208.87.242.97
|
||||
public_ipv4: 208.87.242.97
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:29Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:16Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0034
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.195
|
||||
public_ipv4: 134.195.101.195
|
||||
public_ipv6: 2602:feda:f395:fc3c:5df5:b392:c36a:8cf7
|
||||
cached_at_utc: 2026-07-21T02:23:01Z
|
||||
public_ipv6: 2602:feda:f397:1ffa:3657:170b:ab41:bf28
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:44Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:11:44Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 108.181.24.47
|
||||
public_ipv4: 108.181.24.47
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:30Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:17Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0035
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.197
|
||||
public_ipv4: 134.195.101.197
|
||||
public_ipv6: 2602:feda:f39a:d2a8:39e5:647a:b949:cd64
|
||||
cached_at_utc: 2026-07-21T02:23:03Z
|
||||
public_ipv6: 2602:feda:f39c:3f65:a52e:ed9f:4b8f:f251
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:45Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:11:45Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 108.181.24.41
|
||||
public_ipv4: 108.181.24.41
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:32Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:18Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0036
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.120
|
||||
public_ipv4: 134.195.101.120
|
||||
public_ipv6: 2602:feda:f399:3482:1ef5:da10:a002:cf58
|
||||
cached_at_utc: 2026-07-21T02:23:03Z
|
||||
public_ipv6: 2602:feda:f39b:e6ac:b937:4b:bad7:ffba
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:46Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:11:47Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0037
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.180
|
||||
public_ipv4: 134.195.101.180
|
||||
public_ipv6: 2602:feda:f398:da05:369a:e728:e327:2914
|
||||
cached_at_utc: 2026-07-21T02:23:04Z
|
||||
public_ipv6: 2602:feda:f39a:6185:a814:b010:5a7:bfd0
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:47Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:11:48Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0038
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.188
|
||||
public_ipv4: 134.195.101.188
|
||||
public_ipv6: 2602:feda:f390:c2ea:d430:7bd5:7a06:a439
|
||||
cached_at_utc: 2026-07-21T02:23:04Z
|
||||
public_ipv6: 2602:feda:f390:eb17:1618:a833:95e7:33f9
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:48Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:11:49Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 203.10.96.139
|
||||
public_ipv4: 203.10.96.139
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:11:50Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:34Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0062
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.193
|
||||
public_ipv4: 134.195.101.193
|
||||
public_ipv6: 2602:feda:f393:5162:25fc:91f:700e:4f1a
|
||||
cached_at_utc: 2026-07-21T02:24:03Z
|
||||
public_ipv6: 2602:feda:f39a:199:60fe:a88a:2864:ba13
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:33Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:34Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,11 @@
|
||||
proxy_name: 🇺🇸美国圣何塞01-0.1倍
|
||||
username: n0046
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.193
|
||||
public_ipv4: 134.195.101.193
|
||||
public_ipv6: 2602:feda:f392:d804:1396:1c34:2b3b:5b9a
|
||||
cached_at_utc: 2026-07-21T02:23:23Z
|
||||
expired_public_ipv4: 134.195.101.193
|
||||
expired_public_ipv6: 2602:feda:f392:d804:1396:1c34:2b3b:5b9a
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:04Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:12:09Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0063
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.194
|
||||
public_ipv4: 134.195.101.194
|
||||
public_ipv6: 2602:feda:f399:2c38:e3d3:d70c:33c9:21b3
|
||||
cached_at_utc: 2026-07-21T02:24:04Z
|
||||
public_ipv6: 2602:feda:f39f:c9a8:a110:3162:a48b:1f5a
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:34Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:35Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,11 @@
|
||||
proxy_name: 🇺🇸美国圣何塞02-0.1倍
|
||||
username: n0047
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.194
|
||||
public_ipv4: 134.195.101.194
|
||||
public_ipv6: 2602:feda:f399:83a4:5723:c2e1:d589:a253
|
||||
cached_at_utc: 2026-07-21T02:23:25Z
|
||||
expired_public_ipv4: 134.195.101.194
|
||||
expired_public_ipv6: 2602:feda:f399:83a4:5723:c2e1:d589:a253
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:14Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:12:19Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0064
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.195
|
||||
public_ipv4: 134.195.101.195
|
||||
public_ipv6: 2602:feda:f39a:13e5:d88e:29e8:5379:7486
|
||||
cached_at_utc: 2026-07-21T02:24:04Z
|
||||
public_ipv6: 2602:feda:f39b:cd95:6db2:d330:12ee:b024
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:36Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:37Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,11 @@
|
||||
proxy_name: 🇺🇸美国圣何塞03-0.1倍
|
||||
username: n0048
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.195
|
||||
public_ipv4: 134.195.101.195
|
||||
public_ipv6: 2602:feda:f39b:4401:de6f:8516:17c8:b20e
|
||||
cached_at_utc: 2026-07-21T02:23:28Z
|
||||
expired_public_ipv4: 134.195.101.195
|
||||
expired_public_ipv6: 2602:feda:f39b:4401:de6f:8516:17c8:b20e
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:24Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:12:29Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0065
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.197
|
||||
public_ipv4: 134.195.101.197
|
||||
public_ipv6: 2602:feda:f39a:c712:e32:2b7:76eb:3172
|
||||
cached_at_utc: 2026-07-21T02:24:05Z
|
||||
public_ipv6: 2602:feda:f392:f752:beab:7616:d5c:b6ca
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:38Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:39Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,11 @@
|
||||
proxy_name: 🇺🇸美国圣何塞04-0.1倍
|
||||
username: n0049
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.197
|
||||
public_ipv4: 134.195.101.197
|
||||
public_ipv6: 2602:feda:f397:99de:8796:ee83:4afd:ee69
|
||||
cached_at_utc: 2026-07-21T02:23:30Z
|
||||
expired_public_ipv4: 134.195.101.197
|
||||
expired_public_ipv6: 2602:feda:f397:99de:8796:ee83:4afd:ee69
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:34Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:12:39Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0066
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.120
|
||||
public_ipv4: 134.195.101.120
|
||||
public_ipv6: 2602:feda:f393:cb92:828b:312d:85e0:d1e5
|
||||
cached_at_utc: 2026-07-21T02:24:10Z
|
||||
public_ipv6: 2602:feda:f399:e96a:3378:5d7c:594f:aed8
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:39Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:40Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,11 @@
|
||||
proxy_name: 🇺🇸美国圣何塞05-0.1倍
|
||||
username: n0050
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.120
|
||||
public_ipv4: 134.195.101.120
|
||||
public_ipv6: 2602:feda:f392:c639:102e:dc8b:f841:144e
|
||||
cached_at_utc: 2026-07-21T02:23:32Z
|
||||
expired_public_ipv4: 134.195.101.120
|
||||
expired_public_ipv6: 2602:feda:f392:c639:102e:dc8b:f841:144e
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:44Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:12:49Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0067
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.180
|
||||
public_ipv4: 134.195.101.180
|
||||
public_ipv6: 2602:feda:f39d:dc3c:3361:70b2:1845:239d
|
||||
cached_at_utc: 2026-07-21T02:24:11Z
|
||||
public_ipv6: 2602:feda:f39b:d15a:2646:ce85:cad3:bd1e
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:41Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:42Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,11 @@
|
||||
proxy_name: 🇺🇸美国圣何塞06-0.1倍
|
||||
username: n0051
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.180
|
||||
public_ipv4: 134.195.101.180
|
||||
public_ipv6: 2602:feda:f398:ada:918f:3637:21ac:2f99
|
||||
cached_at_utc: 2026-07-21T02:23:34Z
|
||||
expired_public_ipv4: 134.195.101.180
|
||||
expired_public_ipv6: 2602:feda:f398:ada:918f:3637:21ac:2f99
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:12:54Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:12:59Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -3,7 +3,8 @@ username: n0068
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.188
|
||||
public_ipv4: 134.195.101.188
|
||||
public_ipv6: 2602:feda:f396:24f5:6a11:a635:1005:a67b
|
||||
cached_at_utc: 2026-07-21T02:24:12Z
|
||||
public_ipv6: 2602:feda:f398:49e7:adf2:ebe3:7e4f:36e6
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:43Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:44Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,11 @@
|
||||
proxy_name: 🇺🇸美国圣何塞07-0.1倍
|
||||
username: n0052
|
||||
mixed_port: 7897
|
||||
public_ip: 134.195.101.188
|
||||
public_ipv4: 134.195.101.188
|
||||
public_ipv6: 2602:feda:f391:9ff:bb3:3469:73be:8c00
|
||||
cached_at_utc: 2026-07-21T02:23:38Z
|
||||
expired_public_ipv4: 134.195.101.188
|
||||
expired_public_ipv6: 2602:feda:f391:9ff:bb3:3469:73be:8c00
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:04Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T02:13:09Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,6 +4,7 @@ mixed_port: 7897
|
||||
public_ip: 203.10.96.139
|
||||
public_ipv4: 203.10.96.139
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:45Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:48:19Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -1,9 +1,10 @@
|
||||
proxy_name: 🇺🇸美国洛杉矶08-0.1倍
|
||||
username: n0053
|
||||
mixed_port: 7897
|
||||
public_ip: 203.10.96.139
|
||||
public_ipv4: 203.10.96.139
|
||||
expired_public_ipv4: 203.10.96.139
|
||||
public_ipv4_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv6_error: ipify 请求失败:SSL connection failed
|
||||
public_ipv4_cached_at_utc: 2026-08-12T02:13:14Z
|
||||
public_ipv6_cached_at_utc: 2026-08-12T01:47:55Z
|
||||
ipv4_source: https://api4.ipify.org/?format=json
|
||||
ipv6_source: https://api6.ipify.org/?format=json
|
||||
@@ -4,10 +4,12 @@
|
||||
#include "Proxy_Ping0_Labeler.h"
|
||||
#include "Async_Blocking.h"
|
||||
#include "Ping0_Html_Parser.h"
|
||||
#include "config.h"
|
||||
#include "export.h"
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <chrono>
|
||||
#include <ctime>
|
||||
#include <filesystem>
|
||||
#include <format>
|
||||
#include <fstream>
|
||||
@@ -40,14 +42,12 @@ struct Node_Route {
|
||||
struct Public_Ip_Cache {
|
||||
std::optional<std::string> ipv4;
|
||||
std::optional<std::string> ipv6;
|
||||
std::optional<std::string> expired_ipv4;
|
||||
std::optional<std::string> expired_ipv6;
|
||||
std::optional<std::string> ipv4_error;
|
||||
std::optional<std::string> ipv6_error;
|
||||
bool has_ipv4_state() const {
|
||||
return ipv4.has_value() || ipv4_error.has_value();
|
||||
}
|
||||
bool has_ipv6_state() const {
|
||||
return ipv6.has_value() || ipv6_error.has_value();
|
||||
}
|
||||
std::optional<std::chrono::system_clock::time_point> ipv4_cached_at_utc;
|
||||
std::optional<std::chrono::system_clock::time_point> ipv6_cached_at_utc;
|
||||
};
|
||||
struct Node_Ping0_Result {
|
||||
std::string name;
|
||||
@@ -75,8 +75,7 @@ std::string trim_ascii(std::string value) {
|
||||
const auto last = value.find_last_not_of(" \t\r\n");
|
||||
return value.substr(first, last - first + 1);
|
||||
}
|
||||
std::string make_utc_time() {
|
||||
const auto now = std::chrono::system_clock::now();
|
||||
std::string make_utc_time(std::chrono::system_clock::time_point now) {
|
||||
const auto value = std::chrono::system_clock::to_time_t(now);
|
||||
std::tm utc{};
|
||||
#ifdef _WIN32
|
||||
@@ -86,6 +85,59 @@ std::string make_utc_time() {
|
||||
#endif
|
||||
return std::format("{:04}-{:02}-{:02}T{:02}:{:02}:{:02}Z", utc.tm_year + 1900, utc.tm_mon + 1, utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec);
|
||||
}
|
||||
std::string make_utc_time() {
|
||||
return make_utc_time(std::chrono::system_clock::now());
|
||||
}
|
||||
std::optional<int> parse_fixed_uint(std::string_view text, size_t offset, size_t size) {
|
||||
int result = 0;
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
const auto ch = static_cast<unsigned char>(text[offset + i]);
|
||||
if (ch < '0' || ch > '9') {
|
||||
return std::nullopt;
|
||||
}
|
||||
result = result * 10 + ch - '0';
|
||||
}
|
||||
return result;
|
||||
}
|
||||
std::optional<std::chrono::system_clock::time_point> parse_utc_time(std::string_view text) {
|
||||
if (text.size() != 20 || text[4] != '-' || text[7] != '-' || text[10] != 'T' || text[13] != ':' || text[16] != ':' || text[19] != 'Z') {
|
||||
return std::nullopt;
|
||||
}
|
||||
const auto year = parse_fixed_uint(text, 0, 4);
|
||||
const auto month = parse_fixed_uint(text, 5, 2);
|
||||
const auto day = parse_fixed_uint(text, 8, 2);
|
||||
const auto hour = parse_fixed_uint(text, 11, 2);
|
||||
const auto minute = parse_fixed_uint(text, 14, 2);
|
||||
const auto second = parse_fixed_uint(text, 17, 2);
|
||||
if (!year || !month || !day || !hour || !minute || !second || *hour > 23 || *minute > 59 || *second > 59) {
|
||||
return std::nullopt;
|
||||
}
|
||||
std::tm utc{};
|
||||
utc.tm_year = *year - 1900;
|
||||
utc.tm_mon = *month - 1;
|
||||
utc.tm_mday = *day;
|
||||
utc.tm_hour = *hour;
|
||||
utc.tm_min = *minute;
|
||||
utc.tm_sec = *second;
|
||||
#ifdef _WIN32
|
||||
const auto value = _mkgmtime(&utc);
|
||||
#else
|
||||
const auto value = timegm(&utc);
|
||||
#endif
|
||||
if (value == static_cast<std::time_t>(-1)) {
|
||||
return std::nullopt;
|
||||
}
|
||||
std::tm checked{};
|
||||
#ifdef _WIN32
|
||||
gmtime_s(&checked, &value);
|
||||
#else
|
||||
gmtime_r(&value, &checked);
|
||||
#endif
|
||||
if (checked.tm_year != utc.tm_year || checked.tm_mon != utc.tm_mon || checked.tm_mday != utc.tm_mday || checked.tm_hour != utc.tm_hour || checked.tm_min != utc.tm_min || checked.tm_sec != utc.tm_sec) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return std::chrono::system_clock::from_time_t(value);
|
||||
}
|
||||
std::string make_safe_file_name(std::string_view name) {
|
||||
std::string result;
|
||||
result.reserve(name.size());
|
||||
@@ -204,8 +256,16 @@ Public_Ip_Cache load_cached_public_ips(const fs::path& path) {
|
||||
result.ipv4 = read_optional_string(cache, "public_ip");
|
||||
}
|
||||
result.ipv6 = read_optional_string(cache, "public_ipv6");
|
||||
result.expired_ipv4 = read_optional_string(cache, "expired_public_ipv4");
|
||||
result.expired_ipv6 = read_optional_string(cache, "expired_public_ipv6");
|
||||
result.ipv4_error = read_optional_string(cache, "public_ipv4_error");
|
||||
result.ipv6_error = read_optional_string(cache, "public_ipv6_error");
|
||||
if (const auto cached_at = read_optional_string(cache, "public_ipv4_cached_at_utc")) {
|
||||
result.ipv4_cached_at_utc = parse_utc_time(*cached_at);
|
||||
}
|
||||
if (const auto cached_at = read_optional_string(cache, "public_ipv6_cached_at_utc")) {
|
||||
result.ipv6_cached_at_utc = parse_utc_time(*cached_at);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
std::string query_public_ip_by_user(std::string_view username, uint16_t mixed_port, std::string_view host) {
|
||||
@@ -243,13 +303,24 @@ void save_public_ip_cache(const fs::path& path, const Node_Route& route, const P
|
||||
if (cache.ipv6) {
|
||||
node["public_ipv6"] = *cache.ipv6;
|
||||
}
|
||||
if (cache.expired_ipv4) {
|
||||
node["expired_public_ipv4"] = *cache.expired_ipv4;
|
||||
}
|
||||
if (cache.expired_ipv6) {
|
||||
node["expired_public_ipv6"] = *cache.expired_ipv6;
|
||||
}
|
||||
if (cache.ipv4_error) {
|
||||
node["public_ipv4_error"] = *cache.ipv4_error;
|
||||
}
|
||||
if (cache.ipv6_error) {
|
||||
node["public_ipv6_error"] = *cache.ipv6_error;
|
||||
}
|
||||
node["cached_at_utc"] = make_utc_time();
|
||||
if (cache.ipv4_cached_at_utc) {
|
||||
node["public_ipv4_cached_at_utc"] = make_utc_time(*cache.ipv4_cached_at_utc);
|
||||
}
|
||||
if (cache.ipv6_cached_at_utc) {
|
||||
node["public_ipv6_cached_at_utc"] = make_utc_time(*cache.ipv6_cached_at_utc);
|
||||
}
|
||||
node["ipv4_source"] = source_url(ipv4_query_url_host);
|
||||
node["ipv6_source"] = source_url(ipv6_query_url_host);
|
||||
YAML::Emitter emitter;
|
||||
@@ -260,30 +331,65 @@ void save_public_ip_cache(const fs::path& path, const Node_Route& route, const P
|
||||
}
|
||||
write_file_atomic(path, std::string_view(emitter.c_str(), emitter.size()));
|
||||
}
|
||||
bool public_ip_cache_expired(const std::optional<std::chrono::system_clock::time_point>& cached_at_utc, int ttl_seconds) {
|
||||
if (ttl_seconds <= 0) {
|
||||
return false;
|
||||
}
|
||||
if (!cached_at_utc) {
|
||||
return true;
|
||||
}
|
||||
return std::chrono::system_clock::now() - *cached_at_utc >= std::chrono::seconds(ttl_seconds);
|
||||
}
|
||||
void refresh_public_ipv4(Public_Ip_Cache& cache, std::string_view username, uint16_t mixed_port) {
|
||||
const auto old_ipv4 = cache.ipv4 ? cache.ipv4 : cache.expired_ipv4;
|
||||
cache.ipv4.reset();
|
||||
cache.ipv4_error.reset();
|
||||
cache.ipv4_cached_at_utc = std::chrono::system_clock::now();
|
||||
try {
|
||||
cache.ipv4 = query_public_ip_by_user(username, mixed_port, ipv4_query_url_host);
|
||||
cache.expired_ipv4.reset();
|
||||
}
|
||||
catch (const std::exception& error) {
|
||||
cache.expired_ipv4 = old_ipv4;
|
||||
cache.ipv4_error = error_text_to_utf8(error.what());
|
||||
}
|
||||
}
|
||||
void refresh_public_ipv6(Public_Ip_Cache& cache, std::string_view username, uint16_t mixed_port) {
|
||||
const auto old_ipv6 = cache.ipv6 ? cache.ipv6 : cache.expired_ipv6;
|
||||
cache.ipv6.reset();
|
||||
cache.ipv6_error.reset();
|
||||
cache.ipv6_cached_at_utc = std::chrono::system_clock::now();
|
||||
try {
|
||||
cache.ipv6 = query_public_ip_by_user(username, mixed_port, ipv6_query_url_host);
|
||||
cache.expired_ipv6.reset();
|
||||
}
|
||||
catch (const std::exception& error) {
|
||||
cache.expired_ipv6 = old_ipv6;
|
||||
cache.ipv6_error = error_text_to_utf8(error.what());
|
||||
}
|
||||
}
|
||||
std::optional<std::string> usable_ipv4(const Public_Ip_Cache& cache) {
|
||||
return cache.ipv4 ? cache.ipv4 : cache.expired_ipv4;
|
||||
}
|
||||
std::optional<std::string> usable_ipv6(const Public_Ip_Cache& cache) {
|
||||
return cache.ipv6 ? cache.ipv6 : cache.expired_ipv6;
|
||||
}
|
||||
Public_Ip_Cache get_public_ips(const Node_Route& route, const fs::path& cache_dir, std::optional<uint16_t> mixed_port) {
|
||||
const auto cache_path = make_ip_cache_path(cache_dir, route.proxy_name);
|
||||
std::lock_guard lock(public_ip_cache_lock(cache_path));
|
||||
auto cache = load_cached_public_ips(cache_path);
|
||||
Public_Ip_Cache cache = load_cached_public_ips(cache_path);
|
||||
const bool ipv4_expired = public_ip_cache_expired(cache.ipv4_cached_at_utc, public_ipv4_cache_ttl_seconds);
|
||||
const bool ipv6_expired = public_ip_cache_expired(cache.ipv6_cached_at_utc, public_ipv6_cache_ttl_seconds);
|
||||
bool changed = false;
|
||||
if (!mixed_port) {
|
||||
return cache;
|
||||
}
|
||||
if (!cache.has_ipv4_state()) {
|
||||
try {
|
||||
cache.ipv4 = query_public_ip_by_user(route.username, *mixed_port, ipv4_query_url_host);
|
||||
}
|
||||
catch (const std::exception& error) {
|
||||
cache.ipv4_error = error_text_to_utf8(error.what());
|
||||
}
|
||||
if (radical_ipv4 ? ipv4_expired : ipv4_expired && !cache.ipv4.has_value()) {
|
||||
refresh_public_ipv4(cache, route.username, *mixed_port);
|
||||
changed = true;
|
||||
}
|
||||
if (!cache.has_ipv6_state()) {
|
||||
try {
|
||||
cache.ipv6 = query_public_ip_by_user(route.username, *mixed_port, ipv6_query_url_host);
|
||||
}
|
||||
catch (const std::exception& error) {
|
||||
cache.ipv6_error = error_text_to_utf8(error.what());
|
||||
}
|
||||
if (radical_ipv6 ? ipv6_expired : ipv6_expired && !cache.ipv6.has_value()) {
|
||||
refresh_public_ipv6(cache, route.username, *mixed_port);
|
||||
changed = true;
|
||||
}
|
||||
if (changed) {
|
||||
@@ -404,7 +510,6 @@ std::string make_proxy_name_suffix(const Node_Ping0_Result& result) {
|
||||
if (result.public_ipv6) {
|
||||
parts.push_back("_" + compact_ip_text(*result.public_ipv6));
|
||||
}
|
||||
|
||||
std::string suffix;
|
||||
for (const auto& part : parts) {
|
||||
if (!part.empty()) {
|
||||
@@ -433,17 +538,18 @@ void print_ping0_info(const Node_Route& route, const Node_Ping0_Result& result)
|
||||
}
|
||||
std::optional<Node_Ping0_Result> load_node_ping0_result(const Node_Route& route, const fs::path& ip_cache_dir, const fs::path& html_cache_dir, std::optional<uint16_t> mixed_port) {
|
||||
const auto public_ips = get_public_ips(route, ip_cache_dir, mixed_port);
|
||||
if (!public_ips.ipv4) {
|
||||
const auto public_ipv4 = usable_ipv4(public_ips);
|
||||
if (!public_ipv4) {
|
||||
std::cerr << std::format("Ping0 标注跳过:节点 {} 没有 IPv4 出口缓存\n", route.proxy_name);
|
||||
return std::nullopt;
|
||||
}
|
||||
const auto html_path = find_ping0_html_path(html_cache_dir, *public_ips.ipv4);
|
||||
const auto html_path = find_ping0_html_path(html_cache_dir, *public_ipv4);
|
||||
if (!html_path) {
|
||||
std::cerr << std::format("【注意添加缓存数据】================================ Ping0 HTML 缓存不存在,节点 {},出口 IPv4 {},目录 {}\n", route.proxy_name, *public_ips.ipv4, path_to_utf8(html_cache_dir));
|
||||
std::cerr << std::format("【注意添加缓存数据】================================ Ping0 HTML 缓存不存在,节点 {},出口 IPv4 {},目录 {}\n", route.proxy_name, *public_ipv4, path_to_utf8(html_cache_dir));
|
||||
return std::nullopt;
|
||||
}
|
||||
auto info = Ping0::parse_file(*html_path);
|
||||
return Node_Ping0_Result{route.proxy_name, *public_ips.ipv4, public_ips.ipv6, make_ip_cache_path(ip_cache_dir, route.proxy_name), *html_path, std::move(info), route.index, std::nullopt};
|
||||
return Node_Ping0_Result{route.proxy_name, *public_ipv4, usable_ipv6(public_ips), make_ip_cache_path(ip_cache_dir, route.proxy_name), *html_path, std::move(info), route.index, std::nullopt};
|
||||
}
|
||||
void record_ai_node_info(Node_Ping0_Result result, const fs::path& node_state_dir) {
|
||||
const auto ai_score = ai_scene_score(result.info);
|
||||
@@ -459,13 +565,13 @@ struct Node_Ping0_Task_Result {
|
||||
std::string error;
|
||||
};
|
||||
asio::awaitable<void> load_node_ping0_result_task(asio::thread_pool& pool,
|
||||
std::vector<Node_Ping0_Task_Result>& results,
|
||||
size_t index,
|
||||
fs::path ip_cache_dir,
|
||||
fs::path html_cache_dir,
|
||||
std::optional<uint16_t> mixed_port,
|
||||
std::shared_ptr<size_t> pending,
|
||||
asio::steady_timer& signal) {
|
||||
std::vector<Node_Ping0_Task_Result>& results,
|
||||
size_t index,
|
||||
fs::path ip_cache_dir,
|
||||
fs::path html_cache_dir,
|
||||
std::optional<uint16_t> mixed_port,
|
||||
std::shared_ptr<size_t> pending,
|
||||
asio::steady_timer& signal) {
|
||||
try {
|
||||
const auto route = results[index].route;
|
||||
results[index].result = co_await WyC::async_blocking(pool, [route, ip_cache_dir, html_cache_dir, mixed_port] {
|
||||
@@ -501,7 +607,7 @@ asio::awaitable<void> append_ping0_info_to_proxy_names_async(YAML::Node& proxies
|
||||
auto pending = std::make_shared<size_t>(routes.size());
|
||||
auto executor = co_await asio::this_coro::executor;
|
||||
asio::steady_timer signal(executor);
|
||||
std::cout << std::format("Ping0 标注需要处理 {} 个节点,使用 {} 个 Asio 池线程\n", routes.size(), thread_count);
|
||||
std::cout << std::format("Ping0 标注需要处理 {} 个节点,使用 {} 个 Asio 池线程,IPv4 缓存 TTL {} 秒,IPv4 过期{},IPv6 缓存 TTL {} 秒,IPv6 过期{}\n", routes.size(), thread_count, public_ipv4_cache_ttl_seconds, radical_ipv4 ? "重新请求" : "仅缺失时请求", public_ipv6_cache_ttl_seconds, radical_ipv6 ? "重新请求" : "仅缺失时请求");
|
||||
for (size_t i = 0; i < routes.size(); ++i) {
|
||||
asio::co_spawn(executor, load_node_ping0_result_task(pool, results, i, ip_cache_dir, html_cache_dir, mixed_port, pending, signal), asio::detached);
|
||||
}
|
||||
|
||||
+2
-2
@@ -4,5 +4,5 @@ inline constexpr int public_ipv4_cache_ttl_seconds = 7 * 24 * 60 * 60;
|
||||
// 出口 IPv6 缓存有效期,单位秒;0 表示永不过期。
|
||||
inline constexpr int public_ipv6_cache_ttl_seconds = 7 * 24 * 60 * 60;
|
||||
// true 表示对应缓存过期就重查;false 表示过期且缺少对应 IP 才重查。
|
||||
inline constexpr bool radical_ipv4 = false;
|
||||
inline constexpr bool radical_ipv6 = false;
|
||||
inline constexpr bool radical_ipv4 = true;
|
||||
inline constexpr bool radical_ipv6 = true;
|
||||
|
||||
Reference in New Issue
Block a user