check_now_proxy.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "strings"
  8. "sync"
  9. "time"
  10. )
  11. type ProxiesResponse struct {
  12. Proxies map[string]interface{} `json:"proxies"`
  13. }
  14. var nodes = [][][]string{
  15. {
  16. {"192.168.31.194", "58001", "58002", "58003", "58004", "58005", "58006", "58007", "58008", "58009", "58010"},
  17. },
  18. {
  19. {"192.168.31.201", "32001", "32002", "32003", "32004", "32005", "32006", "32007", "32008", "32009", "32010", "32011", "32012"},
  20. },
  21. {
  22. {"127.0.0.1", "17888"},
  23. },
  24. }
  25. var selectedNodes = nodes[0] // 默认选择第一个节点
  26. func checkProxy(proxyURL, chooseProxy string) string {
  27. // 确保 proxyURL 包含协议
  28. if !strings.HasPrefix(proxyURL, "http://") && !strings.HasPrefix(proxyURL, "https://") {
  29. proxyURL = "http://" + proxyURL // 默认使用 http 协议
  30. }
  31. // 对 chooseProxy 进行 URL 编码
  32. encodeProxyName := url.QueryEscape(chooseProxy)
  33. // 构建完整的请求 URL
  34. requestURL := fmt.Sprintf("%s/api/proxies/%s/delay?timeout=5000&url=http://www.gstatic.com/generate_204", proxyURL, encodeProxyName)
  35. // 创建 HTTP 客户端
  36. client := &http.Client{
  37. Timeout: 6 * time.Second, // 设置超时时间
  38. }
  39. // 发送 HTTP GET 请求
  40. resp, err := client.Get(requestURL)
  41. if err != nil {
  42. return fmt.Sprintf("Error: %v", err)
  43. }
  44. defer resp.Body.Close()
  45. // 检查 HTTP 状态码
  46. if resp.StatusCode != http.StatusOK {
  47. return fmt.Sprintf("HTTP Error: %s", resp.Status)
  48. }
  49. // 解析 JSON 响应
  50. var result map[string]interface{}
  51. if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
  52. return fmt.Sprintf("Error parsing JSON: %v", err)
  53. }
  54. // 检查 meanDelay 字段是否存在
  55. meanDelay, ok := result["meanDelay"]
  56. if !ok {
  57. return "meanDelay field not found in JSON"
  58. }
  59. // 返回 meanDelay 的值
  60. return fmt.Sprintf("meanDelay: %v", meanDelay)
  61. }
  62. func checkNowProxy(ip, port string, wg *sync.WaitGroup) {
  63. defer wg.Done()
  64. urlAndPort := fmt.Sprintf("%s:%s", ip, port)
  65. url := fmt.Sprintf("http://%s/api/proxies", urlAndPort)
  66. headers := map[string]string{
  67. "Accept": "application/json, text/plain, */*",
  68. "Accept-Encoding": "gzip, deflate, br, zstd",
  69. "Accept-Language": "zh-CN,zh;q=0.8",
  70. "Connection": "keep-alive",
  71. "Host": urlAndPort,
  72. "Referer": fmt.Sprintf("http://%s/", urlAndPort),
  73. "Sec-CH-UA": `"Chromium";v="134", "Not:A-Brand";v="24", "Brave";v="134"`,
  74. "Sec-CH-UA-Mobile": "?0",
  75. "Sec-CH-UA-Platform": `"macOS"`,
  76. "Sec-Fetch-Dest": "empty",
  77. "Sec-Fetch-Mode": "cors",
  78. "Sec-Fetch-Site": "same-origin",
  79. "Sec-GPC": "1",
  80. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
  81. }
  82. req, err := http.NewRequest("GET", url, nil)
  83. if err != nil {
  84. fmt.Printf("Error creating request: %v\n", err)
  85. return
  86. }
  87. for key, value := range headers {
  88. req.Header.Set(key, value)
  89. }
  90. client := &http.Client{}
  91. resp, err := client.Do(req)
  92. if err != nil {
  93. fmt.Printf("Request failed: %v\n", err)
  94. return
  95. }
  96. defer resp.Body.Close()
  97. if resp.StatusCode != http.StatusOK {
  98. fmt.Printf("Failed to load proxies from %s (Status: %d)\n", url, resp.StatusCode)
  99. return
  100. }
  101. var jsonData ProxiesResponse
  102. if err := json.NewDecoder(resp.Body).Decode(&jsonData); err != nil {
  103. fmt.Printf("Error decoding JSON: %v\n", err)
  104. return
  105. }
  106. proxies := jsonData.Proxies
  107. proxyGlobal, ok := proxies["GLOBAL"].(map[string]interface{})
  108. if !ok {
  109. fmt.Println("Error: GLOBAL proxy not found")
  110. return
  111. }
  112. nowProxy := proxyGlobal["now"].(string)
  113. checkResult := checkProxy(urlAndPort, nowProxy)
  114. message := fmt.Sprintf("%s --- %s --- %s", urlAndPort, nowProxy, checkResult)
  115. fmt.Println(message)
  116. }
  117. func main() {
  118. var wg sync.WaitGroup
  119. ip := selectedNodes[0][0]
  120. for _, port := range selectedNodes[0][1:] {
  121. wg.Add(1)
  122. go checkNowProxy(ip, port, &wg)
  123. }
  124. wg.Wait()
  125. }