go run 如何走代理?

2023-10-22 10:28:56 +08:00
 itakeman

go 语言写的东西,要访问 xxx.com,后面发现 xxx.com 被墙了,于是尝试

proxychains go run main.go,但是还是不能访问 xxx.com,浏览器 访问就没事,确认代理没有问题,那么问题出在哪里?有懂的大佬吗?

2393 次点击
所在节点    Go 编程语言
23 条回复
harmless
2023-10-22 10:35:10 +08:00
设置 HTTP_PROXY 和 HTTPS_PROXY 环境变量
knightdf
2023-10-22 10:36:58 +08:00
环境变量或者直接 http client 里面设置 proxy
seers
2023-10-22 10:37:33 +08:00
net 包可以设置 proxy
itakeman
2023-10-22 10:41:59 +08:00
@harmless 以前设置过这里,好像别的软件配置就出问题,不敢动这里
itakeman
2023-10-22 10:43:55 +08:00
@seers 看了一下,好像不是很适应,不知道有没有其他的工具 可以强制 go 走代理
harmless
2023-10-22 10:45:12 +08:00
@itakeman 用临时的啊,只对你这个命令生效的,你如果用的是 linux 或者 mac ,直接用 export HTTP_PROXY=http://127.0.0.1:8080 然后再执行你的 go run 就可以了,这个是只对当前 shell 生效的
itakeman
2023-10-22 10:46:12 +08:00
@harmless 好的 我尝试一下
harmless
2023-10-22 10:48:44 +08:00
或者直接这样就可以了,只对当前命令有效 HTTP_PROXY=http://127.0.0.1:8080 HTTPS_PROXY=http://q127.0.0.1:8080 go run main.go
yinmin
2023-10-22 11:02:31 +08:00
@itakeman 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"
yougg
2023-10-22 11:28:22 +08:00
可以在代码里面初始化的时候设置一下:

func init() {
os.Setenv("http_proxy", "http://127.0.0.1:8080")
}
yaott2020
2023-10-22 11:54:57 +08:00
golang http.Client 可以设置 http 代理

补充:golang 是静态编译的,proxychains 无效的
lance6716
2023-10-22 13:37:51 +08:00
HTTP_PROXY 这些变量之所以有效,是因为代码里面读了这个变量、然后 set 自己的 proxy 啊…你现在代码是自己写的,就应该自己实现 HTTP_PROXY ,或者找一个支持的库直接封装了 HTTP_PROXY 的
upupqi
2023-10-22 14:14:11 +08:00
可以直接使用 surge 或者 clashx pro 的增强模式
wishyy
2023-10-22 14:17:20 +08:00
graftcp 代替 proxychains
emailzzjcool
2023-10-22 14:46:39 +08:00
你代码里面请求的时候有个参数使用系统代理,具体可以搜一下,然后配上楼上的环境变量就可以了
itakeman
2023-10-22 17:53:00 +08:00
@wishyy 这个以前用过,昨天整了一天,忘了怎么用了,尴尬
xiaohusky
2023-10-22 21:44:06 +08:00
用 tun 设备或者 iptables 设置透明代理
xiaohusky
2023-10-22 21:46:30 +08:00
@lance6716 感觉好多人都被网上“命令行翻墙”的教程误导了,甚至不知道这只是环境变量
lance6716
2023-10-22 22:05:52 +08:00
@xiaohusky 楼上就有不少这种脚本小子😂
jioswu
2023-10-23 09:36:26 +08:00
直接用系统全局代理模式不行?你要访问 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
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/984190

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX