Files
ping_tg_proxy/main.go
2026-02-27 00:51:35 +08:00

98 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"bufio"
"fmt"
"net"
"net/http"
"strings"
"time"
)
const proxyListURL = "https://gh-proxy.org/https://github.com/hookzof/socks5_list/blob/master/proxy.txt"
func main() {
// 1. 拉取代理列表
resp, err := http.Get(proxyListURL)
if err != nil {
panic(fmt.Errorf("获取代理列表失败: %w", err))
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
panic(fmt.Errorf("获取代理列表失败HTTP 状态码: %d", resp.StatusCode))
}
scanner := bufio.NewScanner(resp.Body)
var proxies []string
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
// 每一行形如 "ip:port"
proxies = append(proxies, line)
}
if err := scanner.Err(); err != nil {
panic(fmt.Errorf("读取列表内容失败: %w", err))
}
if len(proxies) == 0 {
fmt.Println("代理列表为空")
return
}
fmt.Printf("共读取到 %d 个代理,开始测试...\n", len(proxies))
// 2. 依次测试每个代理的 TCP 连接耗时
var (
bestProxy string
bestLatency time.Duration
)
for _, addr := range proxies {
latency, err := testProxyTCP(addr, 3*time.Second)
if err != nil {
fmt.Printf("[失败] %s: %v\n", addr, err)
continue
}
fmt.Printf("[成功] %s 延迟: %v\n", addr, latency)
if bestProxy == "" || latency < bestLatency {
bestProxy = addr
bestLatency = latency
}
}
// 3. 输出结果
if bestProxy == "" {
fmt.Println("没有找到可用的代理服务器")
return
}
fmt.Println("====================================")
fmt.Printf("最快代理服务器: %s延迟: %v\n", bestProxy, bestLatency)
// 4. 输出一个可在 Telegram 中自动配置的 tg 链接(基于 SOCKS5
parts := strings.Split(bestProxy, ":")
if len(parts) == 2 {
server := parts[0]
port := parts[1]
tgLink := fmt.Sprintf("tg://socks?server=%s&port=%s", server, port)
fmt.Println("Telegram 一键配置链接:")
fmt.Println(tgLink)
} else {
fmt.Println("无法生成 Telegram 链接,代理地址不是 ip:port 格式:", bestProxy)
}
}
// testProxyTCP 尝试建立到代理服务器的 TCP 连接,并返回耗时
func testProxyTCP(addr string, timeout time.Duration) (time.Duration, error) {
start := time.Now()
conn, err := net.DialTimeout("tcp", addr, timeout)
if err != nil {
return 0, err
}
defer conn.Close()
return time.Since(start), nil
}