@@ -1,17 +1,16 @@ | |||||
package chain_transfer | package chain_transfer | ||||
import ( | import ( | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/chain_transfer/svc" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/haodanku" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/haodanku" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/taobao" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/taobao" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/tik_tok" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/tik_tok" | ||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/zhimeng" | |||||
"fmt" | "fmt" | ||||
"github.com/tidwall/gjson" | "github.com/tidwall/gjson" | ||||
"strings" | "strings" | ||||
"time" | |||||
"xorm.io/xorm" | "xorm.io/xorm" | ||||
) | ) | ||||
@@ -51,7 +50,7 @@ func ChainTransfer(eg *xorm.Engine, args map[string]string) map[string]string { | |||||
if tbItemInfo != nil { | if tbItemInfo != nil { | ||||
args["gid"] = zhios_third_party_utils.AnyToString(tbItemInfo.ItemID) | args["gid"] = zhios_third_party_utils.AnyToString(tbItemInfo.ItemID) | ||||
} | } | ||||
curls, err := ConvertUrl(eg, args) | |||||
curls, err := svc.ConvertUrl(eg, args) | |||||
if err != nil || curls == nil { | if err != nil || curls == nil { | ||||
return res | return res | ||||
} | } | ||||
@@ -149,7 +148,7 @@ func ChainTransfer(eg *xorm.Engine, args map[string]string) map[string]string { | |||||
} | } | ||||
if zhios_third_party_utils.InArr(args["provider"], []string{md.PVD_TB, md.PVD_TM}) == false { | if zhios_third_party_utils.InArr(args["provider"], []string{md.PVD_TB, md.PVD_TM}) == false { | ||||
curls, err := ConvertUrl(eg, args) | |||||
curls, err := svc.ConvertUrl(eg, args) | |||||
if err != nil || curls == nil { | if err != nil || curls == nil { | ||||
return res | return res | ||||
} | } | ||||
@@ -167,167 +166,3 @@ func ChainTransfer(eg *xorm.Engine, args map[string]string) map[string]string { | |||||
} | } | ||||
return res | return res | ||||
} | } | ||||
func ConvertUrl(eg *xorm.Engine, args map[string]string) (*md.ConvertedUrls, error) { | |||||
var ( | |||||
err error | |||||
) | |||||
var urls *md.ConvertedUrls | |||||
switch args["provider"] { | |||||
case md.PVD_TB, md.PVD_TM: | |||||
taobaoSdk, err := taobao.NewTaobaoSDK(eg, args["master_id"], args["platform"], zhios_third_party_utils.StrToInt(args["acc_taobao_share_id"])) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
tb := taobaoSdk | |||||
var promoId = tb.CloudPromoIdWeb | |||||
if promoId == "" { | |||||
promoId = tb.SharePromoIdWeb | |||||
} | |||||
var promoId1 string | |||||
var taobaoShareId1 string | |||||
var IsWxTaobaoAuth bool | |||||
fmt.Println(IsWxTaobaoAuth) | |||||
if zhios_third_party_utils.StrToInt(args["acc_taobao_share_id"]) == 0 { | |||||
if tb.AppletIsAuth == "1" { | |||||
IsWxTaobaoAuth, taobaoShareId1, promoId1 = taobao.TaobaoRelationPid(eg, args) | |||||
if IsWxTaobaoAuth == false { | |||||
return nil, err | |||||
} else { | |||||
promoId = promoId1 | |||||
} | |||||
} | |||||
} | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
urls, err = zhimeng.TaobaoConvertUrl(thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, args["gid"], promoId, tb.UserSID, "", tb.Svc_AK) | |||||
if urls != nil { | |||||
if taobaoShareId1 != "" { | |||||
urls.TbShareId = zhios_third_party_utils.StrToInt64(taobaoShareId1) | |||||
} | |||||
if promoId1 != "" { | |||||
urls.NewPid = promoId1 | |||||
} | |||||
} | |||||
case md.PVD_JDS: | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
// 初始化京东配置 | |||||
pid := args["acc_jd_share_id"] | |||||
postData := make(map[string]interface{}) | |||||
postData["gid"] = args["gid"] | |||||
postData["appkey"] = thirdZmAppKeyData.Val | |||||
postData["secret_key"] = thirdZmAppSecretData.Val | |||||
jdData, err := zhimeng.NewZhiMengJingDongSDK(). | |||||
SelectFunction("getgoodsinfo"). | |||||
WithArgs(postData). | |||||
Result() | |||||
mdData := &md.MoreDetailResponse{} | |||||
// to struct | |||||
couponUrl := "" | |||||
couponPrice := "" | |||||
err = jdData.ToStruct(mdData) | |||||
if err == nil && mdData != nil && mdData.CouponURL != "" { | |||||
couponUrl = mdData.CouponURL | |||||
couponPrice = mdData.CouponPrice | |||||
} | |||||
urls, err = zhimeng.JDConvertUrl( | |||||
thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, | |||||
args["gid"], | |||||
pid, | |||||
couponUrl, | |||||
couponPrice, | |||||
"") | |||||
case md.PVD_TIKTOK, md.PVD_KUAISHOU: | |||||
pid := "cloud_" + args["uid"] | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
tikTokArgs := map[string]interface{}{ | |||||
"appkey": thirdZmAppKeyData.Val, | |||||
"secret_key": thirdZmAppSecretData.Val, | |||||
"product_url": args["coupon_url"], | |||||
"external_info": pid, | |||||
} | |||||
if args["provider"] == md.PVD_TIKTOK { | |||||
tikTokArgs["need_qr_code"] = "0" | |||||
tikTokBase, _ := tik_tok.Base(eg, args["master_id"], "") | |||||
if zhios_third_party_utils.InArr(tikTokBase.AuthType, []string{"2", "3"}) { | |||||
if time.Now().Unix() > 1670055300 { | |||||
tikTokArgs["external_info"] = pid + "_" + args["master_id"] | |||||
} | |||||
urls, err = tik_tok.OwnTikTokUrl(tikTokBase, tikTokArgs) | |||||
} else { | |||||
tikTokArgs["external_info"] = pid + "_" + args["master_id"] | |||||
urls, err = zhimeng.TikTokUrl(tikTokArgs) | |||||
} | |||||
} else if args["provider"] == md.PVD_KUAISHOU { | |||||
tikTokArgs["gid"] = args["gid"] | |||||
tikTokArgs["linkType"] = "101" | |||||
tikTokArgs["genPoster"] = "0" | |||||
tikTokArgs["external_info"] = pid + "_" + args["master_id"] | |||||
urls, err = zhimeng.KuaiShouUrl(tikTokArgs) | |||||
} | |||||
case md.PVD_VIP: | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
// 初始化vip配置 | |||||
pid := args["master_id"] + "_vip_cloud_" + args["uid"] | |||||
openId := args["master_id"] + "_vip_" + args["uid"] | |||||
urls, err = zhimeng.VipConvertUrl( | |||||
thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, | |||||
args["gid"], | |||||
pid, | |||||
"", "vendoapi", openId, "1") | |||||
case md.PVD_PDD: | |||||
pid := args["acc_pdd_self_id"] | |||||
thirdZmAppKeyData, err := db.SysCfgGetOne(eg, "third_zm_app_key") | |||||
if thirdZmAppKeyData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
thirdZmAppSecretData, err := db.SysCfgGetOne(eg, "third_zm_app_secret") | |||||
if thirdZmAppSecretData == nil || err != nil { | |||||
return urls, err | |||||
} | |||||
miniApp := "0" | |||||
isShares := "2" | |||||
urls, err = zhimeng.PDDConvertUrl( | |||||
thirdZmAppKeyData.Val, | |||||
thirdZmAppSecretData.Val, | |||||
args["gid"], | |||||
pid, | |||||
"", | |||||
miniApp, | |||||
"0", isShares) | |||||
} | |||||
return urls, err | |||||
} |
@@ -0,0 +1,149 @@ | |||||
package svc | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/offical" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/kuaishou" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/zhimeng" | |||||
"encoding/json" | |||||
"github.com/tidwall/gjson" | |||||
"xorm.io/xorm" | |||||
) | |||||
func KuaiShouKlGoods(eg *xorm.Engine, officialEg *xorm.Engine, dbName string, tikTokArgs map[string]interface{}) *zhimeng.TikTokDetailData { | |||||
arg := map[string]interface{}{ | |||||
"cpsLink": tikTokArgs["content"], | |||||
} | |||||
param, kuaishouData := GetKuaishouKey(eg, officialEg, dbName) | |||||
if kuaishouData["authType"] != "2" { | |||||
goods, _ := zhimeng.KuaiShouKlGoods(tikTokArgs) | |||||
return goods | |||||
} | |||||
param["param"] = zhios_third_party_utils.SerializeStr(arg) | |||||
data, err := kuaishou.GetKuishouCpsKlGoods(kuaishouData["sign_secret"], param) | |||||
goods := gjson.Get(data, "data.itemId").String() | |||||
if goods == "" || err != nil { | |||||
return nil | |||||
} | |||||
detail := KuaiShouDetail(eg, officialEg, dbName, map[string]interface{}{"gid": []string{goods}}) | |||||
return detail | |||||
} | |||||
func GetKuaishouKey(eg *xorm.Engine, officialEg *xorm.Engine, dbName string) (map[string]string, map[string]string) { | |||||
kuaishouData := CommKuaishou(eg, officialEg, dbName) | |||||
param := map[string]string{ | |||||
"appkey": kuaishouData["appkey"], | |||||
"access_token": kuaishouData["token"], | |||||
} | |||||
return param, kuaishouData | |||||
} | |||||
func KuaiShouDetail(eg *xorm.Engine, officialEg *xorm.Engine, dbName string, tikTokArgs map[string]interface{}) *zhimeng.TikTokDetailData { | |||||
arg := map[string]interface{}{ | |||||
"itemId": []interface{}{tikTokArgs["gid"]}, | |||||
} | |||||
param, kuaishouData := GetKuaishouKey(eg, officialEg, dbName) | |||||
if kuaishouData["authType"] != "2" { | |||||
goods, _ := zhimeng.KuaiShouDetail(tikTokArgs) | |||||
return goods | |||||
} | |||||
param["param"] = zhios_third_party_utils.SerializeStr(arg) | |||||
data, err := kuaishou.GetKuishouCpsGoodsDetail(kuaishouData["sign_secret"], param) | |||||
goods := gjson.Get(data, "data").String() | |||||
if goods == "" || err != nil { | |||||
return nil | |||||
} | |||||
var list = make([]md.KuaishouGoods, 0) | |||||
err = json.Unmarshal([]byte(goods), &list) | |||||
if err != nil { | |||||
return nil | |||||
} | |||||
var detail = zhimeng.TikTokDetailData{} | |||||
for _, v := range list { | |||||
if zhios_third_party_utils.IntToStr(v.GoodsId) == zhios_third_party_utils.AnyToString(tikTokArgs["gid"]) { | |||||
detail = CommGoodsDetail(v) | |||||
} | |||||
} | |||||
return &detail | |||||
} | |||||
func CommGoodsDetail(goods md.KuaishouGoods) zhimeng.TikTokDetailData { | |||||
var res = zhimeng.TikTokDetailData{ | |||||
Commission: zhios_third_party_utils.Float64ToStr(float64(goods.PromotionRate) / 10), | |||||
CostPrice: zhios_third_party_utils.Float64ToStr(float64(goods.GoodsPrice) / 100), | |||||
GoodsID: zhios_third_party_utils.IntToStr(goods.GoodsId), | |||||
GoodsImg: goods.GoodsImageUrl, | |||||
GoodsSales: zhios_third_party_utils.IntToStr(goods.SalesTip), | |||||
GoodsTitle: goods.GoodsTitle, | |||||
Price: zhios_third_party_utils.Float64ToStr(float64(goods.ZkGoodsPrice) / 100), | |||||
ShopID: zhios_third_party_utils.IntToStr(goods.MallId), | |||||
ShopName: goods.MallName, | |||||
} | |||||
img, ok := goods.GoodsGalleryUrls.([]interface{}) | |||||
res.Imgs = make([]string, 0) | |||||
if ok { | |||||
for _, v := range img { | |||||
res.Imgs = append(res.Imgs, zhios_third_party_utils.AnyToString(v)) | |||||
} | |||||
} | |||||
detailImg, ok := goods.ItemDescUrls.([]interface{}) | |||||
res.DetailImgs = make([]string, 0) | |||||
if ok { | |||||
for _, v := range detailImg { | |||||
res.DetailImgs = append(res.DetailImgs, zhios_third_party_utils.AnyToString(v)) | |||||
} | |||||
} | |||||
return res | |||||
} | |||||
func CommKuaishou(eg *xorm.Engine, officialEg *xorm.Engine, dbName string) map[string]string { | |||||
kuaishouAppkey := offical.MasterListCfgGetOneData(officialEg, "0", "kuaishou_appkey") | |||||
kuaishouAppSecret := offical.MasterListCfgGetOneData(officialEg, "0", "kuaishou_app_secret") | |||||
kuaishouSignSecret := offical.MasterListCfgGetOneData(officialEg, "0", "kuaishou_sign_secret") | |||||
kuaishouToken := offical.MasterListCfgGetOneData(officialEg, "0", "kuaishou_token") | |||||
kuaishouPid := offical.MasterListCfgGetOneData(officialEg, "0", "kuaishou_pid") | |||||
puid := AppUserListPuidWithDb(officialEg, dbName) | |||||
puidKuaishouAppkey := offical.MasterListCfgGetOneData(officialEg, puid, "kuaishou_appkey") | |||||
if puidKuaishouAppkey != "" { | |||||
kuaishouAppkey = puidKuaishouAppkey | |||||
} | |||||
puidKuaishouSignSecret := offical.MasterListCfgGetOneData(officialEg, puid, "kuaishou_sign_secret") | |||||
if puidKuaishouSignSecret != "" { | |||||
kuaishouSignSecret = puidKuaishouSignSecret | |||||
} | |||||
puidKuaishouToken := offical.MasterListCfgGetOneData(officialEg, puid, "kuaishou_token") | |||||
if puidKuaishouToken != "" { | |||||
kuaishouToken = puidKuaishouToken | |||||
} | |||||
puidKuaishouPid := offical.MasterListCfgGetOneData(officialEg, puid, "kuaishou_pid") | |||||
if puidKuaishouPid != "" { | |||||
kuaishouPid = puidKuaishouPid | |||||
} | |||||
cfg, _ := db.SysUnionByKuaishouByUseByAuth(eg, dbName) | |||||
authType := "" | |||||
pid := kuaishouPid | |||||
if cfg != nil && cfg.AuthType == 2 { //自有 | |||||
authType = zhios_third_party_utils.IntToStr(cfg.AuthType) | |||||
kuaishouToken = gjson.Get(cfg.KeyData, "teamAccessToken").String() | |||||
pid = gjson.Get(cfg.KeyData, "pid").String() | |||||
} | |||||
res := map[string]string{ | |||||
"authType": authType, | |||||
"appkey": kuaishouAppkey, | |||||
"token": kuaishouToken, | |||||
"pid": pid, | |||||
"app_secret": kuaishouAppSecret, | |||||
"sign_secret": kuaishouSignSecret, | |||||
} | |||||
return res | |||||
} | |||||
func AppUserListPuidWithDb(officialEg *xorm.Engine, dbName string) string { | |||||
appList := offical.GetUserAppList(officialEg, dbName) | |||||
uid := "0" | |||||
if appList != nil && appList.Puid > 0 { | |||||
uid = zhios_third_party_utils.IntToStr(appList.Puid) | |||||
} | |||||
return uid | |||||
} |
@@ -0,0 +1,101 @@ | |||||
package svc | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/tik_tok" | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"fmt" | |||||
"strings" | |||||
"xorm.io/xorm" | |||||
) | |||||
func CommTik(eg *xorm.Engine, dbName, url string) map[string]string { | |||||
activityId := 0 | |||||
teamToken := "" | |||||
commission := "" | |||||
if strings.Contains(url, "ecommerce") { | |||||
tikTokBase, _ := tik_tok.Base(eg, dbName, "") | |||||
tikTokBase.ExtendTeamTokenMap = GetTikTokTeamTokenEg(eg, dbName, url) | |||||
isSet := 0 | |||||
for _, v1 := range tikTokBase.ExtendTeamTokenMap { | |||||
if isSet == 1 { | |||||
continue | |||||
} | |||||
if v1 != "" { | |||||
rgs := map[string]string{ | |||||
"appkey": tikTokBase.ApiTeamAppKey, | |||||
"appSecret": tikTokBase.ApiTeamAppSecret, | |||||
"acctoken": zhios_third_party_utils.AnyToString(v1), | |||||
"activity_url": url, | |||||
} | |||||
urlMap := tik_tok.ColonelMultiParseActivityUrl(rgs) | |||||
if urlMap[url].ActivityId != 0 { | |||||
isSet = 1 | |||||
activityId = urlMap[url].ActivityId | |||||
teamToken = zhios_third_party_utils.AnyToString(v1) | |||||
commission = zhios_third_party_utils.Float64ToStr(float64(urlMap[url].CommissionRate) / 100) | |||||
} | |||||
} | |||||
} | |||||
} | |||||
res := map[string]string{ | |||||
"tik_activity_id": zhios_third_party_utils.IntToStr(activityId), | |||||
"tik_team_token": teamToken, | |||||
"tik_team_commission": commission, | |||||
} | |||||
return res | |||||
} | |||||
func GetTikTokTeamTokenEg(eg *xorm.Engine, dbName, url string) map[string]interface{} { | |||||
tmp := map[string]interface{}{} | |||||
zhiosOpenSelectionLibraryMasterId := db.SysCfgGetWithDb(eg, dbName, "zhios_open_selection_library_master_id") | |||||
if zhiosOpenSelectionLibraryMasterId == "" { | |||||
return tmp | |||||
} | |||||
bizData := map[string]interface{}{ | |||||
"mid": zhiosOpenSelectionLibraryMasterId, | |||||
} | |||||
returnData, err := OauthApiReqEg(eg, dbName, url, bizData, "inapi.selection_library.team_info_more", "1.0") | |||||
if returnData == nil || err != nil { | |||||
return tmp | |||||
} | |||||
data := returnData.Data.(map[string]interface{}) | |||||
return data | |||||
} | |||||
func GetKuaishouTeamTokenEg(eg *xorm.Engine, dbName, url string) map[string]interface{} { | |||||
tmp := map[string]interface{}{} | |||||
zhiosOpenSelectionLibraryMasterId := db.SysCfgGetWithDb(eg, dbName, "zhios_open_kuaishou_selection_library_master_id") | |||||
if zhiosOpenSelectionLibraryMasterId == "" { | |||||
return tmp | |||||
} | |||||
bizData := map[string]interface{}{ | |||||
"mid": zhiosOpenSelectionLibraryMasterId, | |||||
} | |||||
returnData, err := OauthApiReqEg(eg, dbName, url, bizData, "inapi.selection_library.kuaishou_team_info_more", "1.0") | |||||
if returnData == nil || err != nil { | |||||
return tmp | |||||
} | |||||
data := returnData.Data.(map[string]interface{}) | |||||
return data | |||||
} | |||||
func OauthApiReqEg(eg *xorm.Engine, dbName, url string, bizData map[string]interface{}, method, version string) (*zhios_third_party_utils.ReturnDataResp, error) { | |||||
openAppKey := db.SysCfgGetWithDb(eg, dbName, "zhios_open_app_key") | |||||
openAppSecret := db.SysCfgGetWithDb(eg, dbName, "zhios_open_app_secret") | |||||
// 创建请求 | |||||
openClient, err := zhios_third_party_utils.NewOpenPlatformReqClient(openAppKey, method, version, openAppSecret, bizData) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
openClient.Url = url | |||||
fmt.Println("return :", openClient.ReturnData) | |||||
// 发送请求 | |||||
err = openClient.SetBizDataToParams().CreateSign().CurlOpen() | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
return &openClient.ReturnData, nil | |||||
} |
@@ -0,0 +1,419 @@ | |||||
package chain_transfer | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/chain_transfer/svc" | |||||
taoke "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/dataoke" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"fmt" | |||||
"github.com/mvdan/xurls" | |||||
"regexp" | |||||
"strings" | |||||
"time" | |||||
"xorm.io/xorm" | |||||
) | |||||
func TurnChain(eg *xorm.Engine, officialEg *xorm.Engine, args map[string]string) md.TCPrase { | |||||
dbName := args["master_id"] | |||||
var tcPrase md.TCPrase | |||||
tcPrase.TurnGoods = make([]md.TurnGoods, 0) | |||||
db.UserFindByID(eg, args["uid"]) | |||||
now := time.Now() | |||||
PlatType := "" | |||||
args["platType"] = PlatType | |||||
user, _ := db.UserFindByID(eg, args["uid"]) | |||||
userProfile, _ := db.UserProfileFindByID(eg, user.Uid) | |||||
if userProfile != nil { | |||||
args["acc_taobao_share_id"] = zhios_third_party_utils.Int64ToStr(userProfile.AccTaobaoShareId) | |||||
if userProfile.AccJdCloudId == "" { | |||||
userProfile.AccJdCloudId = userProfile.AccJdShareId | |||||
} | |||||
args["acc_jd_share_id"] = userProfile.AccJdCloudId | |||||
args["acc_pdd_self_id"] = userProfile.AccPddSelfId | |||||
} | |||||
//1、识别出对应平台的口令或链接 | |||||
reqCount := args["content"] | |||||
if reqCount == "" { | |||||
return tcPrase | |||||
} | |||||
reqCount = strings.ReplaceAll(reqCount, "\n¥", "¥") | |||||
reqCount = strings.ReplaceAll(reqCount, "http", "\nhttp") | |||||
reqCounts := reqCount | |||||
if strings.Contains(reqCount, "¥") { | |||||
reqCounts = "" | |||||
splits := strings.Split(reqCount, "¥") | |||||
for k, v := range splits { | |||||
if k == 0 { | |||||
reqCounts += v + "\n¥" | |||||
} else if k+1 == len(splits) { | |||||
reqCounts += v | |||||
} else { | |||||
reqCounts += v + "¥" | |||||
} | |||||
} | |||||
} | |||||
reqCount = reqCounts | |||||
findAllUrl := xurls.Strict.FindAllString(reqCount, -1) | |||||
var pvd, goodsId, tklWord string | |||||
reg1 := regexp.MustCompile(`¥.*?¥`) | |||||
matched := reg1.FindAllStringSubmatch(reqCount, -1) | |||||
isTikTok := "0" | |||||
if strings.Contains(reqCount, "dou音") || strings.Contains(reqCount, "buydouke") || (strings.Contains(reqCount, "抖音") || strings.Contains(reqCount, "douyin")) && strings.Contains(reqCount, "【") { | |||||
isTikTok = "1" | |||||
} | |||||
split := strings.Split(reqCount, "\n") | |||||
reqCount = strings.ReplaceAll(reqCount, "\nhttp", "http") | |||||
if isTikTok == "1" { | |||||
pvd, goodsId, tklWord, _ := svc.FindTaobaoWord(eg, officialEg, args, reqCount, user) | |||||
if goodsId != "" || tklWord != "" { | |||||
tcPrase, _ = svc.CommGetGoods(eg, officialEg, args, tcPrase, 1, reqCount, pvd, goodsId, reqCount, tklWord, "0") | |||||
} | |||||
} else if len(split) > 0 { | |||||
for _, v := range split { | |||||
if strings.Contains(v, "m.tb") || strings.Contains(reqCount, "taobao.com") || strings.Contains(reqCount, "tmall.com") { | |||||
PlatType = "has" | |||||
} | |||||
if strings.Contains(v, "haohuo.jinritemai.") { | |||||
PlatType = "has" | |||||
} | |||||
if strings.Contains(v, "jd.") { | |||||
PlatType = "has" | |||||
} | |||||
if strings.Contains(v, "pinduoduo.com") || strings.Contains(v, "yangkeduo.com") { | |||||
PlatType = "has" | |||||
} | |||||
if strings.Contains(v, "kaola.com") { | |||||
PlatType = "has" | |||||
} | |||||
if strings.Contains(v, "suning.") { | |||||
PlatType = "has" | |||||
} | |||||
if strings.Contains(v, "vip.") { | |||||
PlatType = "has" | |||||
} | |||||
} | |||||
if PlatType == "" { | |||||
parse, _ := taoke.DaTaoKeContentParse(args["content"]) | |||||
//fmt.Println("============1", time.Since(now)) | |||||
args["platType"] = parse.PlatType | |||||
if parse.DataType == "activity" { | |||||
} | |||||
} | |||||
for k, v := range split { | |||||
if v == "" { | |||||
continue | |||||
} | |||||
isFirst := 1 | |||||
if k > 0 && tcPrase.GID != "" { | |||||
isFirst = 0 | |||||
} | |||||
if strings.Contains(v, "m.tb") || strings.Contains(reqCount, "taobao.com") || strings.Contains(reqCount, "tmall.com") { | |||||
// 淘口令 | |||||
//fmt.Println(s) | |||||
pvd, goodsId, tklWord, _ = svc.FindTaobaoWord(eg, officialEg, args, v, user) | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, pvd, goodsId, v, tklWord, "0") | |||||
} | |||||
if strings.Contains(v, "haohuo.jinritemai.") { | |||||
//https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3556342393857024570&ins_activity_param=yNAkhfs&origin_type=pc_buyin_group&pick_source=v.6nZos | |||||
tikTokBase := svc.CommTik(eg, dbName, v) | |||||
url := strings.ReplaceAll(v, "?", "&") + "&" | |||||
split := strings.Split(url, "&id=") | |||||
if len(split) == 2 { | |||||
split1 := strings.Split(split[1], "&") | |||||
if len(split1) > 0 { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_TIKTOK, split1[0], v, tklWord, "0") | |||||
if zhios_third_party_utils.StrToInt(tikTokBase["tik_activity_id"]) > 0 && strings.Contains(tcPrase.GID, "cid") == false { | |||||
tcPrase.GID += "cid" + tikTokBase["tik_activity_id"] | |||||
} | |||||
} | |||||
} | |||||
} | |||||
if strings.Contains(v, "jd.") { | |||||
//只有链接带有.html才会剥离出商品id | |||||
if strings.Contains(v, ".html") { | |||||
var index int | |||||
s1 := v | |||||
split := strings.Split(s1, "/") | |||||
for i, s := range split { | |||||
if strings.Contains(s, ".html") { | |||||
index = i | |||||
} | |||||
} | |||||
goodsidStrs := strings.Split(split[index], ".html") | |||||
if len(goodsidStrs) > 0 { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_JD, goodsidStrs[0], v, tklWord, "0") | |||||
} | |||||
} else { | |||||
findAllUrl1 := xurls.Strict.FindAllString(v, -1) | |||||
for _, v1 := range findAllUrl1 { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_JD, "", v1, tklWord, "0") | |||||
} | |||||
} | |||||
} | |||||
if strings.Contains(v, "pinduoduo.com") || strings.Contains(v, "yangkeduo.com") { | |||||
split := strings.Split(v, "?") | |||||
if len(split) > 1 { | |||||
sUrl := strings.Split(split[1], "&") | |||||
if len(sUrl) > 0 { | |||||
for _, v2 := range sUrl { | |||||
if strings.Contains(v2, "goods_id=") { | |||||
goods := strings.Split(v2, "=") | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_PDD, goods[1], v, tklWord, "0") | |||||
} | |||||
} | |||||
} | |||||
} else { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_PDD, "", v, tklWord, "0") | |||||
} | |||||
} | |||||
if strings.Contains(v, "kaola.com") { | |||||
var index int | |||||
s1 := v | |||||
split := strings.Split(s1, "/") | |||||
for i, s := range split { | |||||
if strings.Contains(s, ".html") { | |||||
index = i | |||||
} | |||||
} | |||||
goodsidStrs := strings.Split(split[index], ".html") | |||||
if len(goodsidStrs) > 0 { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_KL, goodsidStrs[0], v, tklWord, "0") | |||||
} | |||||
return tcPrase | |||||
} | |||||
if strings.Contains(v, "suning.") { | |||||
r, _ := regexp.Compile(`/(\d+)/(\d+).html`) | |||||
reg := r.FindStringSubmatch(v) | |||||
if len(reg) < 3 { | |||||
return tcPrase | |||||
} | |||||
bytes := []byte(reg[2]) | |||||
var index int | |||||
for i, b := range bytes { | |||||
if b != byte(48) { | |||||
index = i | |||||
break | |||||
} | |||||
} | |||||
i := bytes[index:len(bytes)] | |||||
fmt.Println(string(i)) | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_SN, string(i), v, tklWord, "0") | |||||
} | |||||
if strings.Contains(v, "vip.") { | |||||
gid := "" | |||||
if strings.Contains(v, "goodsId=") { | |||||
split := strings.Split(v+"&", "&") | |||||
for _, v := range split { | |||||
if strings.Contains(v, "goodsId=") { | |||||
gid = strings.ReplaceAll(v, "goodsId=", "") | |||||
} | |||||
} | |||||
} else { | |||||
var index int | |||||
s1 := v | |||||
split := strings.Split(s1, "/") | |||||
for i, s := range split { | |||||
if strings.Contains(s, ".html") { | |||||
index = i | |||||
} | |||||
} | |||||
goodsidStrs := strings.Split(split[index], ".html") | |||||
if len(goodsidStrs) > 0 { | |||||
product := strings.Split(goodsidStrs[0], "-") | |||||
gid = product[len(product)-1] | |||||
} | |||||
} | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_VIP, gid, v, tklWord, "0") | |||||
} | |||||
newV := strings.ToLower(v) | |||||
for i := 0; i < 10; i++ { | |||||
newV = strings.ReplaceAll(newV, zhios_third_party_utils.IntToStr(i), "") | |||||
} | |||||
if strings.Contains(v, "¥") == false && strings.Contains(v, "http") == false { | |||||
var numArr = []string{"、", "-", "~", ".", "。", "!", "/", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} | |||||
for _, v1 := range numArr { | |||||
newV = strings.ReplaceAll(newV, v1, "") | |||||
} | |||||
} | |||||
if goodsId == "" && zhios_third_party_utils.IsAllChinese(newV) == false && (PlatType == "taobao" || PlatType == "") { | |||||
pvd, goodsId, word, _ := svc.FindTaobaoWord(eg, officialEg, args, v, user) | |||||
if goodsId == "" && pvd == "" { | |||||
continue | |||||
} | |||||
url := "" | |||||
if zhios_third_party_utils.InArr(pvd, []string{md.PVD_TB, md.PVD_TM}) { | |||||
url = v | |||||
v = "" | |||||
} | |||||
if pvd == md.PVD_KUAISHOU { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, pvd, goodsId, v, word, "1") | |||||
} else { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, pvd, goodsId, v, url, "0") | |||||
} | |||||
} | |||||
fmt.Println("============"+zhios_third_party_utils.IntToStr(k+3), time.Since(now)) | |||||
} | |||||
fmt.Println("============30", time.Since(now)) | |||||
} else if matched != nil && len(matched) > 0 { | |||||
for k, v := range matched { | |||||
isFirst := 1 | |||||
if k > 0 && tcPrase.GID != "" { | |||||
isFirst = 0 | |||||
} | |||||
for _, v1 := range v { | |||||
pvd, goodsId, _, _ := svc.FindTaobaoWord(eg, officialEg, args, v1, user) | |||||
url := "" | |||||
if len(findAllUrl) > 0 { | |||||
url = findAllUrl[k] | |||||
} | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, pvd, goodsId, url, v1, "1") | |||||
} | |||||
} | |||||
} else if len(findAllUrl) > 0 && isTikTok == "0" { | |||||
for k, v := range findAllUrl { | |||||
isFirst := 1 | |||||
if k > 0 && tcPrase.GID != "" { | |||||
isFirst = 0 | |||||
} | |||||
if strings.Contains(v, "m.tb") || | |||||
strings.Contains(reqCount, "taobao.com") || strings.Contains(reqCount, "tmall.com") { | |||||
// 淘口令 | |||||
//fmt.Println(s) | |||||
pvd, goodsId, tklWord, _ = svc.FindTaobaoWord(eg, officialEg, args, v, user) | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, pvd, goodsId, v, tklWord, "0") | |||||
} | |||||
if strings.Contains(v, "haohuo.jinritemai.") { | |||||
tikTokBase := svc.CommTik(eg, args["master_id"], v) | |||||
url := strings.ReplaceAll(v, "?", "&") + "&" | |||||
split := strings.Split(url, "&id=") | |||||
if len(split) == 2 { | |||||
split1 := strings.Split(split[1], "&") | |||||
if len(split1) > 0 { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_TIKTOK, split1[0], v, tklWord, "0") | |||||
if zhios_third_party_utils.StrToInt(tikTokBase["tik_activity_id"]) > 0 && strings.Contains(tcPrase.GID, "cid") == false { | |||||
tcPrase.GID += "cid" + tikTokBase["tik_activity_id"] | |||||
} | |||||
} | |||||
} | |||||
} | |||||
if strings.Contains(v, "jd.") { | |||||
//只有链接带有.html才会剥离出商品id | |||||
if strings.Contains(v, ".html") { | |||||
var index int | |||||
s1 := v | |||||
split := strings.Split(s1, "/") | |||||
for i, s := range split { | |||||
if strings.Contains(s, ".html") { | |||||
index = i | |||||
} | |||||
} | |||||
goodsidStrs := strings.Split(split[index], ".html") | |||||
if len(goodsidStrs) > 0 { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_JD, goodsidStrs[0], v, tklWord, "0") | |||||
} | |||||
} else { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_JD, "", v, tklWord, "0") | |||||
} | |||||
} | |||||
if strings.Contains(v, "pinduoduo.com") || strings.Contains(v, "yangkeduo.com") { | |||||
split := strings.Split(v, "?") | |||||
if len(split) > 1 { | |||||
sUrl := strings.Split(split[1], "&") | |||||
if len(sUrl) > 0 { | |||||
for _, v2 := range sUrl { | |||||
if strings.Contains(v2, "goods_id=") { | |||||
goods := strings.Split(v2, "=") | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_PDD, goods[1], v, tklWord, "0") | |||||
} | |||||
} | |||||
} | |||||
} else { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_PDD, "", v, tklWord, "0") | |||||
} | |||||
} | |||||
if strings.Contains(v, "kaola.com") { | |||||
var index int | |||||
s1 := v | |||||
split := strings.Split(s1, "/") | |||||
for i, s := range split { | |||||
if strings.Contains(s, ".html") { | |||||
index = i | |||||
} | |||||
} | |||||
goodsidStrs := strings.Split(split[index], ".html") | |||||
if len(goodsidStrs) > 0 { | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_KL, goodsidStrs[0], v, tklWord, "0") | |||||
} | |||||
return tcPrase | |||||
} | |||||
if strings.Contains(v, "suning.") { | |||||
r, _ := regexp.Compile(`/(\d+)/(\d+).html`) | |||||
reg := r.FindStringSubmatch(v) | |||||
if len(reg) < 3 { | |||||
return tcPrase | |||||
} | |||||
bytes := []byte(reg[2]) | |||||
var index int | |||||
for i, b := range bytes { | |||||
if b != byte(48) { | |||||
index = i | |||||
break | |||||
} | |||||
} | |||||
i := bytes[index:len(bytes)] | |||||
fmt.Println(string(i)) | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_SN, string(i), v, tklWord, "0") | |||||
} | |||||
if strings.Contains(v, "vip.") { | |||||
gid := "" | |||||
if strings.Contains(v, "goodsId=") { | |||||
split := strings.Split(v+"&", "&") | |||||
for _, v := range split { | |||||
if strings.Contains(v, "goodsId=") { | |||||
gid = strings.ReplaceAll(v, "goodsId=", "") | |||||
} | |||||
} | |||||
} else { | |||||
var index int | |||||
s1 := v | |||||
split := strings.Split(s1, "/") | |||||
for i, s := range split { | |||||
if strings.Contains(s, ".html") { | |||||
index = i | |||||
} | |||||
} | |||||
goodsidStrs := strings.Split(split[index], ".html") | |||||
if len(goodsidStrs) > 0 { | |||||
product := strings.Split(goodsidStrs[0], "-") | |||||
gid = product[len(product)-1] | |||||
} | |||||
} | |||||
tcPrase, reqCount = svc.CommGetGoods(eg, officialEg, args, tcPrase, isFirst, reqCount, md.PVD_VIP, gid, v, tklWord, "0") | |||||
} | |||||
} | |||||
} else { | |||||
pvd, goodsId, tklWord, _ := svc.FindTaobaoWord(eg, officialEg, args, reqCount, user) | |||||
if goodsId != "" { | |||||
tcPrase, _ = svc.CommGetGoods(eg, officialEg, args, tcPrase, 1, reqCount, pvd, goodsId, "", tklWord, "0") | |||||
} | |||||
} | |||||
return tcPrase | |||||
} |
@@ -0,0 +1,55 @@ | |||||
package dataoke | |||||
import ( | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils/cache" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/tidwall/gjson" | |||||
) | |||||
type ContentParse struct { | |||||
ItemId string `json:"itemId"` | |||||
ItemLink string `json:"itemLink"` | |||||
ItemName string `json:"itemName"` | |||||
DataType string `json:"dataType"` | |||||
PlatType string `json:"platType"` | |||||
MainPic string `json:"mainPic"` | |||||
MonthSales interface{} `json:"monthSales"` | |||||
OriginalPrice interface{} `json:"originalPrice"` | |||||
ActualPrice interface{} `json:"actualPrice"` | |||||
CommissionRate interface{} `json:"commissionRate"` | |||||
CouponPrice interface{} `json:"coupon_price"` | |||||
Url string `json:"url"` | |||||
} | |||||
func DaTaoKeContentParse(content string) (data ContentParse, err error) { | |||||
key := "new_" + content | |||||
get, err := cache.GetString(key) | |||||
if get == "" || err != nil { | |||||
params := map[string]string{ | |||||
"version": "v1.0.0", | |||||
"content": key, | |||||
} | |||||
resp, err := SendReq("https://openapi.dataoke.com/api/dels/kit/contentParse", params) | |||||
if err != nil { | |||||
return data, err | |||||
} | |||||
list := gjson.Get(string(resp), "data").String() | |||||
err = json.Unmarshal([]byte(list), &data) | |||||
if err != nil { | |||||
return data, err | |||||
} | |||||
if data.DataType != "goods" { | |||||
return data, errors.New("不是商品") | |||||
} | |||||
if data.ItemId != "" { | |||||
_, err := cache.SetEx(content, zhios_third_party_utils.SerializeStr(data), 15*86400) | |||||
fmt.Println(err) | |||||
} | |||||
} else { | |||||
json.Unmarshal([]byte(get), &data) | |||||
} | |||||
return data, nil | |||||
} |
@@ -123,3 +123,17 @@ func SysUnionById(eg *xorm.Engine, id string) *model.SysUnionSet { | |||||
} | } | ||||
return &data | return &data | ||||
} | } | ||||
func SysUnionByKuaishouByUseByAuth(Db *xorm.Engine, masterId string) (*model.SysUnionSet, error) { | |||||
var ( | |||||
m model.SysUnionSet | |||||
) | |||||
has, err := Db.Where("provider = 'kuaishou' AND is_use = 1 ").Get(&m) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if !has { | |||||
return nil, errors.New("找不到联盟设置") | |||||
} | |||||
return &m, nil | |||||
} |
@@ -0,0 +1,19 @@ | |||||
package offical | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/offical/model" | |||||
"xorm.io/xorm" | |||||
) | |||||
func MasterListCfgGetOneData(eg *xorm.Engine, uid, key string) string { | |||||
var cfgList model.MasterListCfg | |||||
has, err := eg.Where("`k`=? and uid=?", key, uid).Get(&cfgList) | |||||
if err != nil { | |||||
return "" | |||||
} | |||||
if has == false { | |||||
cfgList = model.MasterListCfg{Uid: uid, K: key} | |||||
eg.InsertOne(&cfgList) | |||||
} | |||||
return cfgList.V | |||||
} |
@@ -0,0 +1,15 @@ | |||||
package offical | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/offical/model" | |||||
"xorm.io/xorm" | |||||
) | |||||
func GetUserAppList(eg *xorm.Engine, uid string) *model.UserAppList { | |||||
var data model.UserAppList | |||||
get, err := eg.Where("uuid=?", uid).Get(&data) | |||||
if get == false || err != nil { | |||||
return nil | |||||
} | |||||
return &data | |||||
} |
@@ -0,0 +1,9 @@ | |||||
package model | |||||
type MasterListCfg struct { | |||||
K string `json:"k" xorm:"not null VARCHAR(255)"` | |||||
V string `json:"v" xorm:"TEXT"` | |||||
Memo string `json:"memo" xorm:"VARCHAR(255)"` | |||||
Uid string `json:"uid" xorm:"comment('0是官方') VARCHAR(255)"` | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
} |
@@ -0,0 +1,33 @@ | |||||
package model | |||||
type UserAppList struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
Uuid int `json:"uuid" xorm:"not null comment('masterId') INT(10)"` | |||||
Uid int `json:"uid" xorm:"not null comment('用户ID') INT(10)"` | |||||
AppId int `json:"app_id" xorm:"not null comment('应用ID') INT(10)"` | |||||
PlanId string `json:"plan_id" xorm:"not null default '' comment('套餐ID') VARCHAR(100)"` | |||||
Expire int `json:"expire" xorm:"not null default 0 comment('过期时间') INT(10)"` | |||||
Name string `json:"name" xorm:"not null default '' comment('应用主名称') VARCHAR(32)"` | |||||
Icon string `json:"icon" xorm:"not null default '' comment('应用主图标') VARCHAR(250)"` | |||||
CreateTime int `json:"create_time" xorm:"not null default 0 comment('初次激活时间') INT(10)"` | |||||
RenewTime int `json:"renew_time" xorm:"not null default 0 comment('上次续费时间') INT(10)"` | |||||
Domain string `json:"domain" xorm:"not null default '' comment('域名') index VARCHAR(110)"` | |||||
DomainAlias string `json:"domain_alias" xorm:"not null default '' comment('域名别名') index VARCHAR(110)"` | |||||
Platform string `json:"platform" xorm:"not null default '' comment('平台信息 ios,android,applet') VARCHAR(100)"` | |||||
Info string `json:"info" xorm:"comment('平台名称如ios.name.#ddd;') TEXT"` | |||||
PayMode int `json:"pay_mode" xorm:"not null default 1 comment('付费模式,0授信,1付款') TINYINT(1)"` | |||||
Price float32 `json:"price" xorm:"not null default 0.00 comment('应用价格') FLOAT(10,2)"` | |||||
PricePay float32 `json:"price_pay" xorm:"not null default 0.00 comment('实际付款价格') FLOAT(10,2)"` | |||||
OfficialPrice float32 `json:"official_price" xorm:"not null default 0.00 comment('应用价格') FLOAT(10,2)"` | |||||
OfficialPricePay float32 `json:"official_price_pay" xorm:"not null default 0.00 comment('实际付款价格') FLOAT(10,2)"` | |||||
State int `json:"state" xorm:"not null default 0 comment('0未创建,1正常,2停用,3过期') TINYINT(1)"` | |||||
DeleteAt int `json:"delete_at" xorm:"not null default 0 TINYINT(1)"` | |||||
CustomAndroidCount int `json:"custom_android_count" xorm:"default 0 comment('客户端安卓包名重置次数') INT(11)"` | |||||
CustomIosCount int `json:"custom_ios_count" xorm:"default 0 comment('客户端ios包名重置次数') INT(11)"` | |||||
StoreAndroidCount int `json:"store_android_count" xorm:"default 0 comment('商家端安卓包名重置次数') INT(11)"` | |||||
StoreIosCount int `json:"store_ios_count" xorm:"default 0 comment('商家端ios包名重置次数') INT(11)"` | |||||
SmsPlatform string `json:"sms_platform" xorm:"default 'mob' comment('mob ljioe联江') VARCHAR(255)"` | |||||
IsClose int `json:"is_close" xorm:"default 0 comment('是否关闭') INT(1)"` | |||||
Puid int `json:"puid" xorm:"default 0 comment('') INT(11)"` | |||||
StoreRateInfo string `json:"store_rate_info" xorm:"comment('付呗商品进件费率') TEXT"` | |||||
} |
@@ -11,6 +11,7 @@ require ( | |||||
github.com/google/go-cmp v0.5.9 // indirect | github.com/google/go-cmp v0.5.9 // indirect | ||||
github.com/jinzhu/copier v0.3.5 | github.com/jinzhu/copier v0.3.5 | ||||
github.com/kr/pretty v0.3.1 // indirect | github.com/kr/pretty v0.3.1 // indirect | ||||
github.com/mvdan/xurls v1.1.0 | |||||
github.com/nilorg/sdk v0.0.0-20221104025912-4b6ccb7004d8 | github.com/nilorg/sdk v0.0.0-20221104025912-4b6ccb7004d8 | ||||
github.com/onsi/ginkgo v1.16.5 // indirect | github.com/onsi/ginkgo v1.16.5 // indirect | ||||
github.com/onsi/gomega v1.19.0 // indirect | github.com/onsi/gomega v1.19.0 // indirect | ||||
@@ -279,6 +279,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN | |||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | ||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||
github.com/mvdan/xurls v1.1.0 h1:OpuDelGQ1R1ueQ6sSryzi6P+1RtBpfQHM8fJwlE45ww= | |||||
github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= | |||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | ||||
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= | github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= | ||||
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= | github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= | ||||
@@ -0,0 +1,17 @@ | |||||
package jd | |||||
func init() { | |||||
JDAppKey = "444ab671c4d095122916453d09af27fc" | |||||
JDAppSecret = "aef3c2745cc44194816d0c89c65b3847" | |||||
JDVersion = "1.0" | |||||
JDRouter = "https://router.jd.com/api" | |||||
// taoke.JDRouter = "https://api.jd.com/routerjson" | |||||
} | |||||
func send(method string, args map[string]interface{}) ([]byte, error) { | |||||
result, err := Execute(method, Arg{"goodsReq": args}) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
return result.MarshalJSON() | |||||
} |
@@ -0,0 +1,285 @@ | |||||
package jd | |||||
import ( | |||||
"bytes" | |||||
"crypto/md5" | |||||
"crypto/tls" | |||||
"encoding/hex" | |||||
"encoding/json" | |||||
"errors" | |||||
"io" | |||||
"io/ioutil" | |||||
"net/http" | |||||
"net/url" | |||||
"sort" | |||||
"strconv" | |||||
"strings" | |||||
"time" | |||||
"github.com/bitly/go-simplejson" | |||||
"github.com/nilorg/sdk/convert" | |||||
) | |||||
var ( | |||||
/**公用方法**/ | |||||
// Session 用户登录授权成功后,TOP颁发给应用的授权信息。当此API的标签上注明:“需要授权”,则此参数必传;“不需要授权”,则此参数不需要传;“可选授权”,则此参数为可选 | |||||
Session string | |||||
// Timeout ... | |||||
Timeout time.Duration | |||||
// CacheExpiration 缓存过期时间 | |||||
CacheExpiration = time.Hour | |||||
/**淘宝平台信息**/ | |||||
TaobaoAppKey string | |||||
TaobaoAppSecret string | |||||
TaobaoRouter string | |||||
TaobaoVersion = "2.0" | |||||
/**京东平台信息**/ | |||||
JDAppKey string | |||||
JDAppSecret string | |||||
JDRouter string | |||||
JDVersion = "2.0" | |||||
/**拼多多平台信息**/ | |||||
PDDAppKey string | |||||
PDDAppSecret string | |||||
PDDRouter string | |||||
PDDVersion = "v1.0" | |||||
/**考拉海购平台信息**/ | |||||
KaolaAppKey string | |||||
KaolaAppSecret string | |||||
KaolaRouter string | |||||
KaolaVersion = "1.0" | |||||
) | |||||
// Arg 参数 | |||||
type Arg map[string]interface{} | |||||
// copyArg 复制参数 | |||||
func copyArg(srcArgs Arg) Arg { | |||||
newArgs := make(Arg) | |||||
for key, value := range srcArgs { | |||||
newArgs[key] = value | |||||
} | |||||
return newArgs | |||||
} | |||||
// newCacheKey 创建缓存Key | |||||
func newCacheKey(p Arg) string { | |||||
cpArgs := copyArg(p) | |||||
delete(cpArgs, "session") | |||||
delete(cpArgs, "timestamp") | |||||
delete(cpArgs, "sign") | |||||
keys := []string{} | |||||
for k := range cpArgs { | |||||
keys = append(keys, k) | |||||
} | |||||
// 排序asc | |||||
sort.Strings(keys) | |||||
// 把所有参数名和参数值串在一起 | |||||
cacheKeyBuf := new(bytes.Buffer) | |||||
for _, k := range keys { | |||||
cacheKeyBuf.WriteString(k) | |||||
cacheKeyBuf.WriteString("=") | |||||
cacheKeyBuf.WriteString(interfaceToString(cpArgs[k])) | |||||
} | |||||
h := md5.New() | |||||
io.Copy(h, cacheKeyBuf) | |||||
return hex.EncodeToString(h.Sum(nil)) | |||||
} | |||||
// execute 执行API接口 | |||||
func execute(p Arg, router string) (bytes []byte, err error) { | |||||
err = checkConfig() | |||||
if err != nil { | |||||
return | |||||
} | |||||
var req *http.Request | |||||
req, err = http.NewRequest("POST", router, strings.NewReader(p.getReqData())) | |||||
if err != nil { | |||||
return | |||||
} | |||||
tr := &http.Transport{ | |||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, | |||||
} | |||||
req.Header.Add("Content-Type", "application/x-www-form-urlencoded;charset=utf-8") | |||||
httpClient := &http.Client{Transport: tr} | |||||
httpClient.Timeout = Timeout | |||||
var resp *http.Response | |||||
resp, err = httpClient.Do(req) | |||||
if err != nil { | |||||
return | |||||
} | |||||
if resp.StatusCode != 200 { | |||||
err = errors.New("请求错误:" + strconv.Itoa(resp.StatusCode)) | |||||
return | |||||
} | |||||
defer resp.Body.Close() | |||||
bytes, err = ioutil.ReadAll(resp.Body) | |||||
// fmt.Printf("\n\n\nreq: %v\n\nresp: %v\n\n\n", p.getReqData(), string(bytes)) | |||||
return | |||||
} | |||||
// Execute 执行API接口 | |||||
func Execute(method string, p Arg) (res *simplejson.Json, err error) { | |||||
p, r := setReqData(p, method) | |||||
var bodyBytes []byte | |||||
bodyBytes, err = execute(p, r) | |||||
if err != nil { | |||||
return | |||||
} | |||||
return bytesToResult(bodyBytes) | |||||
} | |||||
func bytesToResult(bytes []byte) (res *simplejson.Json, err error) { | |||||
res, err = simplejson.NewJson(bytes) | |||||
if err != nil { | |||||
return | |||||
} | |||||
if responseError, ok := res.CheckGet("error_response"); ok { | |||||
if subMsg, subOk := responseError.CheckGet("sub_msg"); subOk { | |||||
err = errors.New(subMsg.MustString()) | |||||
} else if zhDesc, descOk := responseError.CheckGet("zh_desc"); descOk { | |||||
err = errors.New(zhDesc.MustString()) | |||||
} else { | |||||
err = errors.New(responseError.Get("msg").MustString()) | |||||
} | |||||
res = nil | |||||
} | |||||
return | |||||
} | |||||
// ExecuteCache 执行API接口,缓存 | |||||
// 检查配置 | |||||
func checkConfig() error { | |||||
if TaobaoAppKey == "" && JDAppKey == "" && KaolaAppKey == "" && PDDAppKey == "" { | |||||
return errors.New("至少需要设置一个平台参数") | |||||
} | |||||
return nil | |||||
} | |||||
//组装参数及添加公共参数 | |||||
func setReqData(p Arg, method string) (Arg, string) { | |||||
platform := strings.Split(method, ".")[0] | |||||
router := "" | |||||
hh, _ := time.ParseDuration("8h") | |||||
loc := time.Now().UTC().Add(hh) | |||||
if platform == "taobao" { | |||||
//淘宝 | |||||
p["timestamp"] = strconv.FormatInt(loc.Unix(), 10) | |||||
p["partner_id"] = "Blant" | |||||
p["app_key"] = TaobaoAppKey | |||||
p["v"] = TaobaoVersion | |||||
if Session != "" { | |||||
p["session"] = Session | |||||
} | |||||
p["method"] = method | |||||
p["format"] = "json" | |||||
p["sign_method"] = "md5" | |||||
// 设置签名 | |||||
p["sign"] = getSign(p, TaobaoAppSecret) | |||||
router = TaobaoRouter | |||||
} else if platform == "jd" { | |||||
//京东 | |||||
param := p | |||||
p = Arg{} | |||||
p["param_json"] = param | |||||
p["app_key"] = JDAppKey | |||||
p["v"] = JDVersion | |||||
p["timestamp"] = loc.Format("2006-01-02 15:04:05") | |||||
p["method"] = method | |||||
p["format"] = "json" | |||||
p["sign_method"] = "md5" | |||||
// 设置签名 | |||||
p["sign"] = getSign(p, JDAppSecret) | |||||
router = JDRouter | |||||
} else if platform == "pdd" { | |||||
//拼多多 | |||||
p["type"] = method | |||||
p["data_type"] = "json" | |||||
p["version"] = PDDVersion | |||||
p["client_id"] = PDDAppKey | |||||
p["timestamp"] = strconv.FormatInt(loc.Unix(), 10) | |||||
// 设置签名 | |||||
p["sign"] = getSign(p, PDDAppSecret) | |||||
router = PDDRouter | |||||
} else if platform == "kaola" { | |||||
//考拉海购 | |||||
p["method"] = method | |||||
p["v"] = KaolaVersion | |||||
p["signMethod"] = "md5" | |||||
p["unionId"] = KaolaAppKey | |||||
p["timestamp"] = loc.Format("2006-01-02 15:04:05") | |||||
// 设置签名 | |||||
p["sign"] = getSign(p, KaolaAppSecret) | |||||
router = KaolaRouter | |||||
} else if platform == "suning" { | |||||
// TODO 苏宁 | |||||
} else if platform == "vip" { | |||||
// TODO 唯品会 | |||||
} | |||||
return p, router | |||||
} | |||||
// 获取请求数据 | |||||
func (p Arg) getReqData() string { | |||||
// 公共参数 | |||||
args := url.Values{} | |||||
// 请求参数 | |||||
for key, val := range p { | |||||
args.Set(key, interfaceToString(val)) | |||||
} | |||||
return args.Encode() | |||||
} | |||||
// 获取签名 | |||||
func getSign(p Arg, secret string) string { | |||||
// 获取Key | |||||
var keys []string | |||||
for k := range p { | |||||
keys = append(keys, k) | |||||
} | |||||
// 排序asc | |||||
sort.Strings(keys) | |||||
// 把所有参数名和参数值串在一起 | |||||
query := bytes.NewBufferString(secret) | |||||
for _, k := range keys { | |||||
query.WriteString(k) | |||||
query.WriteString(interfaceToString(p[k])) | |||||
} | |||||
query.WriteString(secret) | |||||
// 使用MD5加密 | |||||
h := md5.New() | |||||
_, _ = io.Copy(h, query) | |||||
// 把二进制转化为大写的十六进制 | |||||
return strings.ToUpper(hex.EncodeToString(h.Sum(nil))) | |||||
} | |||||
func interfaceToString(src interface{}) string { | |||||
if src == nil { | |||||
panic(ErrTypeIsNil) | |||||
} | |||||
switch src.(type) { | |||||
case string: | |||||
return src.(string) | |||||
case int, int8, int32, int64: | |||||
case uint8, uint16, uint32, uint64: | |||||
case float32, float64: | |||||
return convert.ToString(src) | |||||
} | |||||
data, err := json.Marshal(src) | |||||
if err != nil { | |||||
panic(err) | |||||
} | |||||
return string(data) | |||||
} |
@@ -0,0 +1,5 @@ | |||||
package jd | |||||
func ConvertUrl() { | |||||
} |
@@ -0,0 +1,8 @@ | |||||
package jd | |||||
import "errors" | |||||
var ( | |||||
ErrTypeIsNil = errors.New("类型为Nil") | |||||
ErrTypeUnknown = errors.New("未处理到的数据类型") | |||||
) |
@@ -0,0 +1,15 @@ | |||||
package jd | |||||
// Featured is 京粉精选商品 https://open.jd.com/home/home#/doc/api?apiCateId=461&apiId=3588&apiName=jd.union.open.goods.jingfen.query | |||||
func Featured(r *RequestJD) ([]byte, error) { | |||||
method := "jd.union.open.goods.jingfen.query" | |||||
args := map[string]interface{}{ | |||||
"pageIndex": r.PageIndex, | |||||
"pageSize": r.PageSize, | |||||
// 1-好券商品,2-精选卖场,10-9.9包邮,15-京东配送,22-实时热销榜,23-为你推荐,24-数码家电,25-超市,26-母婴玩具,27-家具日用,28-美妆穿搭,29-医药保健,30-图书文具,31-今日必推,32-京东好物,33-京东秒杀,34-拼购商品,40-高收益榜,41-自营热卖榜,109-新品首发,110-自营,112-京东爆品,125-首购商品,129-高佣榜单,130-视频商品,153-历史最低价商品榜 | |||||
"eliteId": r.EliteID, | |||||
// 排序字段(price:单价, commissionShare:佣金比例, commission:佣金, inOrderCount30DaysSku:sku维度30天引单量,comments:评论数,goodComments:好评数) | |||||
"sortName": r.SortName, | |||||
} | |||||
return send(method, args) | |||||
} |
@@ -0,0 +1,19 @@ | |||||
package jd | |||||
// Guess is 猜你喜欢 https://open.jd.com/home/home#/doc/api?apiCateId=461&apiId=5479&apiName=jd.union.open.goods.material.query | |||||
func Guess(r *RequestJD) ([]byte, error) { | |||||
method := "jd.union.open.goods.material.query" | |||||
args := map[string]interface{}{ | |||||
"pageIndex": r.PageIndex, | |||||
"pageSize": r.PageSize, | |||||
// 1-好券商品,2-精选卖场,10-9.9包邮,15-京东配送,22-实时热销榜,23-为你推荐,24-数码家电,25-超市,26-母婴玩具,27-家具日用,28-美妆穿搭,29-医药保健,30-图书文具,31-今日必推,32-京东好物,33-京东秒杀,34-拼购商品,40-高收益榜,41-自营热卖榜,109-新品首发,110-自营,112-京东爆品,125-首购商品,129-高佣榜单,130-视频商品,153-历史最低价商品榜 | |||||
"eliteId": r.EliteID, | |||||
// 排序字段(price:单价, commissionShare:佣金比例, commission:佣金, inOrderCount30DaysSku:sku维度30天引单量,comments:评论数,goodComments:好评数) | |||||
"sortName": r.SortName, | |||||
} | |||||
if r.UserIDType != 0 && r.UserID != "" { | |||||
args["userIdType"] = r.UserIDType | |||||
args["userId"] = r.UserID | |||||
} | |||||
return send(method, args) | |||||
} |
@@ -0,0 +1,13 @@ | |||||
package jd | |||||
import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/zhimeng" | |||||
) | |||||
// NewZhiMengJingDongSDK is constructor | |||||
func NewZhiMengJingDongSDK() *zhimeng.SDK { | |||||
jd := &zhimeng.SDK{} | |||||
jd.Init(md.PVD_JD) | |||||
return jd | |||||
} |
@@ -0,0 +1,88 @@ | |||||
package jd | |||||
// 1-好券商品,2-精选卖场,10-9.9包邮,15-京东配送,22-实时热销榜,23-为你推荐,24-数码家电,25-超市,26-母婴玩具,27-家具日用,28-美妆穿搭,29-医药保健,30-图书文具,31-今日必推,32-京东好物,33-京东秒杀,34-拼购商品,40-高收益榜,41-自营热卖榜,109-新品首发,110-自营,112-京东爆品,125-首购商品,129-高佣榜单,130-视频商品,153-历史最低价商品榜 | |||||
// 排序字段(price:单价, commissionShare:佣金比例, commission:佣金, inOrderCount30DaysSku:sku维度30天引单量,comments:评论数,goodComments:好评数) | |||||
//RequestJD is 请求 京东sdk的参数 | |||||
type RequestJD struct { | |||||
PageIndex int `json:"page_index"` | |||||
PageSize int `json:"page_size"` | |||||
EliteID int `json:"elite_id"` | |||||
SortName string `json:"sort_name"` | |||||
UserIDType int `json:"userid_type"` | |||||
UserID string `json:"user_id"` | |||||
} | |||||
// JDFeaturedResponse is return from taoke.jd | |||||
type JDFeaturedResponse struct { | |||||
JdUnionOpenGoodsJingfenQueryResponse struct { | |||||
Code string `json:"code"` | |||||
Result string `json:"result"` | |||||
} `json:"jd_union_open_goods_jingfen_query_response"` | |||||
} | |||||
// JDFeature is jd 精选 for微信 | |||||
type JDFeature struct { | |||||
BrandCode string `json:"brandCode"` | |||||
BrandName string `json:"brandName"` | |||||
CategoryInfo struct { | |||||
Cid1 int `json:"cid1"` | |||||
Cid1Name string `json:"cid1Name"` | |||||
Cid2 int `json:"cid2"` | |||||
Cid2Name string `json:"cid2Name"` | |||||
Cid3 int `json:"cid3"` | |||||
Cid3Name string `json:"cid3Name"` | |||||
} `json:"categoryInfo"` | |||||
Comments int `json:"comments"` | |||||
CommissionInfo struct { | |||||
Commission float64 `json:"commission"` | |||||
CommissionShare float64 `json:"commissionShare"` | |||||
CouponCommission float64 `json:"couponCommission"` | |||||
PlusCommissionShare float64 `json:"plusCommissionShare"` | |||||
} `json:"commissionInfo"` | |||||
CouponInfo struct { | |||||
CouponList []struct { | |||||
BindType int `json:"bindType"` | |||||
Discount float64 `json:"discount"` | |||||
GetEndTime int64 `json:"getEndTime"` | |||||
GetStartTime int64 `json:"getStartTime"` | |||||
HotValue int `json:"hotValue"` | |||||
IsBest int `json:"isBest"` | |||||
Link string `json:"link"` | |||||
PlatformType int `json:"platformType"` | |||||
Quota float64 `json:"quota"` | |||||
UseEndTime int64 `json:"useEndTime"` | |||||
UseStartTime int64 `json:"useStartTime"` | |||||
} `json:"couponList"` | |||||
} `json:"couponInfo"` | |||||
GoodCommentsShare float64 `json:"goodCommentsShare"` | |||||
ImageInfo struct { | |||||
ImageList []struct { | |||||
URL string `json:"url"` | |||||
} `json:"imageList"` | |||||
} `json:"imageInfo"` | |||||
InOrderCount30Days int `json:"inOrderCount30Days"` | |||||
InOrderCount30DaysSku int `json:"inOrderCount30DaysSku"` | |||||
IsHot int `json:"isHot"` | |||||
MaterialURL string `json:"materialUrl"` | |||||
Owner string `json:"owner"` | |||||
PinGouInfo struct { | |||||
} `json:"pinGouInfo"` | |||||
PriceInfo struct { | |||||
LowestCouponPrice float64 `json:"lowestCouponPrice"` | |||||
LowestPrice float64 `json:"lowestPrice"` | |||||
LowestPriceType int `json:"lowestPriceType"` | |||||
Price float64 `json:"price"` | |||||
} `json:"priceInfo"` | |||||
ResourceInfo struct { | |||||
EliteID int `json:"eliteId"` | |||||
EliteName string `json:"eliteName"` | |||||
} `json:"resourceInfo"` | |||||
ShopInfo struct { | |||||
ShopID int `json:"shopId"` | |||||
ShopLevel float64 `json:"shopLevel"` | |||||
ShopName string `json:"shopName"` | |||||
} `json:"shopInfo"` | |||||
SkuID int64 `json:"skuId"` | |||||
SkuName string `json:"skuName"` | |||||
Spuid int64 `json:"spuid"` | |||||
} |
@@ -0,0 +1,13 @@ | |||||
package jd | |||||
func OrderTrack() { | |||||
method := "jd.union.open.order.query" | |||||
args := map[string]interface{}{ | |||||
"pageNo": "1", | |||||
"pageSize": "100", | |||||
"type": "3", | |||||
"key": "", | |||||
} | |||||
send(method, args) | |||||
return | |||||
} |
@@ -0,0 +1,15 @@ | |||||
package jd | |||||
// Recommend is 京东推荐商品https://open.jd.com/home/home#/doc/api?apiCateId=461&apiId=3588&apiName=jd.union.open.goods.jingfen.query | |||||
func Recommend(r *RequestJD) ([]byte, error) { | |||||
method := "jd.kpl.open.union.search.byelited" | |||||
args := map[string]interface{}{ | |||||
"pageIndex": r.PageIndex, | |||||
"pageSize": r.PageSize, | |||||
// 1-好券商品,2-超级大卖场,10-9.9专区,22-热销爆品,23-为你推荐,24-数码家电,25-超市,26-母婴玩具,27-家具日用,28-美妆穿搭,29-医药保健,30-图书文具,31-今日必推,32-品牌好货,33-秒杀商品,34-拼购商品,109-新品首发,110-自营,125-首购商品,129-高佣榜单,130-视频商品 | |||||
"eliteId": r.EliteID, | |||||
// 排序字段price:单价, commissionShare:佣金比例, commission:佣金, inOrderCount30DaysSku:sku维度30天引单量,comments:评论数,goodComments:好评数 | |||||
"sortName": r.SortName, | |||||
} | |||||
return send(method, args) | |||||
} |
@@ -0,0 +1,95 @@ | |||||
package jd | |||||
import ( | |||||
"encoding/json" | |||||
) | |||||
//SDK is sdk for jd | |||||
type SDK struct { | |||||
response []byte | |||||
fmap map[string]func(*RequestJD) | |||||
fname string | |||||
err error | |||||
} | |||||
//Init is init sdk | |||||
func (s *SDK) Init() { | |||||
s.fmap = make(map[string]func(*RequestJD)) | |||||
} | |||||
//SelectFunction is select func | |||||
func (s *SDK) SelectFunction(fname string) *SDK { | |||||
s.fname = fname | |||||
return s | |||||
} | |||||
//WithArgs is request args | |||||
func (s *SDK) WithArgs(args *RequestJD) *SDK { | |||||
f := s.fmap[s.fname] | |||||
f(args) | |||||
return s | |||||
} | |||||
// Result is func result | |||||
func (s *SDK) Result() (*SDK, error) { | |||||
return s, s.err | |||||
} | |||||
// Register is register func | |||||
func (s *SDK) Register(name string, f func(*RequestJD)) { | |||||
s.fmap[name] = f | |||||
} | |||||
//ToBytes is return []byte | |||||
func (s *SDK) ToBytes() []byte { | |||||
return s.response | |||||
} | |||||
// ToString is return string | |||||
func (s *SDK) ToString() string { | |||||
return string(s.response) | |||||
} | |||||
//ToMapInterface is return map[string]interface{} | |||||
func (s *SDK) ToMapInterface() map[string]interface{} { | |||||
m := make(map[string]interface{}) | |||||
json.Unmarshal(s.response, &m) | |||||
return m | |||||
} | |||||
// Featured is jd 精选列表 | |||||
func (s *SDK) Featured(r *RequestJD) { | |||||
d, err := Featured(r) | |||||
if err != nil { | |||||
s.err = err | |||||
} | |||||
s.response = d | |||||
} | |||||
// Guess is 猜你喜欢列表 | |||||
func (s *SDK) Guess(r *RequestJD) { | |||||
d, err := Guess(r) | |||||
if err != nil { | |||||
s.err = err | |||||
} | |||||
s.response = d | |||||
} | |||||
// Recommend is 推荐列表 | |||||
func (s *SDK) Recommend(r *RequestJD) { | |||||
d, err := Recommend(r) | |||||
if err != nil { | |||||
s.err = err | |||||
} | |||||
s.response = d | |||||
} | |||||
//NewJDSDK is jingdong sdk | |||||
func NewJDSDK() *SDK { | |||||
sdk := new(SDK) | |||||
sdk.Init() | |||||
sdk.Register("featured", sdk.Featured) | |||||
sdk.Register("guess", sdk.Guess) | |||||
sdk.Register("recommend", sdk.Recommend) | |||||
return sdk | |||||
} |
@@ -0,0 +1,101 @@ | |||||
package md | |||||
type KuaishouOrder struct { | |||||
Pcursor string `json:"pcursor"` | |||||
OrderView []OrderView `json:"orderView"` | |||||
} | |||||
type OrderView struct { | |||||
Oid int `json:"oid"` | |||||
ActivityUserId int `json:"activityUserId"` | |||||
ActivityId int `json:"activityId"` | |||||
CpsOrderStatus int `json:"cpsOrderStatus"` | |||||
OrderCreateTime int64 `json:"orderCreateTime"` | |||||
OrderTradeAmount int64 `json:"orderTradeAmount"` | |||||
PayAmount int `json:"payAmount"` | |||||
RegimentalPromotionRate int `json:"regimentalPromotionRate"` | |||||
RegimentalPromotionAmount int `json:"regimentalPromotionAmount"` | |||||
CpsOrderProductView []struct { | |||||
Oid int64 `json:"oid"` | |||||
ItemId int64 `json:"itemId"` | |||||
ItemTitle string `json:"itemTitle"` | |||||
ItemPrice int64 `json:"itemPrice"` | |||||
SellerId int64 `json:"sellerId"` | |||||
SellerNickName string `json:"sellerNickName"` | |||||
SkuId int `json:"skuId"` | |||||
} `json:"cpsOrderProductView"` | |||||
CreateTime int64 `json:"createTime"` | |||||
UpdateTime int64 `json:"updateTime"` | |||||
SendTime int64 `json:"sendTime"` | |||||
SendStatus int `json:"sendStatus"` | |||||
RecvTime int64 `json:"recvTime"` | |||||
PromotionId int `json:"promotionId"` | |||||
PromotionNickName string `json:"promotionNickName"` | |||||
PromotionType int `json:"promotionType"` | |||||
SettlementAmount int `json:"settlementAmount"` | |||||
SettlementTime int64 `json:"settlementTime"` | |||||
SettlementSuccessTime int64 `json:"settlementSuccessTime"` | |||||
BuyerOpenId string `json:"buyerOpenId"` | |||||
PromotionKwaiId string `json:"promotionKwaiId"` | |||||
ExpendRegimentalSettleAmount int `json:"expendRegimentalSettleAmount"` | |||||
ExpendEstimateSettleAmount int `json:"expendEstimateSettleAmount"` | |||||
ExpendRegimentalPromotionRate int `json:"expendRegimentalPromotionRate"` | |||||
BaseAmount int `json:"baseAmount"` | |||||
ShareRateStr string `json:"shareRateStr"` | |||||
ExcitationInCome int `json:"excitationInCome"` | |||||
ServiceIncome int `json:"serviceIncome"` | |||||
SettlementBizType int `json:"settlementBizType"` | |||||
FundType int `json:"fundType"` | |||||
KwaimoneyUserId int `json:"kwaimoneyUserId"` | |||||
KwaimoneyUserNickName string `json:"kwaimoneyUserNickName"` | |||||
} | |||||
type KuaishouGoods struct { | |||||
GoodsId int `json:"goodsId"` | |||||
GoodsPrice int `json:"goodsPrice"` | |||||
GoodsTitle string `json:"goodsTitle"` | |||||
GoodsDesc string `json:"goodsDesc"` | |||||
MallId int `json:"mallId"` | |||||
MallName string `json:"mallName"` | |||||
MallType int `json:"mallType"` | |||||
GoodsImageUrl string `json:"goodsImageUrl"` | |||||
CategoryId int `json:"categoryId"` | |||||
PromotionRate int `json:"promotionRate"` | |||||
SalesTip int `json:"salesTip"` | |||||
GoodsGalleryUrls interface{} `json:"goodsGalleryUrls"` | |||||
PromotionAmount int `json:"promotionAmount"` | |||||
ItemDescUrls interface{} `json:"itemDescUrls"` | |||||
ExpressId int `json:"expressId"` | |||||
ZkGoodsPrice int `json:"zkGoodsPrice"` | |||||
} | |||||
type KuaishouCpsOrder struct { | |||||
Oid int `json:"oid"` | |||||
CpsOrderStatus int `json:"cpsOrderStatus"` | |||||
OrderCreateTime int `json:"orderCreateTime"` | |||||
PayTime int `json:"payTime"` | |||||
OrderTradeAmount int `json:"orderTradeAmount"` | |||||
CreateTime int64 `json:"createTime"` | |||||
UpdateTime int64 `json:"updateTime"` | |||||
SettlementSuccessTime int64 `json:"settlementSuccessTime"` | |||||
SettlementAmount int `json:"settlementAmount"` | |||||
CpsKwaimoneyOrderProductView []struct { | |||||
Oid int `json:"oid"` | |||||
ItemId int `json:"itemId"` | |||||
ItemTitle string `json:"itemTitle"` | |||||
ItemPicUrl string `json:"itemPicUrl"` | |||||
ItemPrice int `json:"itemPrice"` | |||||
SkuDesc string `json:"skuDesc"` | |||||
EstimatedIncome int `json:"estimatedIncome"` | |||||
CommissionRate int `json:"commissionRate"` | |||||
PaymentFee int `json:"paymentFee"` | |||||
CpsPid string `json:"cpsPid"` | |||||
SellerId int `json:"sellerId"` | |||||
SellerNickname string `json:"sellerNickname"` | |||||
Num int `json:"num"` | |||||
CpsType int `json:"cpsType"` | |||||
DistributorId int `json:"distributorId"` | |||||
DistributorNickname string `json:"distributorNickname"` | |||||
Comments string `json:"comments"` | |||||
} `json:"cpsKwaimoneyOrderProductView"` | |||||
BaseAmount int `json:"baseAmount"` | |||||
ShareRateStr string `json:"shareRateStr"` | |||||
} |
@@ -0,0 +1,98 @@ | |||||
package md | |||||
type TCPrase struct { | |||||
Count string `json:"count"` //转链内容 | |||||
SuccessCount string `json:"success_count"` //转链内容 | |||||
FailCount string `json:"fail_count"` //转链内容 | |||||
GID string `json:"gid"` //商品id | |||||
GoodsMinImg string `json:"goods_min_img"` //商品小图片 | |||||
GoodsImg string `json:"goods_img"` //商品图片 | |||||
GoodsTitle string `json:"goods_title"` //商品标题 | |||||
Provider string `json:"provider"` //渠道代码 | |||||
ProviderName string `json:"provider_name"` //渠道名字 | |||||
GoodsCostPrice string `json:"goods_cost_price"` //原价 | |||||
Commission string `json:"commission"` //反的价钱 | |||||
FCommission string `json:"f_commission"` //反的价钱 | |||||
WlGoodsPrice string `json:"wl_goods_price"` //卷后价 | |||||
CouponPrice string `json:"coupon_price"` //优惠券价 | |||||
ShareValue string `json:"share_value"` //分享赚 | |||||
ProductDetail *ProductDetailResponse `json:"detail_data"` //商品详情 | |||||
TurnChainLink string `json:"turn_chain_link"` // 转链后的链接 | |||||
CommissionRate string `json:"commission_rate"` | |||||
Tkl string `json:"tkl"` // 淘口令 | |||||
IsTkl string `json:"is_tkl"` // 淘口令 | |||||
DownloadLink string `json:"downloadLink"` | |||||
InviteCode string `json:"invite_code"` | |||||
IsNeedAuth string `json:"is_need_auth"` | |||||
PlatType string `json:"plat_type"` | |||||
TurnGoods []TurnGoods `json:"turn_goods"` | |||||
} | |||||
type TurnGoods struct { | |||||
GID string `json:"gid"` //商品id | |||||
GoodsMinImg string `json:"goods_min_img"` //商品小图片 | |||||
GoodsImg string `json:"goods_img"` //商品图片 | |||||
GoodsTitle string `json:"goods_title"` //商品标题 | |||||
Provider string `json:"provider"` //渠道代码 | |||||
ProviderName string `json:"provider_name"` //渠道名字 | |||||
GoodsCostPrice string `json:"goods_cost_price"` //原价 | |||||
Commission string `json:"commission"` //反的价钱 | |||||
FCommission string `json:"f_commission"` //反的价钱 | |||||
WlGoodsPrice string `json:"wl_goods_price"` //卷后价 | |||||
CouponPrice string `json:"coupon_price"` //优惠券价 | |||||
ShareValue string `json:"share_value"` //分享赚 | |||||
ProductDetail *ProductDetailResponse `json:"detail_data"` //商品详情 | |||||
TurnChainLink string `json:"turn_chain_link"` // 转链后的链接 | |||||
CommissionRate string `json:"commission_rate"` | |||||
Tkl string `json:"tkl"` // 淘口令 | |||||
IsTkl string `json:"is_tkl"` // 淘口令 | |||||
Url string `json:"url"` | |||||
} | |||||
type ItemParseInfo struct { | |||||
ItemId string `json:"item_id"` // 商品ID | |||||
Title string `json:"title"` // 标题 | |||||
CategoryId string `json:"category_id"` // 目录ID | |||||
CategoryName string `json:"category_name"` // 目录名 | |||||
Price string `json:"price"` // 价格 | |||||
PriceOriginal string `json:"price_original"` // 原价 | |||||
Commission string `json:"commission"` // 可赚取佣金 | |||||
CommissionRate string `json:"commission_rate"` // 佣金比例 | |||||
CouponUrl string `json:"coupon_url"` // 优惠券地址 | |||||
DetailUrl string `json:"detail_url"` // 优惠券地址 | |||||
APPUrl string `json:"app_url"` // 唤起app地址 | |||||
CouponPrice float64 `json:"coupon_price"` // 优惠券面值 | |||||
FinalPrice string `json:"final_price"` // 券后价 | |||||
EarnPrice string `json:"earn_price"` //立省 | |||||
Thumbnail string `json:"thumbnail"` // 缩略图 | |||||
Provider string `json:"provider"` // 供应商 | |||||
ProviderName string `json:"providerName"` // 供应商名称 | |||||
GoodsDesc string `json:"goodsDesc"` //描述 | |||||
GoodsImgList []string `json:"goodsImgList"` //商品多组图片 | |||||
ImageList []string `json:"imgList"` | |||||
Video []interface{} `json:"video"` | |||||
InOrderCount string `json:"inOrderCount"` | |||||
DetailImgList []string `json:"detailImgList"` | |||||
GoodsSales string `json:"goods_sales"` | |||||
ShopName string `json:"shop_name"` | |||||
Word string `json:"word"` | |||||
Param ParamData `json:"param"` | |||||
IsNeedChangeUrl string `json:"is_need_change_url"` | |||||
Pvd string `json:"pvd"` | |||||
IsFav string `json:"is_fav"` | |||||
ShareUrlArgs map[string]interface{} `json:"share_url_args"` | |||||
FavArgs interface{} `json:"fav_args"` | |||||
ActivityId string `json:"activity_id"` | |||||
Url string `json:"url"` | |||||
NewProvider string `json:"new_provider"` | |||||
} | |||||
type ParamData struct { | |||||
GID string `json:"gid"` | |||||
GoodURL string `json:"good_url"` | |||||
CouponURL string `json:"coupon_url"` | |||||
CouponPrice string `json:"coupon_price"` | |||||
ActivityURL string `json:"activity_url"` | |||||
IsShare string `json:"is_share"` | |||||
IsFree string `json:"is_free"` | |||||
IsWxMini string `json:"is_wx_mini"` | |||||
Commission string `json:"commission"` | |||||
} |
@@ -0,0 +1,26 @@ | |||||
package md | |||||
// 美团 | |||||
type OfficialRecommendUrl struct { | |||||
Url string // 链接 | |||||
WxQrcodeUrl string | |||||
WxMiniprogramPath string | |||||
AppUrl string | |||||
Appid string | |||||
Id string //小程序原始id | |||||
TaobaoWord string | |||||
ClickUrl string | |||||
Seq string | |||||
Title string | |||||
Content string | |||||
SuccessContent string | |||||
} | |||||
type ActivityPlatform struct { | |||||
ActivityPlatformId string `json:"activity_id"` | |||||
MaterialId string `json:"material_id"` | |||||
ActivityPlatformUrl string `json:"url"` | |||||
} | |||||
type KaolaActivityList struct { | |||||
Url string `json:"shareLink"` | |||||
} |
@@ -65,6 +65,7 @@ type DetailResponse struct { | |||||
// MoreDetailResponse is for response detail | // MoreDetailResponse is for response detail | ||||
type MoreDetailResponse struct { | type MoreDetailResponse struct { | ||||
ClickUrl string `json:"click_url"` | |||||
GID string `json:"gid"` | GID string `json:"gid"` | ||||
GoodsImg string `json:"goods_img"` | GoodsImg string `json:"goods_img"` | ||||
GoodsTitle string `json:"goods_title"` | GoodsTitle string `json:"goods_title"` | ||||
@@ -162,6 +163,8 @@ type PlatformCss struct { | |||||
// ProductDetailResponse productdetail | // ProductDetailResponse productdetail | ||||
type ProductDetailResponse struct { | type ProductDetailResponse struct { | ||||
ClickUrl string `json:"click_url"` | |||||
IsNull string `json:"is_null"` | |||||
IsCanBuy string `json:"is_can_buy"` //是否能购买 | IsCanBuy string `json:"is_can_buy"` //是否能购买 | ||||
IsShowCouponList string `json:"is_show_coupon_list"` //是否展示优惠券弹出 | IsShowCouponList string `json:"is_show_coupon_list"` //是否展示优惠券弹出 | ||||
UserCouponAmount string `json:"user_coupon_amount"` //优惠券额度 | UserCouponAmount string `json:"user_coupon_amount"` //优惠券额度 | ||||
@@ -18,6 +18,7 @@ const ( | |||||
PVD_STARBUCKS = "starbucks" | PVD_STARBUCKS = "starbucks" | ||||
PVD_MCDONALD = "mcdonald" | PVD_MCDONALD = "mcdonald" | ||||
PVD_NAYUKI = "nayuki" | PVD_NAYUKI = "nayuki" | ||||
PVD_TIKTOKLIFE = "tikTok_life" | |||||
PVD_BURGERKING = "burger_king" | PVD_BURGERKING = "burger_king" | ||||
PVD_HEYTEA = "heytea" | PVD_HEYTEA = "heytea" | ||||
PVD_PIZZA = "pizza" | PVD_PIZZA = "pizza" | ||||
@@ -1,29 +1,30 @@ | |||||
package md | package md | ||||
type TikTokBase struct { | type TikTokBase struct { | ||||
AuthType string `json:"auth_type"` | |||||
LiveAuthType string `json:"live_auth_type"` | |||||
ApiGoodsAppKey string `json:"api_goods_app_key"` | |||||
ApiGoodsAppSecret string `json:"api_goods_app_secret"` | |||||
ApiTeamAppKey string `json:"api_team_app_key"` | |||||
ApiTeamAppSecret string `json:"api_team_app_secret"` | |||||
ApiLiveAppKey string `json:"api_live_app_key"` | |||||
ApiLiveAppSecret string `json:"api_live_app_secret"` | |||||
GoodsAccessToken string `json:"goods_access_token"` | |||||
LiveAccessToken string `json:"live_access_token"` | |||||
TeamAccessToken string `json:"team_access_token"` | |||||
GoodsPid string `json:"goods_pid"` | |||||
LivePid string `json:"live_pid"` | |||||
SysApiGoodsAppKey string `json:"sys_api_goods_app_key"` | |||||
SysApiGoodsAppSecret string `json:"sys_api_goods_app_secret"` | |||||
SysApiTeamAppKey string `json:"sys_api_team_app_key"` | |||||
SysApiTeamAppSecret string `json:"sys_api_team_app_secret"` | |||||
SysApiLiveAppKey string `json:"sys_api_live_app_key"` | |||||
SysApiLiveAppSecret string `json:"sys_api_live_app_secret"` | |||||
SysGoodsAccessToken string `json:"sys_goods_access_token"` | |||||
SysLiveAccessToken string `json:"sys_live_access_token"` | |||||
SysGoodsPid string `json:"sys_goods_pid"` | |||||
SysLivePid string `json:"sys_live_pid"` | |||||
AuthSubjectType string `json:"auth_subject_type"` | |||||
LiveAuthSubjectType string `json:"live_auth_subject_type"` | |||||
AuthType string `json:"auth_type"` | |||||
LiveAuthType string `json:"live_auth_type"` | |||||
ApiGoodsAppKey string `json:"api_goods_app_key"` | |||||
ApiGoodsAppSecret string `json:"api_goods_app_secret"` | |||||
ApiTeamAppKey string `json:"api_team_app_key"` | |||||
ApiTeamAppSecret string `json:"api_team_app_secret"` | |||||
ApiLiveAppKey string `json:"api_live_app_key"` | |||||
ApiLiveAppSecret string `json:"api_live_app_secret"` | |||||
GoodsAccessToken string `json:"goods_access_token"` | |||||
LiveAccessToken string `json:"live_access_token"` | |||||
TeamAccessToken string `json:"team_access_token"` | |||||
GoodsPid string `json:"goods_pid"` | |||||
LivePid string `json:"live_pid"` | |||||
SysApiGoodsAppKey string `json:"sys_api_goods_app_key"` | |||||
SysApiGoodsAppSecret string `json:"sys_api_goods_app_secret"` | |||||
SysApiTeamAppKey string `json:"sys_api_team_app_key"` | |||||
SysApiTeamAppSecret string `json:"sys_api_team_app_secret"` | |||||
SysApiLiveAppKey string `json:"sys_api_live_app_key"` | |||||
SysApiLiveAppSecret string `json:"sys_api_live_app_secret"` | |||||
SysGoodsAccessToken string `json:"sys_goods_access_token"` | |||||
SysLiveAccessToken string `json:"sys_live_access_token"` | |||||
SysGoodsPid string `json:"sys_goods_pid"` | |||||
SysLivePid string `json:"sys_live_pid"` | |||||
AuthSubjectType string `json:"auth_subject_type"` | |||||
LiveAuthSubjectType string `json:"live_auth_subject_type"` | |||||
ExtendTeamTokenMap map[string]interface{} `json:"extend_team_token_map"` | |||||
} | } |
@@ -9,6 +9,7 @@ type ExtraData struct { | |||||
// 转链后链接 | // 转链后链接 | ||||
type ConvertedUrls struct { | type ConvertedUrls struct { | ||||
ItemId string `json:"item_id"` | ItemId string `json:"item_id"` | ||||
ItemUrl string `json:"item_url"` | |||||
NumGoodsId string `json:"num_goods_id"` | NumGoodsId string `json:"num_goods_id"` | ||||
URL string `json:"url"` // 短链接 | URL string `json:"url"` // 短链接 | ||||
ShortenURL string `json:"open_app_url"` // 会打开app的长链接 | ShortenURL string `json:"open_app_url"` // 会打开app的长链接 | ||||
@@ -0,0 +1,49 @@ | |||||
package pdd | |||||
import ( | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"encoding/json" | |||||
"sort" | |||||
"strings" | |||||
"time" | |||||
) | |||||
var ( | |||||
PDD_HOST = "http://gw-api.pinduoduo.com/api/router" | |||||
PDD_AK = "43eed45f20d94fbf828744a77a45e3e2" | |||||
PDD_SK = "6ccdd6614f804ed8b0e23c2721be857da3a04b5b" | |||||
PDD_CS = "4ee672167e1ee51aa3a9ea864d33629a230a114c" | |||||
) | |||||
func send(args map[string]interface{}, method string) ([]byte, error) { | |||||
args["timestamp"] = zhios_third_party_utils.Int64ToStr(time.Now().UnixNano() / 1e6) | |||||
args["data_type"] = "JSON" | |||||
args["client_id"] = PDD_AK | |||||
args["type"] = method | |||||
args["sign"] = sign(args, PDD_CS) | |||||
bargs, err := json.Marshal(args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
return zhios_third_party_utils.CurlPost(PDD_HOST, bargs, nil) | |||||
} | |||||
func sign(m map[string]interface{}, sk string) string { | |||||
// key sort | |||||
keys := make([]string, 0, len(m)) | |||||
for k := range m { | |||||
keys = append(keys, k) | |||||
} | |||||
sort.Strings(keys) | |||||
str := "" | |||||
for _, k := range keys { | |||||
switch m[k].(type) { | |||||
case int: | |||||
str += k + zhios_third_party_utils.IntToStr(m[k].(int)) | |||||
case string: | |||||
str += k + m[k].(string) | |||||
} | |||||
} | |||||
str = sk + str + sk | |||||
return strings.ToUpper(zhios_third_party_utils.Md5(str)) | |||||
} |
@@ -0,0 +1,13 @@ | |||||
package pdd | |||||
// 多多进宝API | |||||
// https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.recommend.get | |||||
//func Detail() { | |||||
// method := "pdd.ddk.goods.recommend.get" | |||||
// args := map[string]interface{}{ | |||||
// "channel_type": "", // 非必填, 0-1.9包邮, 1-今日爆款, 2-品牌清仓,3-相似商品推荐,4-猜你喜欢,5-实时热销,6-实时收益,7-今日畅销,8-高佣榜单,默认1 | |||||
// "limit": 400, // 非必填, 请求数量;默认值 : 400 | |||||
// "offset": 400, // 非必填, 从多少位置开始请求;默认值 : 0,offset需是limit的整数倍,仅支持整页翻页 | |||||
// //"list_id": "", // 非必填,翻页时建议填写前页返回的list_id值 | |||||
// } | |||||
//} |
@@ -0,0 +1,10 @@ | |||||
package pdd | |||||
import "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/zhimeng" | |||||
// NewZhiMengJingDongSDK is constructor | |||||
func NewZhiMengPDDSDK() *zhimeng.SDK { | |||||
pdd := &zhimeng.SDK{} | |||||
pdd.Init("pdd") | |||||
return pdd | |||||
} |
@@ -0,0 +1,91 @@ | |||||
package pdd | |||||
import ( | |||||
"encoding/json" | |||||
) | |||||
type PddRecommendItem struct { | |||||
CouponRemainQuantity int `json:"coupon_remain_quantity"` | |||||
PromotionRate int `json:"promotion_rate"` | |||||
CatIds []int `json:"cat_ids"` | |||||
CouponMinOrderAmount int `json:"coupon_min_order_amount"` | |||||
MallID int `json:"mall_id"` | |||||
MallName string `json:"mall_name"` | |||||
CouponTotalQuantity int `json:"coupon_total_quantity"` | |||||
MerchantType string `json:"merchant_type"` | |||||
LgstTxt string `json:"lgst_txt"` | |||||
GoodsName string `json:"goods_name"` | |||||
SalesTip string `json:"sales_tip"` | |||||
GoodsID string `json:"goods_sign"` | |||||
DescTxt string `json:"desc_txt"` | |||||
PredictPromotionRate int `json:"predict_promotion_rate"` | |||||
GoodsDesc string `json:"goods_desc"` | |||||
OptName string `json:"opt_name"` | |||||
GoodsThumbnailURL string `json:"goods_thumbnail_url"` | |||||
OptID string `json:"opt_id"` | |||||
OptIds []int `json:"opt_ids"` | |||||
SearchID string `json:"search_id"` | |||||
GoodsImageURL string `json:"goods_image_url"` | |||||
HasCoupon bool `json:"has_coupon"` | |||||
MinNormalPrice float64 `json:"min_normal_price"` | |||||
ServTxt string `json:"serv_txt"` | |||||
CouponStartTime int `json:"coupon_start_time"` | |||||
MinGroupPrice float64 `json:"min_group_price"` | |||||
CouponDiscount int `json:"coupon_discount"` | |||||
CouponEndTime int `json:"coupon_end_time"` | |||||
} | |||||
type PddRecommend struct { | |||||
GoodsBasicDetailResponse struct { | |||||
Total int `json:"total"` | |||||
ListID string `json:"list_id"` | |||||
List []PddRecommendItem `json:"list"` | |||||
RequestID string `json:"request_id"` | |||||
SearchID string `json:"search_id"` | |||||
} `json:"goods_basic_detail_response"` | |||||
} | |||||
// 多多进宝API | |||||
// https://open.pinduoduo.com/application/document/api?id=pdd.ddk.goods.recommend.get | |||||
func Recommend(page, size, id, gid, cid string) (*PddRecommend, error) { | |||||
method := "pdd.ddk.goods.recommend.get" | |||||
args := map[string]interface{}{ | |||||
//"channel_type": id, // 非必填, 0-1.9包邮, 1-今日爆款, 2-品牌清仓,3-相似商品推荐,4-猜你喜欢,5-实时热销,6-实时收益,7-今日畅销,8-高佣榜单,默认1 | |||||
"limit": size, // 非必填, 请求数量;默认值 : 400 | |||||
"offset": page, // 非必填, 从多少位置开始请求;默认值 : 0,offset需是limit的整数倍,仅支持整页翻页 | |||||
//"list_id": "", // 非必填,翻页时建议填写前页返回的list_id值 | |||||
} | |||||
//fmt.Println(gid) | |||||
if id != "" { | |||||
args["channel_type"] = id | |||||
} | |||||
if gid != "" { | |||||
args["goods_ids"] = []string{gid} | |||||
args["channel_type"] = "3" | |||||
} | |||||
if cid != "" { | |||||
//20100-百货,20200-母婴,20300-食品,20400-女装,20500-电器,20600-鞋包,20700-内衣,20800-美妆,20900-男装,21000-水果,21100-家纺,21200-文具,21300-运动,21400-虚拟,21500-汽车,21600-家装,21700-家具,21800-医药; | |||||
args["cat_id"] = cid | |||||
args["channel_type"] = "4" | |||||
} | |||||
// fmt.Println(args) | |||||
data, err := send(args, method) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
// fmt.Println(string(data)) | |||||
r := new(PddRecommend) | |||||
if err := json.Unmarshal(data, &r); err != nil { | |||||
return nil, err | |||||
} | |||||
return r, nil | |||||
} | |||||
// 爆款排行商品接口 | |||||
//func Hot() { | |||||
// method := "pdd.ddk.top.goods.list.query" | |||||
// args := map[string]interface{}{ | |||||
// "limit": 400, // 非必填, 请求数量;默认值 : 400 | |||||
// "offset": 400, // 非必填, 从多少位置开始请求;默认值 : 0,offset需是limit的整数倍,仅支持整页翻页 | |||||
// "sort_type": "", // 非必填, 1-实时热销榜;2-实时收益榜 | |||||
// } | |||||
//} |
@@ -180,3 +180,39 @@ func OwnTikTokUrl(tikTokBase *md.TikTokBase, tikTokArgs map[string]interface{}) | |||||
H5Url: url["share_link"], | H5Url: url["share_link"], | ||||
}, nil | }, nil | ||||
} | } | ||||
func OwnTikTokActUrl(tikTokBase *md.TikTokBase, tikTokArgs map[string]interface{}) (*md.ConvertedUrls, error) { | |||||
args := map[string]string{ | |||||
"appkey": tikTokBase.ApiGoodsAppKey, | |||||
"appSecret": tikTokBase.ApiGoodsAppSecret, | |||||
"activity_id": zhios_third_party_utils.AnyToString(tikTokArgs["activity_id"]), | |||||
"mix_activity_id": zhios_third_party_utils.AnyToString(tikTokArgs["mix_activity_id"]), | |||||
"need_qr_code": zhios_third_party_utils.AnyToString(tikTokArgs["need_qr_code"]), | |||||
"external_info": zhios_third_party_utils.AnyToString(tikTokArgs["external_info"]), | |||||
"pid": tikTokBase.GoodsPid, | |||||
"acctoken": tikTokBase.GoodsAccessToken, | |||||
} | |||||
fmt.Println("抖音", args) | |||||
var url map[string]string | |||||
var err string | |||||
if tikTokBase.AuthSubjectType == "DouKe" { | |||||
args["material_id"] = zhios_third_party_utils.AnyToString(tikTokArgs["material_id"]) | |||||
url, err = DkActConvertUrl(args) | |||||
} else { | |||||
url, err = ActConvertUrl(args) | |||||
} | |||||
//url, err = tik_tok.ActConvertUrl(args) | |||||
if err != "" { | |||||
return nil, errors.New(err) | |||||
} | |||||
content, _ := php2go.Base64Decode(url["content"]) | |||||
return &md.ConvertedUrls{ | |||||
URL: url["deeplink"], | |||||
ShortenURL: url["deeplink"], | |||||
NoOpenAppURL: url["deeplink"], | |||||
AppURL: url["deeplink"], | |||||
ClickUrl: url["deeplink"], | |||||
QrcodeUrl: url["qr_code"], | |||||
Content: content, | |||||
}, nil | |||||
} |
@@ -3,8 +3,10 @@ package tik_tok | |||||
import ( | import ( | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | ||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/zhimeng" | |||||
"encoding/json" | "encoding/json" | ||||
"fmt" | "fmt" | ||||
"github.com/jinzhu/copier" | |||||
"github.com/syyongx/php2go" | "github.com/syyongx/php2go" | ||||
"github.com/tidwall/gjson" | "github.com/tidwall/gjson" | ||||
"strings" | "strings" | ||||
@@ -280,3 +282,34 @@ func CommGoodsDetail(goods TikTokGoodsLm) TikTokGoods { | |||||
return tmp | return tmp | ||||
} | } | ||||
func OwnTikTokGoodsKlNew(tikTokBase *md.TikTokBase, tikTokArgs map[string]interface{}) (*zhimeng.TikTokDetailData, error) { | |||||
args := map[string]string{ | |||||
"appkey": tikTokBase.ApiGoodsAppKey, | |||||
"appSecret": tikTokBase.ApiGoodsAppSecret, | |||||
"content": php2go.Base64Encode(tikTokArgs["content"].(string)), | |||||
"acctoken": tikTokBase.SysGoodsAccessToken, | |||||
} | |||||
for k, v := range args { | |||||
if v == "<nil>" { | |||||
args[k] = "" | |||||
} | |||||
} | |||||
var data = zhimeng.TikTokDetailData{} | |||||
goods := GetKlGoodsNew(args) | |||||
if goods.ActivityId != "" { | |||||
data.ActivityId = goods.ActivityId | |||||
return &data, nil | |||||
} | |||||
if goods.GoodsID == "" { | |||||
return nil, nil | |||||
} | |||||
err := copier.Copy(&data, goods) | |||||
if err != nil { | |||||
return nil, nil | |||||
} | |||||
if zhios_third_party_utils.StrToFloat64(data.YhqPrice) > 0 { | |||||
data.Price = data.CostPrice | |||||
} | |||||
return &data, nil | |||||
} |
@@ -0,0 +1,135 @@ | |||||
package zhios_third_party_utils | |||||
import ( | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"sort" | |||||
"time" | |||||
) | |||||
// 调用开放平台的封装 | |||||
type OpenPlatformReqClient struct { | |||||
AppKey string | |||||
AppSecret string | |||||
Method string | |||||
Version string | |||||
Timestamp string | |||||
Nonce string | |||||
Url string | |||||
Sign string | |||||
BizData map[string]interface{} | |||||
params map[string]string | |||||
ReturnData ReturnDataResp | |||||
} | |||||
type ReturnDataResp struct { | |||||
Code int `json:"code"` | |||||
Msg string `json:"msg"` | |||||
Data interface{} `json:"data"` | |||||
} | |||||
func NewOpenPlatformReqClient(appKey, method, version, appSecret string, bizData map[string]interface{}) (*OpenPlatformReqClient, error) { | |||||
if appKey == "" || appSecret == "" || method == "" || version == "" { | |||||
return nil, errors.New("appKey,method,version not allow empty") | |||||
} | |||||
nowStr := AnyToString(time.Now().Unix()) | |||||
nonce := UUIDString() | |||||
return &OpenPlatformReqClient{ | |||||
AppKey: appKey, | |||||
AppSecret: appSecret, | |||||
Method: method, | |||||
Version: version, | |||||
Nonce: nonce, | |||||
Timestamp: nowStr, | |||||
params: map[string]string{"app_key": appKey, "method": method, "version": version, "timestamp": nowStr, "nonce": nonce}, | |||||
BizData: bizData, | |||||
}, nil | |||||
} | |||||
func (client *OpenPlatformReqClient) CurlOpen() error { | |||||
if client.params == nil { | |||||
return errors.New("params not allow empty") | |||||
} | |||||
url := client.Url + "/api/open/gw" | |||||
fmt.Printf("%#v\n", string(Serialize(client.params))) | |||||
resp, err := CurlPost(url, Serialize(client.params), nil) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
err = json.Unmarshal(resp, &client.ReturnData) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} | |||||
/*func (client *OpenPlatformReqClient) CreateParams() *OpenPlatformReqClient { | |||||
client.params["timestamp"] = client.Timestamp | |||||
client.params["nonce"] = client.Nonce | |||||
//client.params["biz_data"] = SerializeStr(client.BizData) | |||||
return client | |||||
}*/ | |||||
func (client *OpenPlatformReqClient) SetBizDataToParams() *OpenPlatformReqClient { | |||||
client.params["biz_data"] = SerializeStr(client.BizData) | |||||
return client | |||||
} | |||||
func (client *OpenPlatformReqClient) SetParams(key, value string) *OpenPlatformReqClient { | |||||
client.params[key] = value | |||||
return client | |||||
} | |||||
func (client *OpenPlatformReqClient) GetParams(key string) string { | |||||
return client.params[key] | |||||
} | |||||
func (client *OpenPlatformReqClient) CreateSign() *OpenPlatformReqClient { | |||||
/*if client.BizData != nil { | |||||
for key := range client.BizData { | |||||
client.params[key] = AnyToString2(client.BizData[key]) | |||||
} | |||||
}*/ | |||||
var keys []string | |||||
for key := range client.params { | |||||
keys = append(keys, key) | |||||
} | |||||
sort.Strings(keys) | |||||
str := "" | |||||
for _, key := range keys { | |||||
str += fmt.Sprintf("%v=%v&", key, client.params[key]) | |||||
} | |||||
str = client.AppSecret + str[:len(str)-1] + client.AppSecret | |||||
fmt.Printf("sign: %s\n", str) | |||||
client.Sign = Md5(str) | |||||
client.params["sign"] = client.Sign | |||||
if client.BizData != nil { | |||||
for key := range client.BizData { | |||||
if _, ok := client.params[key]; ok { | |||||
delete(client.params, key) | |||||
} | |||||
} | |||||
} | |||||
return client | |||||
} | |||||
func (client *OpenPlatformReqClient) VerifySign(sign string) bool { | |||||
if sign == "" || client.Sign == "" { | |||||
return false | |||||
} | |||||
if client.Sign == sign { | |||||
return true | |||||
} | |||||
return false | |||||
} | |||||
func (client *OpenPlatformReqClient) ResetNonce() *OpenPlatformReqClient { | |||||
client.Nonce = UUIDString() | |||||
return client | |||||
} | |||||
func (client *OpenPlatformReqClient) ResetTimestamp() *OpenPlatformReqClient { | |||||
client.Timestamp = AnyToString(time.Now().Unix()) | |||||
return client | |||||
} |
@@ -5,9 +5,12 @@ import ( | |||||
"github.com/syyongx/php2go" | "github.com/syyongx/php2go" | ||||
"math/rand" | "math/rand" | ||||
"reflect" | "reflect" | ||||
"regexp" | |||||
"sort" | "sort" | ||||
"strings" | "strings" | ||||
"time" | "time" | ||||
"unicode" | |||||
"unicode/utf8" | |||||
) | ) | ||||
func Implode(glue string, args ...interface{}) string { | func Implode(glue string, args ...interface{}) string { | ||||
@@ -36,6 +39,43 @@ func InArrToInt(target int, str_array []int) bool { | |||||
return false | return false | ||||
} | } | ||||
//是否有中文 | |||||
func IsChineseChar(str string) bool { | |||||
for _, r := range str { | |||||
if unicode.Is(unicode.Scripts["Han"], r) || (regexp.MustCompile("[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]").MatchString(string(r))) { | |||||
return true | |||||
} | |||||
} | |||||
return false | |||||
} | |||||
func FilterEmoji(content string) string { | |||||
new_content := "" | |||||
for _, value := range content { | |||||
_, size := utf8.DecodeRuneInString(string(value)) | |||||
if size <= 3 { | |||||
new_content += string(value) | |||||
} | |||||
} | |||||
return new_content | |||||
} | |||||
func IsAllChinese(str string) bool { | |||||
str = FilterEmoji(str) | |||||
arr := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "/", ":"} | |||||
for _, v := range arr { | |||||
str = strings.ReplaceAll(str, v, "") | |||||
} | |||||
strNew := str | |||||
for _, c := range strNew { | |||||
if !unicode.Is(unicode.Scripts["Han"], c) { | |||||
return false | |||||
} | |||||
} | |||||
return true | |||||
} | |||||
//把数组的值放到key里 | //把数组的值放到key里 | ||||
func ArrayColumn(array interface{}, key string) (result map[string]interface{}, err error) { | func ArrayColumn(array interface{}, key string) (result map[string]interface{}, err error) { | ||||
result = make(map[string]interface{}) | result = make(map[string]interface{}) | ||||
@@ -56,3 +56,39 @@ func KuaiShouGoods(tikTokArgs map[string]interface{}) []map[string]string { | |||||
} | } | ||||
return goods | return goods | ||||
} | } | ||||
func KuaiShouKlGoods(tikTokArgs map[string]interface{}) (*TikTokDetailData, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": tikTokArgs["appkey"], | |||||
"secret_key": tikTokArgs["secret_key"], | |||||
"content": tikTokArgs["content"], | |||||
} | |||||
resp, err := Send("kuaishou", "getKlGoods", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data TikTokDetailData `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &tmp.Data, nil | |||||
} | |||||
func KuaiShouDetail(tikTokArgs map[string]interface{}) (*TikTokDetailData, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": tikTokArgs["appkey"], | |||||
"secret_key": tikTokArgs["secret_key"], | |||||
"id": tikTokArgs["gid"], | |||||
} | |||||
resp, err := Send("kuaishou", "getGoodsDetail", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data TikTokDetailData `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &tmp.Data, nil | |||||
} |
@@ -2,6 +2,7 @@ package zhimeng | |||||
import ( | import ( | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/md" | ||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"encoding/json" | "encoding/json" | ||||
"fmt" | "fmt" | ||||
) | ) | ||||
@@ -48,3 +49,118 @@ func PDDConvertUrl(ak, sk, itemId, promoId, couponPrice, isWxMini, isBindUrl, is | |||||
CommissionRate: couponPrice, | CommissionRate: couponPrice, | ||||
}, nil | }, nil | ||||
} | } | ||||
//生成多多进宝频道推广 | |||||
func PDDActivityConvertUrl(ak, sk, resourceType, pid, promoId, url string, isShare int) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": ak, | |||||
"secret_key": sk, | |||||
"resource_type": resourceType, | |||||
"pid": pid, | |||||
"url": url, | |||||
"custom_parameters": promoId, | |||||
"is_share": zhios_third_party_utils.IntToStr(isShare), | |||||
} | |||||
//generate_authority_url_onoff 0不会调授权链接 1会先跳授权链接 | |||||
fmt.Println("拼多多:", args) | |||||
resp, err := Send("pdd", "get_main_theme_url", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data struct { | |||||
URL string `json:"url"` | |||||
OpenAppURL string `json:"open_app_url"` | |||||
NoOpenAppURL string `json:"no_open_app_url"` | |||||
SchemaURL string `json:"schema_url"` | |||||
PagePath string `json:"page_path"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &md.ConvertedUrls{ | |||||
URL: tmp.Data.URL, | |||||
ShortenURL: tmp.Data.NoOpenAppURL, | |||||
NoOpenAppURL: tmp.Data.OpenAppURL, | |||||
AppURL: tmp.Data.SchemaURL, | |||||
WeChatMiniURL: tmp.Data.PagePath, | |||||
}, nil | |||||
} | |||||
//生成商城-频道推广链接 | |||||
func PDDActivityStoreConvertUrl(ak, sk, resourceType, pid, promoId, url string, isShare int) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": ak, | |||||
"secret_key": sk, | |||||
"channel_type": resourceType, | |||||
"pid": pid, | |||||
"custom_parameters": promoId, | |||||
"is_share": zhios_third_party_utils.IntToStr(isShare), | |||||
} | |||||
//generate_authority_url_onoff 0不会调授权链接 1会先跳授权链接 | |||||
fmt.Println("拼多多:", args) | |||||
resp, err := Send("pdd", "get_prom_url", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data struct { | |||||
URL string `json:"url"` | |||||
OpenAppURL string `json:"open_app_url"` | |||||
NoOpenAppURL string `json:"no_open_app_url"` | |||||
SchemaURL string `json:"schema_url"` | |||||
PagePath string `json:"page_path"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &md.ConvertedUrls{ | |||||
URL: tmp.Data.URL, | |||||
ShortenURL: tmp.Data.NoOpenAppURL, | |||||
NoOpenAppURL: tmp.Data.OpenAppURL, | |||||
AppURL: tmp.Data.SchemaURL, | |||||
WeChatMiniURL: tmp.Data.PagePath, | |||||
}, nil | |||||
} | |||||
//生成营销工具推广链接 | |||||
func PDDActivitySaleConvertUrl(ak, sk, resourceType, pid, promoId, url string, isShare int) (*md.ConvertedUrls, error) { | |||||
args := map[string]interface{}{ | |||||
"appkey": ak, | |||||
"secret_key": sk, | |||||
"channel_type": resourceType, | |||||
"pid": pid, | |||||
"custom_parameters": promoId, | |||||
"is_share": zhios_third_party_utils.IntToStr(isShare), | |||||
} | |||||
//generate_authority_url_onoff 0不会调授权链接 1会先跳授权链接 | |||||
fmt.Println("拼多多:", args) | |||||
resp, err := Send("pdd", "get_rp_url", args) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var tmp struct { | |||||
Data struct { | |||||
URL string `json:"url"` | |||||
OpenAppURL string `json:"open_app_url"` | |||||
NoOpenAppURL string `json:"no_open_app_url"` | |||||
SchemaURL string `json:"schema_url"` | |||||
PagePath string `json:"page_path"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(resp, &tmp); err != nil { | |||||
return nil, err | |||||
} | |||||
return &md.ConvertedUrls{ | |||||
URL: tmp.Data.URL, | |||||
ShortenURL: tmp.Data.NoOpenAppURL, | |||||
NoOpenAppURL: tmp.Data.OpenAppURL, | |||||
AppURL: tmp.Data.SchemaURL, | |||||
WeChatMiniURL: tmp.Data.PagePath, | |||||
}, nil | |||||
} |
@@ -62,6 +62,7 @@ type TikTokDetailData struct { | |||||
Imgs []string `json:"imgs"` | Imgs []string `json:"imgs"` | ||||
DetailImgs []string `json:"detail_imgs"` | DetailImgs []string `json:"detail_imgs"` | ||||
ShopTotalScore interface{} `json:"shop_total_score"` | ShopTotalScore interface{} `json:"shop_total_score"` | ||||
ActivityId string `json:"activity_id"` | |||||
} | } | ||||
type ShopTotalScore struct { | type ShopTotalScore struct { | ||||
LogisticsScore struct { | LogisticsScore struct { | ||||
@@ -0,0 +1,54 @@ | |||||
package zhimeng | |||||
import ( | |||||
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" | |||||
"encoding/json" | |||||
"errors" | |||||
) | |||||
// 搜索提示关键字 | |||||
func SearchTips(s string) ([]string, error) { | |||||
res, err := Send("tb_keyword", "index", map[string]interface{}{"keyword": s}) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
tmp := struct { | |||||
Success int `json:"success,omitempty"` | |||||
Msg string `json:"msg,omitempty"` | |||||
Data []string `json:"data,omitempty"` | |||||
}{} | |||||
err = json.Unmarshal(res, &tmp) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if tmp.Success != StatusSuc { | |||||
return nil, errors.New(tmp.Msg) | |||||
} | |||||
return tmp.Data, nil | |||||
} | |||||
// 解析淘口令, 成功返回产品goods_ID,失败返回空字符串 | |||||
func WordParse(ak, sk, pid, s, sid, tbAppKey string) struct { | |||||
Gid string `json:"gid"` | |||||
} { | |||||
resp, err := Send("agent_tb", "tkl_gid", map[string]interface{}{ | |||||
"appkey": ak, | |||||
"secret_key": sk, | |||||
"session": sid, | |||||
"keyword": s, | |||||
"pid": pid, | |||||
"tb_app_key": tbAppKey, | |||||
}) | |||||
if err != nil { | |||||
return struct { | |||||
Gid string `json:"gid"` | |||||
}{} | |||||
} | |||||
var tmp struct { | |||||
Data struct { | |||||
Gid string `json:"gid"` | |||||
} `json:"data"` | |||||
} | |||||
zhios_third_party_utils.Unserialize(resp, &tmp) | |||||
return tmp.Data | |||||
} |