Files
kami_shop/internal/controllers/proxy.go
danial 0ec72f4e12 feat(proxy): 实现代理池功能支持SOCKS5代理自动获取与管理
- 添加 go-resty/v2依赖用于HTTP请求处理
- 创建代理配置模块 config/proxy.go 管理代理API地址和认证信息- 实现 SOCKS5代理结构体及缓存机制- 支持代理有效性测试与1分钟有效期管理
- 实现代理池缓存功能,支持最大50个代理缓存
- 添加代理获取重试机制(最多3次)- 更新 proxy controller 使用新的代理池系统
- 添加完整的单元测试覆盖代理功能
- 提供详细的 README 文档说明使用方法和API
- 支持从环境变量配置代理认证信息
- 实现缓存清理和监控功能
2025-10-26 00:09:42 +08:00

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())
}