You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言结合Cloudflare绕过库正确配置代理的方法咨询

问题描述

使用cloudflarebp库绕过Cloudflare发送请求,添加代理后程序崩溃,移除代理则运行正常。相关代码、错误信息及关键说明如下:

代码

headers := map[string]string{
    "Accept":     "*/*",
    "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
}
proxyStr := "http://101.68.61.82:8085"
proxyURL, _ := url.Parse(proxyStr)
transport := &http.Transport{
    Proxy: http.ProxyURL(proxyURL),
}
client := http.Client{Timeout: 5 * time.Second, Transport: transport}
client.Transport = cloudflarebp.AddCloudFlareByPass(client.Transport)
req, _ := http.NewRequest("GET", "https://api.openproxy.space/lists/http", nil) 
for k, v := range headers {
    req.Header.Set(k, v)
}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))

错误信息

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x40 pc=0x38f96d]

goroutine 1 [running]:
main.requesti()
     C:/Users/user/Desktop/go/parser/test.go:33 +0x40d
main.main()
    C:/Users/user/Desktop/go/parser/test.go:13 +0x17
exit status 2

关键行说明

  • 第33行:defer resp.Body.Close()
  • 第13行:调用requesti()函数

问题分析与解决

核心原因

崩溃源于client.Do(req)执行失败返回nil的resp,后续调用resp.Body.Close()触发空指针异常。本质是代理配置与cloudflarebp的结合逻辑有误,或代理本身不可用。

修复步骤

  1. 添加错误拦截,避免空指针
    必须处理client.Do(req)的错误返回,先判断resp是否有效:

    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("请求失败:%v\n", err)
        return
    }
    defer resp.Body.Close()
    

    这样能提前捕获代理连接失败、Cloudflare验证失败等问题,避免直接崩溃。

  2. 调整代理与cloudflarebp的包装顺序
    确保cloudflarebp正确包装带有代理配置的Transport,避免逻辑覆盖:

    proxyURL, err := url.Parse(proxyStr)
    if err != nil {
        fmt.Printf("解析代理地址失败:%v\n", err)
        return
    }
    // 先创建带代理的Transport
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }
    // 用cloudflarebp包装该Transport
    bypassTransport := cloudflarebp.AddCloudFlareByPass(transport)
    // 直接使用包装后的Transport创建客户端
    client := http.Client{Timeout: 5 * time.Second, Transport: bypassTransport}
    
  3. 验证代理可用性
    先单独测试代理是否能访问目标地址,比如用curl:

    curl -x http://101.68.61.82:8085 https://api.openproxy.space/lists/http
    

    如果代理无法连接目标、需要认证或失效,先解决代理问题。

  4. 完善全链路错误处理
    不要忽略url.Parse和http.NewRequest的错误:

    req, err := http.NewRequest("GET", "https://api.openproxy.space/lists/http", nil)
    if err != nil {
        fmt.Printf("创建请求失败:%v\n", err)
        return
    }
    

内容的提问来源于stack exchange,提问作者sheki meki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:35:23