k.zhang %!s(int64=4) %!d(string=hai) anos
pai
achega
43676b36b2

+ 81 - 0
apis/pdd/get.go

@@ -0,0 +1,81 @@
+package pdd
+
+import (
+	"duoduo/conf"
+	"fmt"
+	"github.com/asmcos/requests"
+	"reflect"
+	"strconv"
+)
+
+//
+func DuoDuoGet(url string) (outData string, err error) {
+
+	req := requests.Requests()
+	resp, err := req.Get(url)
+	if err != nil {
+		return "", err
+	} else {
+		return resp.Text(), err
+	}
+
+}
+
+func Sign() {
+
+}
+
+// 解析 拼接请求
+func Get(getData interface{}, url string) (outData string, err error) {
+
+	//加载配置
+	confIni, errConf := conf.ConnIni()
+	if errConf != nil {
+		fmt.Println(errConf)
+	}
+
+	host := confIni.MustValue("tisp", "postadd")
+
+	// 1、通过json变量来获取所有Get的参数
+	parameter := ""
+
+	getType := reflect.TypeOf(getData)
+	getValue := reflect.ValueOf(getData)
+	for i := 0; i < getType.NumField(); i++ {
+
+		valueType := getType.Field(i).Type.String()
+		value := getValue.Field(i)
+		tagName := getType.Field(i).Tag.Get("json")
+
+		// 如果是int类型,并且是0,抛弃
+		if valueType == "int" && value.Int() != 0 {
+			if parameter != "" {
+				parameter += "&"
+			}
+			parameter += tagName + "=" + strconv.FormatInt(value.Int(), 10)
+		}
+
+		// 如果是string类型,并且是空字符串,抛弃。
+		if valueType == "string" && value.String() != "" {
+			if parameter != "" {
+				parameter += "&"
+			}
+			parameter += tagName + "=" + value.String()
+		}
+	}
+
+	// 2、组合Url
+	urlAddress := fmt.Sprintf("%s%s?%s", host, url, parameter)
+	fmt.Println("url = ", urlAddress)
+
+	// 3、请求Html
+
+	req := requests.Requests()
+	resp, err := req.Get(urlAddress)
+	if err != nil {
+		fmt.Println("err = ", err.Error())
+		return "", err
+	} else {
+		return resp.Text(), nil
+	}
+}

+ 28 - 2
apis/pdd/pdd.ddk.goods.search.go

@@ -3,8 +3,10 @@ package pdd
 import (
 	"duoduo/conf"
 	"duoduo/models/pdd"
+	"duoduo/tools"
 	"fmt"
 	"github.com/gin-gonic/gin"
+	"sort"
 )
 
 func PddDdkGoodsSearch(c *gin.Context) {
@@ -15,6 +17,30 @@ func PddDdkGoodsSearch(c *gin.Context) {
 	}
 
 	inData.ClientId = confIni.MustValue("pdd", "client_id")
-	inData.ClientSecret = confIni.MustValue("pdd", "client_secret")
-	//PostPdd()
+	//inData.ClientSecret = confIni.MustValue("pdd", "client_secret")
+	inData.Type = "pdd.ddk.goods.search"
+
+	//  https://gw-api.pinduoduo.com/api/router?
+	//  type=pdd.ddk.goods.search&
+	//  data_type=JSON&
+	//  client_id=a5d05569c6584a50bfb6600b2d150bae&timestamp=1620461572&
+	//  sign=8F2C23805C8B8A388AFB512DD3EAD727
+
+	jsonStr, err := tools.JsonMarshal(inData)
+	if err != nil {
+		fmt.Print("err = ", err.Error())
+	}
+
+	pddSearch := make(map[string]string)
+	err = tools.JsonUnmarshal(jsonStr, &pddSearch)
+	if err != nil {
+		fmt.Print(err.Error())
+	}
+
+	var ks []string
+	for k := range pddSearch {
+		ks = append(ks, k)
+	}
+	sort.Strings(ks)
+
 }

+ 65 - 0
apis/pdd/pdd.ddk.goods.search_test.go

@@ -0,0 +1,65 @@
+package pdd
+
+import (
+	"duoduo/conf"
+	"duoduo/models/pdd"
+	"duoduo/tools"
+	"fmt"
+	"sort"
+	"testing"
+	"time"
+)
+
+func TestPddDdkGoodsSearch(t *testing.T) {
+	var inData pdd.PddDdkGoodsSearchRequest
+	confIni, errConf := conf.ConnIni()
+	if errConf != nil {
+		fmt.Println("err1", errConf)
+	}
+
+	inData.ClientId = confIni.MustValue("pdd", "client_id")
+	inData.Type = "pdd.ddk.goods.search"
+	inData.Timestamp = fmt.Sprintf("%d", time.Now().Unix())
+	inData.DataType = "JSON"
+
+	fmt.Print("inData", inData)
+
+	jsonStr, err := tools.JsonMarshal(inData)
+	if err != nil {
+		fmt.Print("err2 = ", err.Error())
+	}
+
+	fmt.Print(jsonStr)
+	pddSearch := make(map[string]string)
+	err = tools.JsonUnmarshal(jsonStr, &pddSearch)
+	if err != nil {
+		fmt.Print("err3=", err.Error())
+	}
+
+	var ks []string
+	for k := range pddSearch {
+		fmt.Print(k)
+		ks = append(ks, k)
+	}
+	sort.Strings(ks)
+	plainText := confIni.MustValue("pdd", "client_secret")
+	//排序后拼接数据
+	for i := 0; i < len(ks); i++ {
+		fmt.Print(ks[i])
+		plainText = plainText + ks[i]
+		plainText = plainText + pddSearch[ks[i]]
+	}
+
+	plainText += confIni.MustValue("pdd", "client_secret")
+	fmt.Print("plainText = ", plainText)
+	sign := tools.MD5(plainText)
+	fmt.Print(sign)
+
+	url := "https://gw-api.pinduoduo.com/api/router?type=pdd.ddk.goods.search&data_type=JSON&client_id=" + inData.ClientId + "&" + "timestamp=" + inData.Timestamp + "&" + "sign=" + sign
+	fmt.Print("url = ", url)
+	val, err := DuoDuoGet(url)
+	if err != nil {
+		fmt.Print("err = ", err.Error())
+	}
+	fmt.Print("val = ", val)
+}

+ 20 - 12
apis/pdd/post_test.go

@@ -1,22 +1,30 @@
 package pdd
 
 import (
-	"duoduo/conf"
-	"duoduo/models/pdd"
 	"fmt"
 	"testing"
 )
 
 func TestPost(t *testing.T) {
-	var inData pdd.PddDdkGoodsSearchRequest
-	var outData pdd.PddDdkGoodsSearchResponse
-	confIni, errConf := conf.ConnIni()
-	if errConf != nil {
-		fmt.Println(errConf)
-	}
 
-	inData.ClientId = confIni.MustValue("pdd", "client_id")
-	inData.ClientSecret = confIni.MustValue("pdd", "client_secret")
-	inData.Type = "pdd.ddk.goods.search"
-	PostPdd(inData, outData, "pdd.ddk.goods.search")
+	//var inData pdd.PddDdkGoodsSearchRequest
+	//var outData pdd.PddDdkGoodsSearchResponse
+	//
+	//confIni, errConf := conf.ConnIni()
+	//if errConf != nil {
+	//	fmt.Println(errConf)
+	//}
+	//
+	//inData.ClientId = confIni.MustValue("pdd", "client_id")
+	//inData.ClientSecret = confIni.MustValue("pdd", "client_secret")
+	//inData.Type = "pdd.ddk.goods.search"
+	//PostPdd(inData, outData, "pdd.ddk.goods.search")
+
+	path := "https://gw-api.pinduoduo.com/api/router?type=pdd.ddk.goods.search&data_type=JSON&client_id=a5d05569c6584a50bfb6600b2d150bae&timestamp=1620461572&sign=8F2C23805C8B8A388AFB512DD3EAD727"
+
+	val, err := DuoDuoGet(path)
+	if err != nil {
+		fmt.Print("err = ", err.Error())
+	}
+	fmt.Print("val = ", val)
 }

+ 41 - 0
apis/pdd/url_test.go

@@ -0,0 +1,41 @@
+package pdd
+
+import (
+	"fmt"
+	"net/url"
+	"testing"
+)
+
+func TestUrl(t *testing.T) {
+	values, err := url.ParseRequestURI("https://www.baidu.com/s?wd=%E6%90%9C%E7%B4%A2&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=7&rsv_sug1=6")
+
+	fmt.Println(values)
+	// 会打印出https://www.baidu.com/s?wd=%E6%90%9C%E7%B4%A2&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=7&rsv_sug1=6
+
+	if err != nil {
+		fmt.Println(err)
+	}
+
+	urlParam := values.RawQuery
+	fmt.Println(urlParam) // 打印出wd=%E6%90%9C%E7%B4%A2&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=7&rsv_sug1=6
+
+	// ParseQuery传入的必须是参数,也就是url里边的RawQuery的值 就是url?之后的path
+	fmt.Println(url.ParseQuery(urlParam))
+	//会打印出map[tn:[baiduhome_pg] rsv_enter:[1] rsv_sug3:[7] rsv_sug1:[6] f:[8] rsv_bp:[0] ie:[utf-8] rsv_idx:[2] wd:[搜索] rsv_spt:[1] issp:[1]] <nil>
+
+	//这里url.Query()直接就解析成map了,url.ParseQuery()反而多了一步,果断用这个方法
+	urlValue := values.Query() // 和下面的c变量类型相同都为url.Values类型,有相同的属性方法
+	fmt.Println(urlValue)
+	// 会打印出map[rsv_bp:[0] ie:[utf-8] tn:[baiduhome_pg] rsv_enter:[1] rsv_sug3:[7] rsv_sug1:[6] f:[8] rsv_spt:[1] issp:[1] rsv_idx:[2] wd:[搜索]]
+
+	//val := url.Values{}
+	c := url.Values{"method": {"get"}, "id": {"1"}}
+	fmt.Println(c.Encode()) // 打印出id=1&method=get
+	c.Get("method")         // 获取到method的值为get
+
+	c.Set("method", "post") // 修改method的值为post
+
+	c.Del("method") // 删除method元素
+
+	c.Add("new", "hi") // 添加新的元素new:hi
+}

+ 1 - 0
go.mod

@@ -4,6 +4,7 @@ go 1.14
 
 require (
 	github.com/Unknwon/goconfig v0.0.0-20200908083735-df7de6a44db8 // indirect
+	github.com/asmcos/requests v0.0.0-20210319030608-c839e8ae4946 // indirect
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
 	github.com/gin-gonic/gin v1.7.1 // indirect
 	github.com/go-playground/validator/v10 v10.5.0 // indirect

+ 2 - 0
go.sum

@@ -8,6 +8,8 @@ github.com/Unknwon/goconfig v0.0.0-20200908083735-df7de6a44db8/go.mod h1:wngxua9
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/asmcos/requests v0.0.0-20210319030608-c839e8ae4946 h1:1B8lZnGJOS3E7LumjuY6lb2NzXy8vBY6N2ag/IK6JdI=
+github.com/asmcos/requests v0.0.0-20210319030608-c839e8ae4946/go.mod h1:2W5PB6UTVRBypeouEebhwOJrDZOfJvPwMP1mtD8ZXM4=
 github.com/aws/aws-sdk-go v1.19.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=

+ 5 - 3
models/pdd/pdd.ddk.goods.search.go

@@ -1,9 +1,11 @@
 package pdd
 
 type PddDdkGoodsSearchRequest struct {
-	ClientId     string `json:"client_id"`
-	ClientSecret string `json:"client_secret"`
-	Type         string `json:"type"`
+	ClientId string `json:"client_id"`
+	//	ClientSecret string `json:"client_secret"`
+	Type      string `json:"type"`
+	Timestamp string `json:"timestamp"`
+	DataType  string `json:"data_type"`
 }
 
 type PddDdkGoodsSearchResponse struct {

+ 3 - 1
tools/md5.go

@@ -14,7 +14,9 @@ func MD5(sourceValue string) string {
 	io.WriteString(w, sourceValue)
 	newMD5 := fmt.Sprintf("%x", w.Sum(nil))
 
-	return strings.ToLower(newMD5)
+	//return strings.ToLower(newMD5)
+
+	return strings.ToUpper(newMD5)
 }
 
 //返回一个32位md5加密后的字符串