799 lines
21 KiB
Go
799 lines
21 KiB
Go
package cluemanage
|
||
|
||
import (
|
||
"bytes"
|
||
"crypto/sha1"
|
||
"encoding/base64"
|
||
"encoding/json"
|
||
"errors"
|
||
"fmt"
|
||
util "github.com/alibabacloud-go/tea-utils/v2/service"
|
||
"github.com/alibabacloud-go/tea/tea"
|
||
"github.com/aliyun/credentials-go/credentials"
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/go-admin-team/go-admin-core/logger"
|
||
"github.com/go-admin-team/go-admin-core/sdk/pkg/response"
|
||
"go-admin/common/apis"
|
||
"go-admin/tools/app"
|
||
"io"
|
||
"math/rand"
|
||
"net"
|
||
"net/url"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
|
||
dypnsapi20170525 "github.com/alibabacloud-go/dypnsapi-20170525/v2/client"
|
||
"go-admin/app/admin/models"
|
||
"net/http"
|
||
)
|
||
|
||
//const (
|
||
// SendDataUrl = "https://sapi.ads.oppomobile.com/v1/clue/sendData"
|
||
// OwnerID = "1000253191"
|
||
// OwnerIDNum = 1000253191
|
||
// ApiID = "85c646a87ac14d9f982579ba2301599e"
|
||
// ApiKey = "516e23f836d648a18ee86d93c96285b4"
|
||
// TransformType = 101
|
||
//)
|
||
|
||
const (
|
||
SendDataUrl = "https://sapi.ads.oppomobile.com/v1/clue/sendData"
|
||
|
||
// OwnerID1 Z1-迪为-H5
|
||
OwnerID1 = "1000253191"
|
||
OwnerIDNum1 = 1000253191
|
||
ApiID1 = "85c646a87ac14d9f982579ba2301599e"
|
||
ApiKey1 = "516e23f836d648a18ee86d93c96285b4"
|
||
|
||
// OwnerID2 Z2-迪为-H5(自动汇:https://nice.deovo.com/)
|
||
OwnerID2 = "1000261834"
|
||
OwnerIDNum2 = 1000261834
|
||
ApiID2 = "3fc9c2d81aad4a879ec51e77b34264b0"
|
||
ApiKey2 = "ddbebc0e34984ed286159165fb714497"
|
||
|
||
// OwnerID3 Z3-迪为-H5(生活菜谱:https://cook.deovo.com/)
|
||
OwnerID3 = "1000261837"
|
||
OwnerIDNum3 = 1000261837
|
||
ApiID3 = "edfe5812c7b64708b44c122f1d7504e5"
|
||
ApiKey3 = "1e7e8fc3a8f34243a456a39ac9c18e4b"
|
||
|
||
// OwnerID4 Z4-迪为-H5(私房菜:https://magic.go2switch.deovo.com/)
|
||
OwnerID4 = "1000268889"
|
||
OwnerIDNum4 = 1000268889
|
||
ApiID4 = "41e3cb4360b54941a5a7d2f17d01129d"
|
||
ApiKey4 = "5f7b237062b943fc82ef9c0979c46cae"
|
||
|
||
// OwnerID11 Z11-迪为-H5
|
||
OwnerID11 = "1000276049"
|
||
OwnerIDNum11 = 1000276049
|
||
ApiID11 = "228f1cbd5768465986d71db5ff44479c"
|
||
ApiKey11 = "0c82a1b0e9534550a03ffb2c78a6d080"
|
||
|
||
// OwnerID12 Z12-迪为-H5(重庆旅游: https://travel.deovo.com/)
|
||
OwnerID12 = "1000276050"
|
||
OwnerIDNum12 = 1000276050
|
||
ApiID12 = "113c010849e947ad92d2c876dafd8926"
|
||
ApiKey12 = "6eae7531586a4fb88946d6368ad03d83"
|
||
|
||
// OwnerID13 Z13-迪为-H5
|
||
OwnerID13 = "1000276052"
|
||
OwnerIDNum13 = 1000276052
|
||
ApiID13 = "f129f76f4be54660938dc0f6cdbd3d31"
|
||
ApiKey13 = "3c87769fa4d94cb5b21763217f7ba595"
|
||
|
||
// OwnerID14 Z14-迪为-H5 (八大员操作证:https://learn.deovo.com/)
|
||
OwnerID14 = "1000276053"
|
||
OwnerIDNum14 = 1000276053
|
||
ApiID14 = "fb5913c8810b4ef5a1ee5eb999215b86"
|
||
ApiKey14 = "b1072c9932304d12ab53f2dbb327c0be"
|
||
|
||
// OwnerID15 Z15-迪为-H5
|
||
OwnerID15 = "1000276054"
|
||
OwnerIDNum15 = 1000276054
|
||
ApiID15 = "517c0d58097d407e8d83ef59d46b61c7"
|
||
ApiKey15 = "df78cfab18b04d2c8dabc64fc21f5e72"
|
||
|
||
// OwnerID100 美食菜谱 https://ms.deovo.net/
|
||
OwnerID100 = "1000266972"
|
||
OwnerIDNum100 = 1000266972
|
||
ApiID100 = "50e6a0c050c44c6cbf48c17bb9791ca9"
|
||
ApiKey100 = "58497e3b9151445ea89241da6eb55505"
|
||
|
||
// OwnerID101 美食汇 https://auto.deovo.net/
|
||
OwnerID101 = "1000266926"
|
||
OwnerIDNum101 = 1000266926
|
||
ApiID101 = "4325bcd7c39043ad8d94dbc7f4954261"
|
||
ApiKey101 = "de78f1f509d64977971f93429183d070"
|
||
|
||
// OwnerID102 我家厨房 https://taste.go2switch.deovo.com/
|
||
OwnerID102 = "1000271633"
|
||
OwnerIDNum102 = 1000271633
|
||
ApiID102 = "e317346a8df444df9a950c50960d301d"
|
||
ApiKey102 = "2eb47b37c31c499087cc2ecd54b10258"
|
||
|
||
// OwnerID103 美味菜肴 https://yummy.go2switch.deovo.com/
|
||
OwnerID103 = "1000271629"
|
||
OwnerIDNum103 = 1000271629
|
||
ApiID103 = "831a61f7ab824ae182d10de88e626a94"
|
||
ApiKey103 = "40e6f77260c845a8899c0a9b4b995854"
|
||
|
||
// OwnerID104 (魔方菜谱:https://magic.deovo.com/)
|
||
OwnerID104 = "1000417459"
|
||
OwnerIDNum104 = 1000417459
|
||
ApiID104 = "22cbcfec05bd4f96bd049b1632a0ff1b"
|
||
ApiKey104 = "f1effc0cde87404d9fb12238ee36ef81"
|
||
|
||
TransformType = 101
|
||
)
|
||
|
||
var tidValue string
|
||
var lbidValue string
|
||
var pageIdValue string
|
||
|
||
type ClueDeployService struct {
|
||
apis.Api
|
||
}
|
||
|
||
func (e ClueDeployService) NewSendData(c *gin.Context) {
|
||
fmt.Println("NewSendData")
|
||
err := e.MakeContext(c).MakeOrm().Errors
|
||
if err != nil {
|
||
fmt.Println("MakeContext err:", err)
|
||
e.Logger.Error(err)
|
||
app.Error(c, http.StatusInternalServerError, err, "初始化失败")
|
||
return
|
||
}
|
||
|
||
req := &models.NewSendDataReq{}
|
||
if c.ShouldBindJSON(req) != nil {
|
||
logger.Errorf("para err")
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||
return
|
||
}
|
||
logger.Info("NewSendData req:", req)
|
||
|
||
if req.Type == 1 && len(req.CertList) == 0 {
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误,证书为空")
|
||
return
|
||
}
|
||
|
||
// 检查手机号是否存在
|
||
nFlag, err := models.CheckPhone(req.Type, req.Tel, e.Orm)
|
||
if err != nil {
|
||
logger.Errorf("err:", err)
|
||
app.Error(c, http.StatusInternalServerError, err, "发送失败"+err.Error())
|
||
return
|
||
}
|
||
|
||
if nFlag {
|
||
app.Error(c, http.StatusInternalServerError, err, "该手机号已存在,请勿重复提交")
|
||
return
|
||
}
|
||
|
||
fmt.Println("Url is:", req.Url)
|
||
tidValue, _ = extractTID(req.Url)
|
||
// 解析URL
|
||
parsedURL, err := url.Parse(req.Url)
|
||
if err != nil {
|
||
fmt.Println("URL解析错误:", err)
|
||
return
|
||
}
|
||
|
||
// 获取查询参数
|
||
queryParams := parsedURL.Query()
|
||
// 获取tid参数的值
|
||
pageIdValue = queryParams.Get("pageId")
|
||
//tidValue = queryParams.Get("tid")
|
||
lbidValue = queryParams.Get("lbid")
|
||
fmt.Println("pageIdValue is:", pageIdValue)
|
||
fmt.Println("tidValue is:", tidValue)
|
||
fmt.Println("lbidValue is:", lbidValue)
|
||
|
||
if strings.Contains(tidValue, "%") {
|
||
fmt.Println("字符串中包含%")
|
||
} else {
|
||
fmt.Println("字符串中不包含%")
|
||
}
|
||
nType := 0
|
||
if req.Type == 1 { // 八大员
|
||
nType = 14
|
||
} else if req.Type == 2 { // 旅游
|
||
nType = 12
|
||
}
|
||
|
||
reqData := getNewOppoData(req)
|
||
resp, err := oppoSendData(reqData, nType)
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, "oppoSendData err")
|
||
}
|
||
|
||
if resp.Code == 0 { // 回传成功则记录电话到数据库
|
||
models.RecordUserData(req, e.Orm)
|
||
}
|
||
|
||
logger.Info("NewSendData resp:", resp)
|
||
|
||
if resp.Code != 0 {
|
||
app.Error(c, resp.Code, errors.New("回传失败"), resp.Msg)
|
||
} else {
|
||
app.OK(c, "", resp.Msg)
|
||
}
|
||
}
|
||
|
||
func (e ClueDeployService) GetUserData(c *gin.Context) {
|
||
fmt.Println("GetUserData")
|
||
err := e.MakeContext(c).MakeOrm().Errors
|
||
if err != nil {
|
||
fmt.Println("MakeContext err:", err)
|
||
e.Logger.Error(err)
|
||
app.Error(c, http.StatusInternalServerError, err, "初始化失败")
|
||
return
|
||
}
|
||
|
||
req := &models.GetUserDataReq{}
|
||
if c.ShouldBindJSON(req) != nil {
|
||
logger.Errorf("para err")
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||
return
|
||
}
|
||
|
||
logger.Info("NewSendData req:", req)
|
||
|
||
resp, err := models.GetUserDataList(req, e.Orm)
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, "查询失败")
|
||
return
|
||
}
|
||
|
||
app.OK(c, resp, "")
|
||
}
|
||
|
||
func (e ClueDeployService) GetCode(c *gin.Context) {
|
||
fmt.Println("GetCode")
|
||
err := e.MakeContext(c).MakeOrm().Errors
|
||
if err != nil {
|
||
fmt.Println("MakeContext err:", err)
|
||
e.Logger.Error(err)
|
||
app.Error(c, http.StatusInternalServerError, err, "初始化失败")
|
||
return
|
||
}
|
||
|
||
req := &models.GetCodeReq{}
|
||
if c.ShouldBindJSON(req) != nil {
|
||
logger.Errorf("para err")
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||
return
|
||
}
|
||
|
||
// 检查手机号是否存在
|
||
nFlag, err := models.CheckPhone(req.Type, req.Tel, e.Orm)
|
||
if err != nil {
|
||
logger.Errorf("err:", err)
|
||
app.Error(c, http.StatusInternalServerError, err, "发送失败"+err.Error())
|
||
return
|
||
}
|
||
|
||
if nFlag {
|
||
app.Error(c, http.StatusInternalServerError, err, "该手机号已存在,请勿重复提交")
|
||
return
|
||
}
|
||
|
||
resp, err := models.GetSMSCode(req, e.Orm, req.Type)
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, "获取失败")
|
||
return
|
||
}
|
||
|
||
app.OK(c, resp, "")
|
||
}
|
||
|
||
func (e ClueDeployService) RecordLog(c *gin.Context) {
|
||
err := e.MakeContext(c).MakeOrm().Errors
|
||
if err != nil {
|
||
fmt.Println("MakeContext err:", err)
|
||
e.Logger.Error(err)
|
||
app.Error(c, http.StatusInternalServerError, err, "初始化失败")
|
||
return
|
||
}
|
||
|
||
req := &models.RecordLog{}
|
||
if c.ShouldBindJSON(req) != nil {
|
||
logger.Errorf("para err")
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||
return
|
||
}
|
||
|
||
fmt.Println("req param is:", req.Data)
|
||
app.OK(c, "", "")
|
||
}
|
||
|
||
func (e ClueDeployService) VerifyCode(c *gin.Context) {
|
||
fmt.Println("VerifyCode")
|
||
err := e.MakeContext(c).MakeOrm().Errors
|
||
if err != nil {
|
||
fmt.Println("MakeContext err:", err)
|
||
e.Logger.Error(err)
|
||
app.Error(c, http.StatusInternalServerError, err, "初始化失败")
|
||
return
|
||
}
|
||
|
||
req := &models.VerifyCodeReq{}
|
||
if c.ShouldBindJSON(req) != nil {
|
||
logger.Errorf("para err")
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||
return
|
||
}
|
||
|
||
err = models.VerifySMSCode(req, e.Orm)
|
||
if err != nil {
|
||
app.Error(c, http.StatusBadRequest, err, "校验失败:"+err.Error())
|
||
return
|
||
}
|
||
|
||
app.OK(c, "验证通过", "")
|
||
}
|
||
|
||
func (e ClueDeployService) SendData(c *gin.Context) {
|
||
fmt.Println("SendData")
|
||
err := e.MakeContext(c).Errors
|
||
if err != nil {
|
||
fmt.Println("MakeContext err:", err)
|
||
e.Logger.Error(err)
|
||
return
|
||
}
|
||
|
||
req := &models.SendDataReq{}
|
||
if c.ShouldBindJSON(req) != nil {
|
||
logger.Errorf("para err")
|
||
response.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||
return
|
||
}
|
||
fmt.Println("Url is:", req.Url)
|
||
tidValue, _ = extractTID(req.Url)
|
||
// 解析URL
|
||
parsedURL, err := url.Parse(req.Url)
|
||
if err != nil {
|
||
fmt.Println("URL解析错误:", err)
|
||
return
|
||
}
|
||
|
||
// 获取查询参数
|
||
queryParams := parsedURL.Query()
|
||
// 获取tid参数的值
|
||
pageIdValue = queryParams.Get("pageId")
|
||
//tidValue = queryParams.Get("tid")
|
||
lbidValue = queryParams.Get("lbid")
|
||
fmt.Println("pageIdValue is:", pageIdValue)
|
||
fmt.Println("tidValue is:", tidValue)
|
||
fmt.Println("lbidValue is:", lbidValue)
|
||
|
||
if strings.Contains(tidValue, "%") {
|
||
fmt.Println("字符串中包含%")
|
||
} else {
|
||
fmt.Println("字符串中不包含%")
|
||
}
|
||
|
||
nType := 0
|
||
if strings.Contains(req.Url, "https://magic.deovo.com") {
|
||
nType = 1
|
||
} else if strings.Contains(req.Url, "https://nice.deovo.com") {
|
||
nType = 2
|
||
} else if strings.Contains(req.Url, "https://cook.deovo.com") {
|
||
nType = 3
|
||
} else if strings.Contains(req.Url, "https://ms.deovo.net") {
|
||
nType = 100
|
||
} else if strings.Contains(req.Url, "https://auto.deovo.net") {
|
||
nType = 101
|
||
}
|
||
|
||
reqData := getOppoData(nType)
|
||
resp, err := oppoSendData(reqData, nType)
|
||
if err != nil {
|
||
response.Error(c, http.StatusBadRequest, err, "oppoSendData err")
|
||
}
|
||
|
||
e.OK(resp, "")
|
||
}
|
||
|
||
func (e ClueDeployService) GetAuthToken(c *gin.Context) {
|
||
client, _err := CreateClient()
|
||
if _err != nil {
|
||
app.Error(c, http.StatusInternalServerError, _err, _err.Error())
|
||
return
|
||
}
|
||
|
||
getAuthTokenRequest := &dypnsapi20170525.GetAuthTokenRequest{
|
||
Url: tea.String("https://travel.deovo.com/"),
|
||
Origin: tea.String("https://travel.deovo.com/"),
|
||
SceneCode: tea.String("FC220000002610017"),
|
||
}
|
||
var _result *dypnsapi20170525.GetAuthTokenResponse
|
||
tryErr := func() (_e error) {
|
||
defer func() {
|
||
if r := tea.Recover(recover()); r != nil {
|
||
_e = r
|
||
}
|
||
}()
|
||
// 复制代码运行请自行打印 API 的返回值
|
||
_result, _err = client.GetAuthTokenWithOptions(getAuthTokenRequest, &util.RuntimeOptions{})
|
||
if _err != nil {
|
||
return _err
|
||
}
|
||
|
||
return nil
|
||
}()
|
||
|
||
if tryErr != nil {
|
||
var error = &tea.SDKError{}
|
||
if _t, ok := tryErr.(*tea.SDKError); ok {
|
||
error = _t
|
||
} else {
|
||
error.Message = tea.String(tryErr.Error())
|
||
}
|
||
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
|
||
// 错误 message
|
||
fmt.Println(tea.StringValue(error.Message))
|
||
// 诊断地址
|
||
var data interface{}
|
||
d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
|
||
d.Decode(&data)
|
||
if m, ok := data.(map[string]interface{}); ok {
|
||
recommend, _ := m["Recommend"]
|
||
fmt.Println(recommend)
|
||
}
|
||
_, _err = util.AssertAsString(error.Message)
|
||
if _err != nil {
|
||
app.Error(c, http.StatusInternalServerError, _err, _err.Error())
|
||
return
|
||
}
|
||
|
||
app.Error(c, http.StatusInternalServerError, _err, *error.Message)
|
||
return
|
||
}
|
||
app.OK(c, _result, "获取token成功")
|
||
}
|
||
|
||
func (e ClueDeployService) GetPhoneWithToken(c *gin.Context) {
|
||
fmt.Println("GetUserData")
|
||
err := e.MakeContext(c).MakeOrm().Errors
|
||
if err != nil {
|
||
fmt.Println("MakeContext err:", err)
|
||
e.Logger.Error(err)
|
||
app.Error(c, http.StatusInternalServerError, err, "初始化失败")
|
||
return
|
||
}
|
||
|
||
req := &models.GetPhoneWithTokenReq{}
|
||
if c.ShouldBindJSON(req) != nil {
|
||
logger.Errorf("para err")
|
||
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
||
return
|
||
}
|
||
|
||
client, _err := CreateClient()
|
||
if _err != nil {
|
||
app.Error(c, http.StatusInternalServerError, _err, _err.Error())
|
||
return
|
||
}
|
||
|
||
getPhoneWithTokenRequest := &dypnsapi20170525.GetPhoneWithTokenRequest{
|
||
SpToken: tea.String(req.SpToken),
|
||
}
|
||
var _result *dypnsapi20170525.GetPhoneWithTokenResponse
|
||
tryErr := func() (_e error) {
|
||
defer func() {
|
||
if r := tea.Recover(recover()); r != nil {
|
||
_e = r
|
||
}
|
||
}()
|
||
// 复制代码运行请自行打印 API 的返回值
|
||
_result, _err = client.GetPhoneWithTokenWithOptions(getPhoneWithTokenRequest, &util.RuntimeOptions{})
|
||
if _err != nil {
|
||
return _err
|
||
}
|
||
|
||
return nil
|
||
}()
|
||
|
||
if tryErr != nil {
|
||
var error = &tea.SDKError{}
|
||
if _t, ok := tryErr.(*tea.SDKError); ok {
|
||
error = _t
|
||
} else {
|
||
error.Message = tea.String(tryErr.Error())
|
||
}
|
||
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
|
||
// 错误 message
|
||
fmt.Println(tea.StringValue(error.Message))
|
||
// 诊断地址
|
||
var data interface{}
|
||
d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
|
||
d.Decode(&data)
|
||
if m, ok := data.(map[string]interface{}); ok {
|
||
recommend, _ := m["Recommend"]
|
||
fmt.Println(recommend)
|
||
}
|
||
_, _err = util.AssertAsString(error.Message)
|
||
if _err != nil {
|
||
app.Error(c, http.StatusInternalServerError, _err, _err.Error())
|
||
return
|
||
}
|
||
|
||
app.Error(c, http.StatusInternalServerError, _err, *error.Message)
|
||
return
|
||
}
|
||
app.OK(c, _result, "获取token成功")
|
||
}
|
||
|
||
func CreateClient() (_result *dypnsapi20170525.Client, _err error) {
|
||
// 使用AK 初始化Credentials Client。
|
||
credentialsConfig := new(credentials.Config).
|
||
SetType("access_key").
|
||
SetAccessKeyId("LTAI5tH6oCpPPRufyxqYEHk1").
|
||
SetAccessKeySecret("SqKNm5YWXk097x5mpRMUjEAfEjcYbS")
|
||
credentialClient, _err := credentials.NewCredential(credentialsConfig)
|
||
if _err != nil {
|
||
return nil, _err
|
||
}
|
||
|
||
config := &openapi.Config{}
|
||
// Endpoint 请参考 https://api.aliyun.com/product/Dypnsapi
|
||
config.Endpoint = tea.String("dypnsapi.aliyuncs.com")
|
||
config.Credential = credentialClient
|
||
_result = &dypnsapi20170525.Client{}
|
||
_result, _err = dypnsapi20170525.NewClient(config)
|
||
return _result, _err
|
||
}
|
||
|
||
func extractTID(urlString string) (tid string, err error) {
|
||
// 查找"tid="的位置
|
||
tidIndex := strings.Index(urlString, "tid=")
|
||
|
||
if tidIndex == -1 {
|
||
return "", fmt.Errorf("未找到tid参数")
|
||
}
|
||
|
||
// 截取tid参数的值
|
||
tidStart := tidIndex + 4 // "tid="的长度为4
|
||
urlString = urlString[tidStart:]
|
||
|
||
// 查找"&"或末尾的位置
|
||
ampersandIndex := strings.Index(urlString, "&")
|
||
if ampersandIndex != -1 {
|
||
urlString = urlString[:ampersandIndex]
|
||
}
|
||
|
||
return urlString, nil
|
||
}
|
||
|
||
// 常用的中文姓氏和名字部分
|
||
var surnames = []rune("赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨")
|
||
var givenNames = []rune("伟芳娜敏静丽强磊军洋勇艳杰涛明超秀娟霞平刚桂")
|
||
|
||
// 随机生成中文姓名(两个汉字)
|
||
func generateChineseName() string {
|
||
rand.Seed(time.Now().UnixNano())
|
||
surname := surnames[rand.Intn(len(surnames))]
|
||
givenName := givenNames[rand.Intn(len(givenNames))]
|
||
return string(surname) + string(givenName)
|
||
}
|
||
|
||
// 随机生成11位手机号
|
||
func generatePhoneNumber() string {
|
||
rand.Seed(time.Now().UnixNano())
|
||
// 手机号以1开头,第二位可以是3-9
|
||
secondDigit := rand.Intn(9) + 3
|
||
// 剩余的9位数字随机生成
|
||
restDigits := rand.Int63n(1000000000)
|
||
return fmt.Sprintf("1%d%09d", secondDigit, restDigits)
|
||
}
|
||
|
||
// 组合数据
|
||
func getOppoData(nType int) models.OppoSendDataReq {
|
||
itemData1 := models.ClueDataItem{
|
||
Column: "姓名",
|
||
Desc: "姓名输入框",
|
||
IfNeed: true,
|
||
Type: "1",
|
||
Value: generateChineseName(),
|
||
}
|
||
|
||
itemData2 := models.ClueDataItem{
|
||
Column: "电话",
|
||
Desc: "电话",
|
||
IfNeed: true,
|
||
Type: "3",
|
||
Value: generatePhoneNumber(),
|
||
}
|
||
|
||
var itemList []models.ClueDataItem
|
||
itemList = append(itemList, itemData1)
|
||
itemList = append(itemList, itemData2)
|
||
strPageId, _ := strconv.ParseInt(pageIdValue, 10, 64)
|
||
|
||
var nOwnerId int64
|
||
switch nType {
|
||
case 1:
|
||
nOwnerId = OwnerIDNum104
|
||
case 2:
|
||
nOwnerId = OwnerIDNum2
|
||
case 3:
|
||
nOwnerId = OwnerIDNum3
|
||
case 100:
|
||
nOwnerId = OwnerIDNum100
|
||
case 101:
|
||
nOwnerId = OwnerIDNum101
|
||
default:
|
||
nOwnerId = OwnerIDNum11
|
||
}
|
||
|
||
data := models.OppoSendDataReq{
|
||
PageId: strPageId,
|
||
OwnerId: nOwnerId,
|
||
Ip: "121.35.103.72",
|
||
Tid: tidValue,
|
||
Lbid: lbidValue,
|
||
TransformType: TransformType,
|
||
Items: itemList,
|
||
}
|
||
|
||
return data
|
||
}
|
||
|
||
// 调用接口
|
||
func oppoSendData(r models.OppoSendDataReq, nType int) (models.OppoSendDataResp, error) {
|
||
var clueResp models.OppoSendDataResp
|
||
var token string
|
||
switch nType {
|
||
case 1:
|
||
token = generateToken(OwnerID104, ApiID104, ApiKey104)
|
||
case 2:
|
||
token = generateToken(OwnerID2, ApiID2, ApiKey2)
|
||
case 3:
|
||
token = generateToken(OwnerID3, ApiID3, ApiKey3)
|
||
case 12:
|
||
token = generateToken(OwnerID12, ApiID12, ApiKey12)
|
||
case 14:
|
||
token = generateToken(OwnerID14, ApiID14, ApiKey14)
|
||
case 100:
|
||
token = generateToken(OwnerID100, ApiID100, ApiKey100)
|
||
case 101:
|
||
token = generateToken(OwnerID101, ApiID101, ApiKey101)
|
||
}
|
||
|
||
data, err := json.Marshal(r)
|
||
if err != nil {
|
||
logger.Error("oppoSendData err:", err)
|
||
return clueResp, err
|
||
}
|
||
|
||
fmt.Println("data json:", string(data))
|
||
client := http.Client{}
|
||
req, err := http.NewRequest("POST", SendDataUrl, bytes.NewBuffer(data))
|
||
if err != nil {
|
||
logger.Error("oppoSendData err:", err)
|
||
return clueResp, err
|
||
}
|
||
|
||
req.Header.Set("Content-Type", "application/json; charset=utf-8")
|
||
req.Header.Set("Authorization", "Bearer "+token)
|
||
|
||
resp, err := client.Do(req)
|
||
if err != nil {
|
||
logger.Error("oppoSendData err:", err)
|
||
return clueResp, err
|
||
}
|
||
|
||
body, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
logger.Error("oppoSendData err:", err)
|
||
return clueResp, err
|
||
}
|
||
fmt.Println("body:", string(body))
|
||
|
||
defer resp.Body.Close()
|
||
|
||
err = json.Unmarshal(body, &clueResp)
|
||
if err != nil {
|
||
logger.Error("clueResp err:", err)
|
||
return clueResp, err
|
||
}
|
||
|
||
return clueResp, nil
|
||
}
|
||
|
||
func generateToken(ownerID, apiID, apiKey string) string {
|
||
// 获取当前时间戳,精确到秒
|
||
timeStamp := time.Now().Unix()
|
||
// 转换时间戳为字符串
|
||
timeStampStr := strconv.FormatInt(timeStamp, 10)
|
||
|
||
// 计算签名字符串
|
||
signature := sha1.Sum([]byte(apiID + apiKey + timeStampStr))
|
||
signatureStr := fmt.Sprintf("%x", signature)
|
||
fmt.Println("signatureStr is:", signatureStr)
|
||
|
||
// 拼接所有内容并进行Base64编码
|
||
tokenContent := ownerID + "," + apiID + "," + timeStampStr + "," + signatureStr
|
||
token := base64.StdEncoding.EncodeToString([]byte(tokenContent))
|
||
fmt.Println("token is:", token)
|
||
|
||
return token
|
||
}
|
||
|
||
// randomIP 生成合法的随机IPv4地址
|
||
func randomIP() string {
|
||
// 设置随机数种子
|
||
rand.Seed(time.Now().UnixNano())
|
||
|
||
// 生成四个随机整数作为IPv4地址的四个部分
|
||
ip := fmt.Sprintf("%d.%d.%d.%d", rand.Intn(256), rand.Intn(256), rand.Intn(256), rand.Intn(256))
|
||
|
||
// 检查生成的IP是否合法
|
||
parsedIP := net.ParseIP(ip)
|
||
for parsedIP == nil || parsedIP.IsLoopback() || parsedIP.IsLinkLocalMulticast() || parsedIP.IsLinkLocalUnicast() || parsedIP.IsMulticast() || parsedIP.IsUnspecified() {
|
||
ip = fmt.Sprintf("%d.%d.%d.%d", rand.Intn(256), rand.Intn(256), rand.Intn(256), rand.Intn(256))
|
||
parsedIP = net.ParseIP(ip)
|
||
}
|
||
|
||
return ip
|
||
}
|
||
|
||
// 组合数据
|
||
func getNewOppoData(req *models.NewSendDataReq) models.OppoSendDataReq {
|
||
itemData1 := models.ClueDataItem{
|
||
Column: "姓名",
|
||
Desc: "姓名输入框",
|
||
IfNeed: true,
|
||
Type: "1",
|
||
Value: req.Name,
|
||
}
|
||
|
||
itemData2 := models.ClueDataItem{
|
||
Column: "电话",
|
||
Desc: "电话",
|
||
IfNeed: true,
|
||
Type: "3",
|
||
Value: req.Tel,
|
||
}
|
||
|
||
//itemData3 := models.ClueDataItem{}
|
||
//if len(req.Options) != 0 {
|
||
// itemData3.Column = "八大员"
|
||
// itemData3.Desc = "八大员"
|
||
// itemData3.IfNeed = true
|
||
// itemData3.Type = "6" // 多选
|
||
// itemData3.Options = req.Options
|
||
//}
|
||
|
||
var itemList []models.ClueDataItem
|
||
itemList = append(itemList, itemData1)
|
||
itemList = append(itemList, itemData2)
|
||
//if len(req.Options) != 0 {
|
||
// itemList = append(itemList, itemData3)
|
||
//}
|
||
|
||
strPageId, _ := strconv.ParseInt(pageIdValue, 10, 64)
|
||
|
||
var nOwnerId int64
|
||
if req.Type == 2 {
|
||
nOwnerId = OwnerIDNum12
|
||
} else {
|
||
nOwnerId = OwnerIDNum14
|
||
}
|
||
|
||
data := models.OppoSendDataReq{
|
||
PageId: strPageId,
|
||
OwnerId: nOwnerId,
|
||
Ip: randomIP(),
|
||
Tid: tidValue,
|
||
Lbid: lbidValue,
|
||
TransformType: TransformType,
|
||
Items: itemList,
|
||
}
|
||
|
||
return data
|
||
}
|