|
|
@@ -0,0 +1,130 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "net/http"
|
|
|
+ "net/url"
|
|
|
+ "strings"
|
|
|
+ "sync"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type ProxiesResponse struct {
|
|
|
+ Proxies map[string]interface{} `json:"proxies"`
|
|
|
+}
|
|
|
+
|
|
|
+var nodes = [][][]string{
|
|
|
+ {
|
|
|
+ {"192.168.31.194", "58001", "58002", "58003", "58004", "58005", "58006", "58007", "58008", "58009", "58010"},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ {"192.168.31.201", "32001", "32002", "32003", "32004", "32005", "32006", "32007", "32008", "32009", "32010", "32011", "32012"},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ {"127.0.0.1", "17888"},
|
|
|
+ },
|
|
|
+}
|
|
|
+var selectedNodes = nodes[0] // 默认选择第一个节点
|
|
|
+func checkProxy(proxyURL, chooseProxy string) string {
|
|
|
+ // 确保 proxyURL 包含协议
|
|
|
+ if !strings.HasPrefix(proxyURL, "http://") && !strings.HasPrefix(proxyURL, "https://") {
|
|
|
+ proxyURL = "http://" + proxyURL // 默认使用 http 协议
|
|
|
+ }
|
|
|
+ // 对 chooseProxy 进行 URL 编码
|
|
|
+ encodeProxyName := url.QueryEscape(chooseProxy)
|
|
|
+ // 构建完整的请求 URL
|
|
|
+ requestURL := fmt.Sprintf("%s/api/proxies/%s/delay?timeout=5000&url=http://www.gstatic.com/generate_204", proxyURL, encodeProxyName)
|
|
|
+
|
|
|
+ // 创建 HTTP 客户端
|
|
|
+ client := &http.Client{
|
|
|
+ Timeout: 6 * time.Second, // 设置超时时间
|
|
|
+ }
|
|
|
+ // 发送 HTTP GET 请求
|
|
|
+ resp, err := client.Get(requestURL)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Sprintf("Error: %v", err)
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+ // 检查 HTTP 状态码
|
|
|
+ if resp.StatusCode != http.StatusOK {
|
|
|
+ return fmt.Sprintf("HTTP Error: %s", resp.Status)
|
|
|
+ }
|
|
|
+ // 解析 JSON 响应
|
|
|
+ var result map[string]interface{}
|
|
|
+ if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
|
|
|
+ return fmt.Sprintf("Error parsing JSON: %v", err)
|
|
|
+ }
|
|
|
+ // 检查 meanDelay 字段是否存在
|
|
|
+ meanDelay, ok := result["meanDelay"]
|
|
|
+ if !ok {
|
|
|
+ return "meanDelay field not found in JSON"
|
|
|
+ }
|
|
|
+ // 返回 meanDelay 的值
|
|
|
+ return fmt.Sprintf("meanDelay: %v", meanDelay)
|
|
|
+}
|
|
|
+
|
|
|
+func checkNowProxy(ip, port string, wg *sync.WaitGroup) {
|
|
|
+ defer wg.Done()
|
|
|
+ urlAndPort := fmt.Sprintf("%s:%s", ip, port)
|
|
|
+ url := fmt.Sprintf("http://%s/api/proxies", urlAndPort)
|
|
|
+ headers := map[string]string{
|
|
|
+ "Accept": "application/json, text/plain, */*",
|
|
|
+ "Accept-Encoding": "gzip, deflate, br, zstd",
|
|
|
+ "Accept-Language": "zh-CN,zh;q=0.8",
|
|
|
+ "Connection": "keep-alive",
|
|
|
+ "Host": urlAndPort,
|
|
|
+ "Referer": fmt.Sprintf("http://%s/", urlAndPort),
|
|
|
+ "Sec-CH-UA": `"Chromium";v="134", "Not:A-Brand";v="24", "Brave";v="134"`,
|
|
|
+ "Sec-CH-UA-Mobile": "?0",
|
|
|
+ "Sec-CH-UA-Platform": `"macOS"`,
|
|
|
+ "Sec-Fetch-Dest": "empty",
|
|
|
+ "Sec-Fetch-Mode": "cors",
|
|
|
+ "Sec-Fetch-Site": "same-origin",
|
|
|
+ "Sec-GPC": "1",
|
|
|
+ "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",
|
|
|
+ }
|
|
|
+ req, err := http.NewRequest("GET", url, nil)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error creating request: %v\n", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for key, value := range headers {
|
|
|
+ req.Header.Set(key, value)
|
|
|
+ }
|
|
|
+ client := &http.Client{}
|
|
|
+ resp, err := client.Do(req)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Request failed: %v\n", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+ if resp.StatusCode != http.StatusOK {
|
|
|
+ fmt.Printf("Failed to load proxies from %s (Status: %d)\n", url, resp.StatusCode)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var jsonData ProxiesResponse
|
|
|
+ if err := json.NewDecoder(resp.Body).Decode(&jsonData); err != nil {
|
|
|
+ fmt.Printf("Error decoding JSON: %v\n", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ proxies := jsonData.Proxies
|
|
|
+ proxyGlobal, ok := proxies["GLOBAL"].(map[string]interface{})
|
|
|
+ if !ok {
|
|
|
+ fmt.Println("Error: GLOBAL proxy not found")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ nowProxy := proxyGlobal["now"].(string)
|
|
|
+ checkResult := checkProxy(urlAndPort, nowProxy)
|
|
|
+ message := fmt.Sprintf("%s --- %s --- %s", urlAndPort, nowProxy, checkResult)
|
|
|
+ fmt.Println(message)
|
|
|
+}
|
|
|
+func main() {
|
|
|
+ var wg sync.WaitGroup
|
|
|
+ ip := selectedNodes[0][0]
|
|
|
+ for _, port := range selectedNodes[0][1:] {
|
|
|
+ wg.Add(1)
|
|
|
+ go checkNowProxy(ip, port, &wg)
|
|
|
+ }
|
|
|
+ wg.Wait()
|
|
|
+}
|