隧道代理(固定时长)Go语言代码示例
发布时间:2023-03-27 21:39
package main
import (
"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()
}
相关文章