package mainimport ( "fmt" "io/ioutil" "net/http" "net/url" "sync" "time")/** 返回内容 第一次循环 当前 IP:121.230.91.188 来自于:中国 江苏 泰州 电信 当前 IP:60.184.205.115 来自于:中国 浙江 丽水 电信 当前 IP:125.112.205.149 来自于:中国 浙江 金华 电信 当前 IP:60.184.108.175 来自于:中国 浙江 丽水 电信 当前 IP:58.214.87.31 来自于:中国 江苏 无锡 电信 当前 IP:183.143.131.24 来自于:中国 浙江 湖州 电信 当前 IP:42.53.99.119 来自于:中国 辽宁 锦州 联通 当前 IP:59.60.142.70 来自于:中国 福建 漳州 电信 当前 IP:114.226.175.159 来自于:中国 江苏 常州 电信 当前 IP:123.162.194.223 来自于:中国 河南 驻马店 电信 max channel reached 第二次循环 当前 IP:114.226.175.159 来自于:中国 江苏 常州 电信 当前 IP:60.184.205.115 来自于:中国 浙江 丽水 电信 当前 IP:121.230.91.188 来自于:中国 江苏 泰州 电信 当前 IP:125.112.205.149 来自于:中国 浙江 金华 电信 当前 IP:123.162.194.223 来自于:中国 河南 驻马店 电信 当前 IP:58.214.87.31 来自于:中国 江苏 无锡 电信 当前 IP:183.143.131.24 来自于:中国 浙江 湖州 电信 当前 IP:60.184.108.175 来自于:中国 浙江 丽水 电信 当前 IP:59.60.142.70 来自于:中国 福建 漳州 电信 当前 IP:42.53.99.119 来自于:中国 辽宁 锦州 联通 第二次循环返回的IP与第一次循环相同,因为goroutine是异步的,所以返回顺序和第一次不一致 myip.ipip.net服务器可能比较容易失败,用户可以自己找一个其他获取客户端IP的服务器来测试*/// 固定时长多通道隧道模式func main() { authKey := "请改成您的Key" //固定时长1分钟的隧道,通道数10 password := "请改成您的AuthPwd" proxyServer := "请改成您的隧道地址" //如:tunnel3.qg.net:19263 targetURL := "https://ip.cn/api/index?ip=&type=0" rawURL := fmt.Sprintf("http://%s:%s@%s", authKey, password, proxyServer) proxyUrl, _ := url.Parse(rawURL) wg := sync.WaitGroup{} wg.Add(11) // 十个通道分别使用不同的十个IP,第十一次会返回错误,通道数超出 for i := 0; i < 11; i++ { go func(index int) { defer wg.Done() client := http.Client{ Transport: &http.Transport{ ProxyConnectHeader: http.Header{ "Proxy-TunnelID": []string{fmt.Sprintf("channel-%d", index)}, // 指定通道ID }, Proxy: http.ProxyURL(proxyUrl), }, } req, _ := http.NewRequest("GET", targetURL, nil) rsp, err := client.Do(req) if err != nil { fmt.Printf("request failed: %s\n", err) return } defer rsp.Body.Close() body, err := ioutil.ReadAll(rsp.Body) if err != nil { fmt.Println(err) } else { fmt.Println(string(body)) } }(i) } wg.Wait() // 因为固定时长为1分钟,所以在1分钟内继续使用已有通道,仍是之前的IP time.Sleep(time.Second * 10) wg.Add(10) for i := 0; i < 10; i++ { go func(index int) { defer wg.Done() client := http.Client{ Transport: &http.Transport{ ProxyConnectHeader: http.Header{ "Proxy-TunnelID": []string{fmt.Sprintf("channel-%d", index)}, // 指定通道ID }, Proxy: http.ProxyURL(proxyUrl), }, } req, _ := http.NewRequest("GET", targetURL, nil) rsp, err := client.Do(req) if err != nil { fmt.Printf("request failed: %s\n", err) return } defer rsp.Body.Close() body, err := ioutil.ReadAll(rsp.Body) if err != nil { fmt.Println(err) } else { fmt.Println(string(body)) } }(i) } wg.Wait()}