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的结合逻辑有误,或代理本身不可用。
修复步骤
添加错误拦截,避免空指针
必须处理client.Do(req)的错误返回,先判断resp是否有效:resp, err := client.Do(req) if err != nil { fmt.Printf("请求失败:%v\n", err) return } defer resp.Body.Close()这样能提前捕获代理连接失败、Cloudflare验证失败等问题,避免直接崩溃。
调整代理与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}验证代理可用性
先单独测试代理是否能访问目标地址,比如用curl:curl -x http://101.68.61.82:8085 https://api.openproxy.space/lists/http如果代理无法连接目标、需要认证或失效,先解决代理问题。
完善全链路错误处理
不要忽略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
相关产品推荐
相关产品推荐

