go run 如何走代理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wojiugaiming
V2EX    Go 编程语言

go run 如何走代理?

  •  
  •   wojiugaiming 2023-10-22 10:28:56 +08:00 2965 次点击
    这是一个创建于 756 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    补充:golang 是静态编译的,proxychains 无效的
    lance6716
        12
    lance6716  
       2023-10-22 13:37:51 +08:00 via Android
    HTTP_PROXY 这些变量之所以有效,是因为代码里面读了这个变量、然后 set 自己的 proxy 啊…你现在代码是自己写的,就应该自己实现 HTTP_PROXY ,或者找一个支持的库直接封装了 HTTP_PROXY 的
    upupqi
        13
    upupqi  
       2023-10-22 14:14:11 +08:00
    可以直接使用 surge 或者 clashx pro 的增强模式
    wishyy
        14
    wishyy  
       2023-10-22 14:17:20 +08:00
    graftcp 代替 proxychains
    emailzzjcool
        15
    emailzzjcool  
       2023-10-22 14:46:39 +08:00 via iPhone
    你代码里面请求的时候有个参数使用系统代理,具体可以搜一下,然后配上楼上的环境变量就可以了
    wojiugaiming
        16
    wojiugaiming  
    OP
       2023-10-22 17:53:00 +08:00 via Android
    @wishyy 这个以前用过,昨天整了一天,忘了怎么用了,尴尬
    xiaohusky
        17
    xiaohusky  
       2023-10-22 21:44:06 +08:00
    用 tun 设备或者 iptables 设置透明代理
    xiaohusky
        18
    xiaohusky  
       2023-10-22 21:46:30 +08:00
    @lance6716 感觉好多人都被网上“命令行翻墙”的教程误导了,甚至不知道这只是环境变量
    lance6716
        19
    lance6716  
       2023-10-22 22:05:52 +08:00 via Android
    @xiaohusky 楼上就有不少这种脚本小子
    jioswu
        20
    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--->")
    fo 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
    }
    iSecret
        21
    iSecret  
       2023-10-23 14:49:04 +08:00
    net/http 默认会读取到环境 HTTP_PROXY 时自动配置,如果你使用了其他客户端,需要手动处理设置 HTTP_PROXY 的逻辑。
    dyllen
        22
    dyllen  
       2023-10-30 15:38:04 +08:00
    这个我搞过,默认是读取系统环境变量,1 楼说的那样。

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

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

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

    Proxy func(*Request) (*url.URL, error)
    dyllen
        23
    dyllen  
       2023-10-30 15:39:41 +08:00
    修改默认 http client 的代理设置:

    http.DefaultTransport.(*http.Transport).Proxy = xxx
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2472 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:35 PVG 10:35 LAX 18:35 JFK 21:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86