- 实现账号增删改查接口和逻辑 - 支持账号状态更新及状态历史记录功能 - 提供账号列表、历史和统计信息查询API - 实现账号轮询机制,支持按使用时间轮询获取账号 - 增加账号登录流程及批量登录功能,集成接码平台和平台API - 管理账号订单容量,支持容量检查与账号登录触发 - 提供账号池状态统计接口 - 账号历史记录查询支持多种变更类型文本展示 - 密码等敏感信息采用脱敏展示 - 完善日志记录和错误处理机制,保证业务稳定运行
116 lines
2.8 KiB
Go
116 lines
2.8 KiB
Go
package pig
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/gogf/gf/v2/os/glog"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
"kami/utility/cache"
|
|
"sync"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/net/gclient"
|
|
)
|
|
|
|
type InternalClient struct {
|
|
Client *gclient.Client
|
|
}
|
|
|
|
var client *InternalClient
|
|
|
|
func NewClient() *InternalClient {
|
|
sync.OnceFunc(func() {
|
|
client = &InternalClient{
|
|
Client: g.Client(),
|
|
}
|
|
})()
|
|
return client
|
|
}
|
|
|
|
func (c *InternalClient) getToken(ctx context.Context) (string, error) {
|
|
tokenKey := cache.PrefixTracePigAccount.Key("PrefixTracePigAccount")
|
|
tokenVar, err := cache.NewCache().Get(ctx, tokenKey)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
token := ""
|
|
if tokenVar != nil && tokenVar.String() != "" {
|
|
return tokenVar.String(), nil
|
|
}
|
|
resp, err := c.Client.Post(ctx, fmt.Sprintf("https://api.haozhuyun.com/sms/?api=login&user=%s&pass=%s",
|
|
"19d3db76c14358397ffec25d2da18a36fe0837487d758d8445a54d783a9d1eaf",
|
|
"72112378425489db7fdca2caf9daa97ba9d50b84511d2c11c940e1db362d50b6"),
|
|
)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
respData := struct {
|
|
Token string `json:"token"`
|
|
Code int `json:"code"`
|
|
Msg string `json:"msg"`
|
|
}{}
|
|
err = json.Unmarshal(resp.ReadAll(), &respData)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if respData.Token == "" {
|
|
return "", fmt.Errorf("获取token失败")
|
|
}
|
|
_ = cache.NewCache().Set(ctx, tokenKey, respData.Token, gtime.D)
|
|
return token, nil
|
|
}
|
|
|
|
// GetAccountInfo 获取账号信息
|
|
func (c *InternalClient) GetAccountInfo(ctx context.Context) (string, error) {
|
|
token, err := c.getToken(ctx)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
respBody := struct {
|
|
Token string `json:"token"`
|
|
SID int `json:"sid"`
|
|
}{
|
|
Token: token,
|
|
SID: 21108,
|
|
}
|
|
|
|
resp, err := c.Client.Post(ctx, fmt.Sprintf("https://api.haozhuyun.com/sms?api=getPhone&token=%s&sid=%d&Province=&ascription=&isp=", respBody.Token, respBody.SID))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
respStruct := struct {
|
|
Phone string `json:"phone"`
|
|
}{}
|
|
err = json.Unmarshal(resp.ReadAll(), &respStruct)
|
|
return respStruct.Phone, err
|
|
}
|
|
|
|
// CheckVerifyCode 检测验证码是否已接收
|
|
func (c *InternalClient) CheckVerifyCode(ctx context.Context, phone string) (code string, received bool, err error) {
|
|
token, err := c.getToken(ctx)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
//构建 url 请求
|
|
resp, err := c.Client.Post(ctx, fmt.Sprintf("https://api.haozhuwang.cn/sms/?api=getMessage&token=%s&sid=%s&phone=%s", token, "21108", phone))
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
respStruct := struct {
|
|
Code json.Number `json:"code"`
|
|
Msg string `json:"msg"`
|
|
Sms string `json:"sms"`
|
|
Yzm string `json:"yzm"`
|
|
}{}
|
|
err = json.Unmarshal(resp.ReadAll(), &respStruct)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
glog.Info(ctx, respStruct)
|
|
if respStruct.Code != "0" {
|
|
return "", false, nil
|
|
}
|
|
return respStruct.Yzm, true, nil
|
|
}
|