Golang Go语言中 go run 如何走代理?
go 语言写的东西,要访问 xxx.com,后面发现 xxx.com 被墙了,于是尝试
proxychains go run main.go,但是还是不能访问 xxx.com,浏览器 访问就没事,确认代理没有问题,那么问题出在哪里?有懂的大佬吗?
Golang Go语言中 go run 如何走代理?
更多关于Golang Go语言中 go run 如何走代理?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
设置 HTTP_PROXY 和 HTTPS_PROXY 环境变量
更多关于Golang Go语言中 go run 如何走代理?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
环境变量或者直接 http client 里面设置 proxy
net 包可以设置 proxy
以前设置过这里,好像别的软件配置就出问题,不敢动这里
看了一下,好像不是很适应,不知道有没有其他的工具 可以强制 go 走代理
用临时的啊,只对你这个命令生效的,你如果用的是 linux 或者 mac ,直接用 export HTTP_PROXY=http://127.0.0.1:8080 然后再执行你的 go run 就可以了,这个是只对当前 shell 生效的
好的 我尝试一下
或者直接这样就可以了,只对当前命令有效 HTTP_PROXY=http://127.0.0.1:8080 HTTPS_PROXY=http://q127.0.0.1:8080 go run main.go
linux/mac 运行这个命令:
bash -c “export http_proxy=http://127.0.0.1:8080 && export https_proxy=http://127.0.0.1:8080 && go run main.go”
可以在代码里面初始化的时候设置一下:
func init() {
os.Setenv(“http_proxy”, “http://127.0.0.1:8080”)
}
golang http.Client 可以设置 http 代理
补充:golang 是静态编译的,proxychains 无效的
HTTP_PROXY 这些变量之所以有效,是因为代码里面读了这个变量、然后 set 自己的 proxy 啊…你现在代码是自己写的,就应该自己实现 HTTP_PROXY ,或者找一个支持的库直接封装了 HTTP_PROXY 的
可以直接使用 surge 或者 clashx pro 的增强模式
graftcp 代替 proxychains
你代码里面请求的时候有个参数使用系统代理,具体可以搜一下,然后配上楼上的环境变量就可以了
这个以前用过,昨天整了一天,忘了怎么用了,尴尬
感觉好多人都被网上“命令行翻墙”的教程误导了,甚至不知道这只是环境变量
楼上就有不少这种脚本小子😂
直接用系统全局代理模式不行?你要访问 xxx.com 的话是不是得用 http 请求,直接把 http 请求设置成走代理?
func ProxyHttpDo(method, reqURL, reqData string, header map[string]string) (body []byte, err error) {
// 创建代理地址
proxyUrl, err := url.Parse(“http://127.0.0.1:7890”)
if err != nil {
panic(err)
}
// 创建 Transport 对象并将代理地址分配给它的 Proxy 字段
transport := &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
// 创建一个 http.Client 对象,并将 Transport 分配给它的 Transport 字段
client := &http.Client{Transport: transport}
req, err := http.NewRequest(method, reqURL, strings.NewReader(reqData))
if err != nil {
// handle error
return nil, err
}
//req.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)
//req.Header.Set(“Cookie”, “name=anny”)
req.Header.Set(“Origin”, “https://www.google.com”) //授权头信息
req.Header.Set(“Referer”, “https://www.google…com/”) //授权头信息
if len(header) > 0 {
log.Printf(“has header—>”)
for k, v := range header {
log.Printf(“header[%s]=>[%s]\n”, k, v)
req.Header.Set(k, v)
}
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err = io.ReadAll(resp.Body)
log.Printf(“body:%s\n”, string(body))
if err != nil {
// handle error
return nil, err
}
return
}
net/http 默认会读取到环境 HTTP_PROXY 时自动配置,如果你使用了其他客户端,需要手动处理设置 HTTP_PROXY 的逻辑。
修改默认 http client 的代理设置:
http.DefaultTransport.(*http.Transport).Proxy = xxx
在Go语言中,当你使用go run
命令来运行Go程序时,如果需要通过代理访问外部网络(例如下载依赖包),可以通过设置环境变量来配置代理。以下是几种常见的方法来设置代理:
-
临时设置环境变量: 你可以在运行
go run
命令前,通过命令行临时设置HTTP和HTTPS代理环境变量。例如:export HTTP_PROXY=http://your-proxy-server:port export HTTPS_PROXY=http://your-proxy-server:port go run main.go
注意,这种方法只会在当前终端会话中生效。
-
在
.bashrc
或.zshrc
中设置: 如果你希望每次打开终端时都自动应用这些设置,可以将上述export
命令添加到你的.bashrc
或.zshrc
文件中。 -
使用
GOPROXY
环境变量: 从Go 1.11版本开始,Go引入了GOPROXY
环境变量,用于配置Go模块下载的代理。虽然这主要影响go get
和go mod
命令,但设置它也可能间接影响go run
(如果go run
过程中需要下载依赖)。export GOPROXY=https://goproxy.io,direct go run main.go
这里的
https://goproxy.io
是一个公共Go模块代理,direct
表示如果代理不可用,则直接访问源。
选择适合你的方法,确保代理设置正确无误,这样go run
命令就能通过代理访问外部网络了。