golang程序發送http請求在socks代理下無效的解決方法(Win10)

在使用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中可以進行測試
在這裏插入圖片描述
隨便輸入個甚麼,提示Connectionsuccessful\color{blue}{Connection·successful}後說明這一步大功告成了
在這裏插入圖片描述

在構建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
查看運行中的連接信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章