refactor(api): 优化 camel_oil_api 客户端及日志隐私处理

- 为 NewClient 函数添加 context 参数以支持上下文传递
- 修改调用处使用带 context 的 NewClient 构造客户端实例
- 调整日志打印,手机号不再部分隐藏,确保日志信息完整
- 添加客户端代理配置,使用固定 socks5 代理地址
- 更新代理池初始化 Key 和代理用户名密码信息
- 调整创建订单、登录等接口日志,保存完整手机号
- 修正测试文件调用,改用带 context 的客户端创建方式
- 移除部分旧注释代码,提高代码清晰度
- 优化查询订单时卡号日志信息,输出完整卡号
- 调整部分时间和循环控制相关实现,提升代码规范性
This commit is contained in:
danial
2025-12-06 23:20:59 +08:00
parent c643970397
commit 57d91991fc
8 changed files with 53 additions and 51 deletions

View File

@@ -43,7 +43,7 @@ func (s *sCamelOil) LoginAccount(ctx context.Context) (err error) {
return errors.New("手机号已存在,重新获取")
}
isOk, err := camel_oil_api.NewClient().SendCaptcha(ctx, phoneNumber)
isOk, err := camel_oil_api.NewClient(ctx).SendCaptcha(ctx, phoneNumber)
if err != nil {
return gerror.Wrap(err, "发送验证码失败")
}

View File

@@ -117,7 +117,7 @@ func (s *sCamelOil) CronOrderPaymentCheckTask(ctx context.Context) error {
}
// 查询订单状态
queryResult, err2 := camel_oil_api.NewClient().QueryOrder(ctx, accountInfo.Phone, accountInfo.Token, order.PlatformOrderNo)
queryResult, err2 := camel_oil_api.NewClient(ctx).QueryOrder(ctx, accountInfo.Phone, accountInfo.Token, order.PlatformOrderNo)
if err2 != nil {
glog.Error(ctx, "查询订单状态失败:", err2)
_ = s.RecordOrderHistory(ctx, order.OrderNo, "query_failed", "", fmt.Sprintf("查询订单失败: %v", err))
@@ -235,7 +235,7 @@ func (s *sCamelOil) CronVerifyCodeCheckTask(ctx context.Context) error {
failCount := 0
pigClient := pig.NewClient()
camelClient := camel_oil_api.NewClient()
camelClient := camel_oil_api.NewClient(ctx)
for _, account := range accounts {
//如果时间超过 1 分钟,就是过期

View File

@@ -124,7 +124,7 @@ func (s *sCamelOil) PrefetchOrderConcurrently(ctx context.Context, amount float6
mu.Unlock()
// 拉取订单
platformOrderId, payUrl, err2 := camel_oil_api.NewClient().CreateCamelOilOrder(ctx, acc.Phone, acc.Token, amount)
platformOrderId, payUrl, err2 := camel_oil_api.NewClient(ctx).CreateCamelOilOrder(ctx, acc.Phone, acc.Token, amount)
if err2 != nil {
if err2.Error() == "auth_error" {
_ = s.UpdateAccountStatus(ctx, acc.Id, consts.CamelOilAccountStatusInvalid, consts.CamelOilAccountChangeTypeInvalidate, "账号token失效")
@@ -185,7 +185,7 @@ func (s *sCamelOil) PrefetchOrder(ctx context.Context, account *entity.V1CamelOi
s.SavePrefetchOrderLog(ctx, fmt.Sprintf("调用骆驼平台API - 账号ID: %d, 账号名称: %s, 金额: %.2f, 操作: CreateCamelOilOrder",
account.Id, account.AccountName, amount))
platformOrderId, payUrl, err := camel_oil_api.NewClient().CreateCamelOilOrder(ctx, account.Phone, account.Token, amount)
platformOrderId, payUrl, err := camel_oil_api.NewClient(ctx).CreateCamelOilOrder(ctx, account.Phone, account.Token, amount)
if err != nil {
glog.Errorf(ctx, "调用骆驼平台API创建订单失败账号ID=%d, 错误: %v", account.Id, err)

View File

@@ -334,7 +334,7 @@ func (s *sCamelOil) BindCardToToken(ctx context.Context, orderId int64, cardNumb
}
// 4.2 调用绑卡接口(使用选中 Token 的 TokenValue
rechargeErrType, rechargeErr := camel_oil_api.NewClient().RechargeCard(ctx, selectedToken.TokenValue, selectedToken.Phone, cardPassword)
rechargeErrType, rechargeErr := camel_oil_api.NewClient(ctx).RechargeCard(ctx, selectedToken.TokenValue, selectedToken.Phone, cardPassword)
if rechargeErr != nil {
switch rechargeErrType {
case camel_oil_api.RechargeCardErrorCode:

View File

@@ -123,8 +123,8 @@ func (s *MinuteExpireStrategy) fetchProxyFromAPI(ctx context.Context) (*model.Pr
return &model.ProxyInfo{
Host: ipList[0],
Port: int(port),
Username: "E4WS5YZV",
Password: "C474B2794C4E",
Username: "8LO6KX52",
Password: "9583D10B85D9",
Protocol: "socks5",
}, nil
}

View File

@@ -46,7 +46,7 @@ func main() {
glog.Warning(gctx.GetInitCtx(), "AES 密钥初始化失败", err)
}
_ = service.ProxyPool().InitStrategy(gctx.GetInitCtx(), "https://share.proxy.qg.net/get?key=E4WS5YZV&num=1&area=&isp=0&format=txt&seq=\\r\\n&distinct=false", gtime.M)
_ = service.ProxyPool().InitStrategy(gctx.GetInitCtx(), "https://share.proxy.qg.net/get?key=8LO6KX52&num=1&area=&isp=0&format=txt&seq=\\r\\n&distinct=false", gtime.M)
// 测试日志输出
glog.Info(gctx.GetInitCtx(), "OTel可观测性系统初始化完成服务启动")

View File

@@ -27,7 +27,7 @@ type Client struct {
Client *gclient.Client
}
func NewClient() *Client {
func NewClient(ctx context.Context) *Client {
client := gclient.New()
client.SetBrowserMode(true)
client.SetHeaderMap(map[string]string{
@@ -37,6 +37,13 @@ func NewClient() *Client {
"host": "app.bac365.com",
"User-Agent": "Mozilla/5.0 (iPad; CPU OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Html5Plus/1.0 (Immersed/20) uni-app",
})
//proxy, err2 := service.ProxyPool().GetProxyByOrderId(ctx, "phone")
//if err2 == nil && proxy.Host != "" {
// glog.Info(ctx, "代理 ip", proxy.String())
// client.SetProxy(proxy.String())
//}
proxy := "socks5://B548CAB4:08BDC0979C6F@tun-ytljxq.qg.net:10255"
client.SetProxy(proxy)
return &Client{
Client: client,
}
@@ -77,17 +84,17 @@ func (c *Client) SendCaptcha(ctx context.Context, phone string) (bool, error) {
}{}
err = json.Unmarshal([]byte(respStr), &respStruct)
if err != nil {
glog.Errorf(ctx, "解析发送验证码响应失败,手机号: %s***%s, 错误: %v", phone[:3], phone[len(phone)-4:], err)
glog.Errorf(ctx, "解析发送验证码响应失败,手机号: %s, 错误: %v", phone, err)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("解析发送验证码响应失败 - 手机号: %s, 错误: %v", phone, err))
return false, err
}
success := respStruct.Code == "success"
if success {
glog.Infof(ctx, "发送验证码成功,手机号: %s***%s", phone[:3], phone[len(phone)-4:])
glog.Infof(ctx, "发送验证码成功,手机号: %s", phone)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("发送验证码成功 - 手机号: %s, 响应消息: %s", phone, respStruct.Message))
} else {
glog.Warningf(ctx, "发送验证码失败,手机号: %s***%s, 错误码: %s, 消息: %s", phone[:3], phone[len(phone)-4:], respStruct.Code, respStruct.Message)
glog.Warningf(ctx, "发送验证码失败,手机号: %s, 错误码: %s, 消息: %s", phone, respStruct.Code, respStruct.Message)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("发送验证码失败 - 手机号: %s, 错误码: %s, 消息: %s", phone, respStruct.Code, respStruct.Message))
}
@@ -134,8 +141,8 @@ func (c *Client) GetCaptcha(ctx context.Context) (string, error) {
func (c *Client) LoginWithCaptcha(ctx context.Context, phone string, code string) (string, error) {
// 记录登录开始
glog.Infof(ctx, "开始登录 - 手机号: %s***%s", phone[:3], phone[len(phone)-4:])
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录请求开始 - 手机号: %s***%s, 验证码: %s", phone[:3], phone[len(phone)-4:], code))
glog.Infof(ctx, "开始登录 - 手机号: %s", phone)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录请求开始 - 手机号: %s, 验证码: %s", phone, code))
//token, err := c.GetCaptcha(ctx)
//if err != nil {
@@ -160,14 +167,14 @@ func (c *Client) LoginWithCaptcha(ctx context.Context, phone string, code string
resp, err := c.Client.ContentJson().Post(ctx, "https://app.bac365.com/camel_wechat_mini_oil_server/loginApp", req)
if err != nil {
glog.Errorf(ctx, "登录请求失败,手机号: %s***%s, 错误: %v", phone[:3], phone[len(phone)-4:], err)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录请求失败 - 手机号: %s***%s, 错误: %v", phone[:3], phone[len(phone)-4:], err))
glog.Errorf(ctx, "登录请求失败,手机号: %s, 错误: %v", phone, err)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录请求失败 - 手机号: %s, 错误: %v", phone, err))
return "", err
}
respStr := resp.ReadAllString()
glog.Info(ctx, "登录响应数据:", respStr)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录响应数据 - 手机号: %s***%s, 响应: %s", phone[:3], phone[len(phone)-4:], respStr))
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录响应数据 - 手机号: %s, 响应: %s", phone, respStr))
respStruct := struct {
LoginUser struct {
@@ -184,14 +191,14 @@ func (c *Client) LoginWithCaptcha(ctx context.Context, phone string, code string
}{}
err = json.Unmarshal([]byte(respStr), &respStruct)
if err != nil {
glog.Errorf(ctx, "解析登录响应失败,手机号: %s***%s, 错误: %v", phone[:3], phone[len(phone)-4:], err)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("解析登录响应失败 - 手机号: %s***%s, 错误: %v", phone[:3], phone[len(phone)-4:], err))
glog.Errorf(ctx, "解析登录响应失败,手机号: %s, 错误: %v", phone, err)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("解析登录响应失败 - 手机号: %s, 错误: %v", phone, err))
return "", err
}
if respStruct.Code != "success" {
glog.Warningf(ctx, "登录失败,手机号: %s***%s, 错误码: %s, 消息: %s", phone[:3], phone[len(phone)-4:], respStruct.Code, respStruct.Message)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录失败 - 手机号: %s***%s, 错误码: %s, 消息: %s", phone[:3], phone[len(phone)-4:], respStruct.Code, respStruct.Message))
glog.Warningf(ctx, "登录失败,手机号: %s, 错误码: %s, 消息: %s", phone, respStruct.Code, respStruct.Message)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录失败 - 手机号: %s, 错误码: %s, 消息: %s", phone, respStruct.Code, respStruct.Message))
return "", errors.New(respStruct.Message)
}
@@ -200,8 +207,8 @@ func (c *Client) LoginWithCaptcha(ctx context.Context, phone string, code string
if len(tokenMask) > 8 {
tokenMask = respStruct.Token[:4] + "****" + respStruct.Token[len(respStruct.Token)-4:]
}
glog.Infof(ctx, "登录成功,手机号: %s***%s, Token: %s, 用户ID: %s", phone[:3], phone[len(phone)-4:], tokenMask, respStruct.LoginUser.UserIdApp)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录成功 - 手机号: %s***%s, 用户ID: %s, Token: %s, 登录时间: %s", phone[:3], phone[len(phone)-4:], respStruct.LoginUser.UserIdApp, tokenMask, respStruct.LoginUser.LoginTime))
glog.Infof(ctx, "登录成功,手机号: %s, Token: %s, 用户ID: %s", phone, tokenMask, respStruct.LoginUser.UserIdApp)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("登录成功 - 手机号: %s, 用户ID: %s, Token: %s, 登录时间: %s", phone, respStruct.LoginUser.UserIdApp, tokenMask, respStruct.LoginUser.LoginTime))
return respStruct.Token, err
}
@@ -251,14 +258,14 @@ func (c *Client) QueryCamelOilCardAvailableDenominations(ctx context.Context, to
func (c *Client) CreateCamelOilOrder(ctx context.Context, phone, token string, amount float64) (orderId string, payUrl string, err error) {
// 记录创建订单开始
glog.Infof(ctx, "开始创建骆驼油订单 - 手机号: %s***%s, 金额: %.2f", phone[:3], phone[len(phone)-4:], amount)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("创建骆驼油订单开始 - 手机号: %s***%s, 金额: %.2f", phone[:3], phone[len(phone)-4:], amount))
glog.Infof(ctx, "开始创建骆驼油订单 - 手机号: %s, 金额: %.2f", phone, amount)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("创建骆驼油订单开始 - 手机号: %s, 金额: %.2f", phone, amount))
c.Client.SetHeader("Authorization", "Bearer "+c.getAuth(ctx, token))
goods, err := c.QueryCamelOilCardAvailableDenominations(ctx, token)
if err != nil {
glog.Errorf(ctx, "查询可用面额失败,手机号: %s***%s, 金额: %.2f, 错误: %v", phone[:3], phone[len(phone)-4:], amount, err)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("创建订单查询面额失败 - 手机号: %s***%s, 金额: %.2f, 错误: %v", phone[:3], phone[len(phone)-4:], amount, err))
glog.Errorf(ctx, "查询可用面额失败,手机号: %s, 金额: %.2f, 错误: %v", phone, amount, err)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("创建订单查询面额失败 - 手机号: %s, 金额: %.2f, 错误: %v", phone, amount, err))
return "", "", err
}
goodId := ""
@@ -269,17 +276,17 @@ func (c *Client) CreateCamelOilOrder(ctx context.Context, phone, token string, a
}
}
if goodId == "" {
glog.Warningf(ctx, "当前金额 %.2f 不支持,手机号: %s***%s", amount, phone[:3], phone[len(phone)-4:])
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("创建订单失败 - 金额 %.2f 不支持, 手机号: %s***%s", amount, phone[:3], phone[len(phone)-4:]))
glog.Warningf(ctx, "当前金额 %.2f 不支持,手机号: %s", amount, phone)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("创建订单失败 - 金额 %.2f 不支持, 手机号: %s", amount, phone))
return "", "", errors.New("当前金额不支持")
}
glog.Infof(ctx, "找到匹配的面额商品,手机号: %s***%s, 金额: %.2f, 商品ID: %s", phone[:3], phone[len(phone)-4:], amount, goodId)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("找到匹配商品 - 手机号: %s***%s, 金额: %.2f, 商品ID: %s", phone[:3], phone[len(phone)-4:], amount, goodId))
glog.Infof(ctx, "找到匹配的面额商品,手机号: %s, 金额: %.2f, 商品ID: %s", phone, amount, goodId)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("找到匹配商品 - 手机号: %s, 金额: %.2f, 商品ID: %s", phone, amount, goodId))
const maxRetries = 10
// 获取骆驼模块设置
//// 获取骆驼模块设置
settings, err := service.CamelOil().GetCamelOilSettings(ctx)
var maxConcurrency int
if err != nil {
@@ -374,11 +381,6 @@ func (c *Client) CreateCamelOilOrder(ctx context.Context, phone, token string, a
Channel: "app",
Yanqian: true,
}
//proxy, err2 := service.ProxyPool().GetProxyByOrderId(ctx, phone)
//if err2 == nil && proxy.Host != "" {
// glog.Info(ctx, "代理 ip", proxy.String())
// c.Client.SetProxy(proxy.String())
//}
resp, err1 := c.Client.Post(ctx, "https://app.bac365.com/camel_wechat_mini_oil_server/eCardMall/wechatCardOrder", req)
if err1 != nil {
resultMutex.Lock()
@@ -389,8 +391,9 @@ func (c *Client) CreateCamelOilOrder(ctx context.Context, phone, token string, a
return
}
respStr := resp.ReadAllString()
glog.Info(ctx, "创建订单响应", respStr)
// 记录响应数据到日志
//记录响应数据到日志
service.CamelOil().SavePrefetchOrderLog(ctx, respStr)
respStruct := struct {
@@ -547,7 +550,7 @@ func (c *Client) QueryOrder(ctx context.Context, phone, token, orderId string) (
for _, card := range respStruct.Cards {
if card.OrderId == orderId {
glog.Infof(ctx, "查询订单%s成功金额: %.2f, 卡号: %s", orderId, card.Denomination, card.ECardNo)
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("查询订单成功 - 订单ID: %s, 金额: %.2f, 卡号: %s***%s, 创建时间: %s", orderId, card.Denomination, card.ECardNo[:4], card.ECardNo[len(card.ECardNo)-4:], card.CreateTime))
service.CamelOil().SavePrefetchOrderLog(ctx, fmt.Sprintf("查询订单成功 - 订单ID: %s, 金额: %.2f, 卡号: %s, 创建时间: %s", orderId, card.Denomination, card.ECardNo, card.CreateTime))
return &QueryResult{
Balance: card.Denomination,
CardNumber: card.ECardNo,

View File

@@ -4,14 +4,12 @@ import (
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
"github.com/gogf/gf/v2/net/gclient"
"github.com/gogf/gf/v2/os/glog"
"kami/internal/logic/proxy_pool"
"kami/internal/service"
"testing"
"time"
)
func TestClient_SendCaptcha(t *testing.T) {
client := NewClient()
client := NewClient(t.Context())
isOk, err := client.SendCaptcha(t.Context(), "19224625031")
glog.Info(t.Context(), isOk, err)
}
@@ -36,22 +34,23 @@ func TestClient_SendCard(t *testing.T) {
}
func TestClient_LoginWithCaptcha(t *testing.T) {
client := NewClient()
client := NewClient(t.Context())
isOk, err := client.LoginWithCaptcha(t.Context(), "19224625031", "063713")
glog.Info(t.Context(), isOk, err)
// 2025-11-27T17:14:24.131+08:00 [INFO]
}
func TestClient_CreateOrder(t *testing.T) {
ticker := time.NewTicker(time.Second)
service.RegisterProxyPool(proxy_pool.New())
for t2 := range ticker.C {
glog.Info(t.Context(), t2)
client := NewClient()
orderId, payUrl, err := client.CreateCamelOilOrder(t.Context(), "13966750117", "buOSl900L1o6htbHZ6ou32NGtyEsuLu3TeJJlqEZNAvfPzlRk/OqkYm7rMh0X+otku80Jz+sjIlfnf8JXUIjH4NkTRgX92w2knTEjqIc92MSnEi9qyV0lTKue/ycVD1INIGJGBn3vJopJrcb8eupKUjVhFXvONAW2RQ7atAeANc=", 100)
//service.RegisterProxyPool(proxy_pool.New())
//_ = service.ProxyPool().InitStrategy(gctx.GetInitCtx(), "https://share.proxy.qg.net/get?key=8LO6KX52&num=1&area=&isp=0&format=txt&seq=\\r\\n&distinct=false", gtime.M)
ticker := time.NewTicker(time.Second * 1)
for range ticker.C {
client := NewClient(t.Context())
orderId, payUrl, err := client.CreateCamelOilOrder(t.Context(), "19247252286", "D/k6sTlhbNrGk798lDhAP88qlJKYqMyiz9ESzmKW6uiuvj1ZWSPOlCgv3L0pEEr871Vuxr9tBAA4BiH2RTuSaYugq458wOjsJedfyGGHRyZZyMzZ/Tl6Km2vKT2Dph2/n9FaqNwErxNeq0+11x9q7VnBhhJTjxVIYN/fe3TB/m4=", 100)
if err == nil {
glog.Info(t.Context(), orderId, payUrl, err)
break
return
}
glog.Info(t.Context(), orderId, payUrl, err)
}