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 · 192 天前 · 2092 次点击
    这是一个创建于 192 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    func init() {
    os.Setenv("http_proxy", "http://127.0.0.1:8080")
    }
    yaott2020
        11
    yaott2020  
       191 天前 via Android   ❤️ 1
    golang http.Client 可以设置 http 代理

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

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

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

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

    Proxy func(*Request) (*url.URL, error)
    dyllen
        23
    dyllen  
       183 天前
    修改默认 http client 的代理设置:

    http.DefaultTransport.(*http.Transport).Proxy = xxx
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2343 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:18 · PVG 11:18 · LAX 20:18 · JFK 23:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.