V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
itakeman
V2EX  ›  Go 编程语言

go run 如何走代理?

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

    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
    itakeman
        4
    itakeman  
    OP
       2023-10-22 10:41:59 +08:00 via Android
    @harmless 以前设置过这里,好像别的软件配置就出问题,不敢动这里
    itakeman
        5
    itakeman  
    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 生效的
    itakeman
        7
    itakeman  
    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
    你代码里面请求的时候有个参数使用系统代理,具体可以搜一下,然后配上楼上的环境变量就可以了
    itakeman
        16
    itakeman  
    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--->")
    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
    }
    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   ·   实用小工具   ·   2917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:53 · PVG 10:53 · LAX 18:53 · JFK 21:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.