migu_music_server/app/admin/apis/cluemanage/clue.go
2025-03-28 14:07:20 +08:00

799 lines
21 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}