隧道代理(动态请求)Go语言代码示例
发布时间:2023-03-27 21:38
普通模式
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"sync"
"time"
)
func main() {
authKey := "请改成您的Key"
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)
client := http.Client{
Transport: &http.Transport{
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))
}
}
打标记模式
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"sync"
"time"
)
/** 返回内容
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:114.219.115.191 来自于:中国 江苏 苏州 电信
当前 IP:14.118.211.116 来自于:中国 广东 江门 电信
*/
func main() {
authKey := "请改成您的Key"
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)
client := http.Client{
Transport: &http.Transport{
ProxyConnectHeader: http.Header{
"Proxy-TunnelID": []string{"channel-1"}, // 在CONNECT连接中新增Proxy-TunnelID打标记
"Proxy-TTL": []string{"10"}, // Proxy-TTL指定该标记IP的存活时间
},
Proxy: http.ProxyURL(proxyUrl),
},
}
// 因为标记的存活时间是10s,所以循环11次中有10次的IP是一样的。
// 第11次因为标记的IP到期了,系统会自动替换IP
wg := sync.WaitGroup{}
wg.Add(11)
for i := 0; i < 11; i++ {
go func() {
defer wg.Done()
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))
}
}()
time.Sleep(time.Second)
}
wg.Wait()
}
相关文章