- 添加 go-resty/v2依赖用于HTTP请求处理 - 创建代理配置模块 config/proxy.go 管理代理API地址和认证信息- 实现 SOCKS5代理结构体及缓存机制- 支持代理有效性测试与1分钟有效期管理 - 实现代理池缓存功能,支持最大50个代理缓存 - 添加代理获取重试机制(最多3次)- 更新 proxy controller 使用新的代理池系统 - 添加完整的单元测试覆盖代理功能 - 提供详细的 README 文档说明使用方法和API - 支持从环境变量配置代理认证信息 - 实现缓存清理和监控功能
58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package controllers
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"go.uber.org/zap"
|
|
"shop/internal/traceRouter"
|
|
"time"
|
|
|
|
"github.com/beego/beego/v2/server/web"
|
|
"github.com/go-resty/resty/v2"
|
|
"shop/internal/proxy"
|
|
)
|
|
|
|
type ProxyController struct {
|
|
web.Controller
|
|
}
|
|
|
|
func (c *ProxyController) Proxy() {
|
|
// 获取请求所有参数
|
|
params, _ := c.Input()
|
|
//获取路径
|
|
path := c.Ctx.Request.URL.Path
|
|
targetURL := "https://wx.tenpay.com" + path + "?" + params.Encode()
|
|
|
|
// 创建 Resty 客户端
|
|
client := resty.New().
|
|
SetTimeout(30 * time.Second).OnBeforeRequest(func(client *resty.Client, request *resty.Request) error {
|
|
for range 5 {
|
|
// 尝试获取 SOCKS5 代理
|
|
socksProxy, err := proxy.GetValidProxy(request.Context())
|
|
if err != nil {
|
|
proxy.RemoveProxy(socksProxy)
|
|
return nil
|
|
}
|
|
|
|
// 设置代理 URL
|
|
proxyURL := fmt.Sprintf("socks5://%s", socksProxy.Address())
|
|
client.SetProxy(proxyURL)
|
|
break
|
|
}
|
|
return nil
|
|
})
|
|
|
|
resp, err := client.R().
|
|
SetContext(context.Background()).
|
|
SetHeader("referer", "https://mpay.m.jd.com/").
|
|
Get(targetURL)
|
|
if err != nil {
|
|
traceRouter.Logger.WithContext(c.Ctx.Request.Context()).Error("错误", zap.Error(err))
|
|
// 全局日志会自动记录错误
|
|
c.Ctx.ResponseWriter.WriteHeader(500)
|
|
return
|
|
}
|
|
_, _ = c.Ctx.ResponseWriter.Write(resp.Body())
|
|
|
|
}
|