在使用golang向某些網站發送http請求時,發現它在沒有進行設置的情況下並不能直接使用正在運行的socks代理(SSR等)發送數據。起初我認爲是終端不走代理的原因…
首先使用Privoxy將socks5代理轉化爲本地http代理
privoxy下載地址
安裝,在運行前確保socks代理開啓,找到privoxy安裝目錄下的config.txt,修改其中如下的內容:
listen-address 127.0.0.1:8118 (選擇一個未被佔用的端口即可(默認爲8118)
在文本末尾添加
forward-socks5 / 127.0.0.1:1080 . (localhost後的端口爲ssr的發送端口,切記最後的 . 也要複製上,表示轉發全部)
保存,運行privoxy,在goland中可以進行測試
隨便輸入個甚麼,提示後說明這一步大功告成了
在構建Client時設置通過代理髮送http請求
起初我認爲只要設置好終端的代理環境即可,沒想到還是屢遭timeout或host not found的重創,,,後來在看原碼時發現只需要在配置Transport參數時提供Proxy的值即可,樣例代碼如下:
func NewPixivClient() *PixClient {
// 生成標準化url
proxyUrl, err := url.Parse("http://127.0.0.1:8118/")
if err != nil {panic(err)}
// 配置transport用於構建http client
transport := &http.Transport {
TLSClientConfig: &tls.Config{InsecureSkipVerify: false},
Dial: func(netw, addr string) (net.Conn, error) {
deadline := time.Now().Add(60 * time.Second)
c, err := net.DialTimeout(netw, addr, time.Second*60)
if err != nil {
panic(err)
}
err = c.SetDeadline(deadline)
return c, err
},
ResponseHeaderTimeout: time.Second*60,
// 進行一次類型轉化
Proxy: http.ProxyURL(proxyUrl),
}
return &PixClient {
clnt: http.Client{Transport: transport},
pixLoginResponse: PixLoginResponse{},
}
}
題外話——關於設置win10的終端代理
在pwsh或者cmd環境下都可以使用:
netsh winhttp set proxy /?
查看說明
用法: set proxy [proxy-server=] [bypass-list=]
不設置過濾地址的情況下直接輸入
netsh winhttp set proxy proxy-server="http=http://xxx.xxx.xxx.xxx:x/;https=http://xxx.xxx.xxx.xxx:x/" bypass-list=""
回車即可
之後便可以通過查詢命令👇確保正常運行即可
netsh winhttp show proxy
查看代理信息
netstat
查看運行中的連接信息