在使用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中可以进行测试
随便输入个甚么,提示
C
o
n
n
e
c
t
i
o
n
⋅
s
u
c
c
e
s
s
f
u
l
\color{blue}{Connection·successful}
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
查看运行中的连接信息