隧道代理(固定時長)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 := "
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()
}
相關文章