Golang Go语言中 go run 如何走代理?

发布于 1周前 作者 h691938207 来自 Go语言

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

24 回复

设置 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

你代码里面请求的时候有个参数使用系统代理,具体可以搜一下,然后配上楼上的环境变量就可以了

这个以前用过,昨天整了一天,忘了怎么用了,尴尬

用 tun 设备或者 iptables 设置透明代理

感觉好多人都被网上“命令行翻墙”的教程误导了,甚至不知道这只是环境变量

楼上就有不少这种脚本小子😂

直接用系统全局代理模式不行?你要访问 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 的逻辑。

这个我搞过,默认是读取系统环境变量,1 楼说的那样。

也可以自己代码里设置,设置 transport 的 proxy 属性:

Transport.(*http.Transport).Proxy = xxx

xxx 是一个函数,返回代理地址就可以了,支持 http ,https ,socks5 代理:

Proxy func(*Request) (*url.URL, error)

修改默认 http client 的代理设置:

http.DefaultTransport.(*http.Transport).Proxy = xxx

在Go语言中,当你使用go run命令来运行Go程序时,如果需要通过代理访问外部网络(例如下载依赖包),可以通过设置环境变量来配置代理。以下是几种常见的方法来设置代理:

  1. 临时设置环境变量: 你可以在运行go run命令前,通过命令行临时设置HTTP和HTTPS代理环境变量。例如:

    export HTTP_PROXY=http://your-proxy-server:port
    export HTTPS_PROXY=http://your-proxy-server:port
    go run main.go
    

    注意,这种方法只会在当前终端会话中生效。

  2. .bashrc.zshrc中设置: 如果你希望每次打开终端时都自动应用这些设置,可以将上述export命令添加到你的.bashrc.zshrc文件中。

  3. 使用GOPROXY环境变量: 从Go 1.11版本开始,Go引入了GOPROXY环境变量,用于配置Go模块下载的代理。虽然这主要影响go getgo mod命令,但设置它也可能间接影响go run(如果go run过程中需要下载依赖)。

    export GOPROXY=https://goproxy.io,direct
    go run main.go
    

    这里的https://goproxy.io是一个公共Go模块代理,direct表示如果代理不可用,则直接访问源。

选择适合你的方法,确保代理设置正确无误,这样go run命令就能通过代理访问外部网络了。

回到顶部