commit 67880d36ae35a7d3ec26ebfab52b1e2fbd6da63f Author: 李光春 Date: Fri May 27 01:01:26 2022 +0800 - init diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..c56c479 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,17 @@ +kind: pipeline +type: docker +name: clone + +steps: + - name: Test + image: golang:1.18 + commands: + - go env -w GO111MODULE=on + - go env -w GOPROXY=https://goproxy.cn,direct + - go test -v ./... + - name: Benchmark + image: golang:1.18 + commands: + - go env -w GO111MODULE=on + - go env -w GOPROXY=https://goproxy.cn,direct + - go test -bench=. -benchmem \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..502d67a --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.env +.git +.svn +.idea +.vscode +*.log +goinit.sh +gomod.sh +/vendor/ +*_test.go \ No newline at end of file diff --git a/app.go b/app.go new file mode 100644 index 0000000..3b126fe --- /dev/null +++ b/app.go @@ -0,0 +1,108 @@ +package pinduoduo + +import ( + "fmt" + "go.dtapp.net/golog" + "go.dtapp.net/gorequest" + "go.dtapp.net/gostring" + "gorm.io/gorm" + "regexp" + "strconv" + "strings" +) + +// App 公共请求参数 +type App struct { + clientId string // POP分配给应用的client_id + clientSecret string // POP分配给应用的client_secret + mediaId string // 媒体ID + Pid string // 推广位 + pgsql *gorm.DB // pgsql数据库 + client *gorequest.App // 请求客户端 + log *golog.Api // 日志服务 + logTableName string // 日志表名 + logStatus bool // 日志状态 +} + +func NewApp(clientId string, clientSecret string, mediaId string, pid string, pgsql *gorm.DB) *App { + app := &App{clientId: clientId, clientSecret: clientSecret, mediaId: mediaId, Pid: pid} + app.client = gorequest.NewHttp() + app.client.Uri = "https://gw-api.pinduoduo.com/api/router" + if pgsql != nil { + app.pgsql = pgsql + app.logStatus = true + app.logTableName = "pinduoduo" + app.log = golog.NewApi(&golog.ApiConfig{ + Db: pgsql, + TableName: app.logTableName, + }) + } + return app +} + +type ErrResp struct { + ErrorResponse struct { + ErrorMsg string `json:"error_msg"` + SubMsg string `json:"sub_msg"` + SubCode interface{} `json:"sub_code"` + ErrorCode int `json:"error_code"` + RequestId string `json:"request_id"` + } `json:"error_response"` +} + +type CustomParametersResult struct { + Sid string `json:"sid"` + Uid string `json:"uid"` +} + +func (app *App) request(params map[string]interface{}) (resp gorequest.Response, err error) { + + // 签名 + app.Sign(params) + + // 创建请求 + client := app.client + + // 设置参数 + client.SetParams(params) + + // 发起请求 + request, err := client.Get() + if err != nil { + return gorequest.Response{}, err + } + + // 日志 + if app.logStatus == true { + go app.postgresqlLog(gostring.ToString(params["type"]), request) + } + + return request, err +} + +func (app *App) SalesTipParseInt64(salesTip string) int64 { + parseInt, err := strconv.ParseInt(salesTip, 10, 64) + if err != nil { + salesTipStr := salesTip + if strings.Contains(salesTip, "万+") { + salesTipStr = strings.Replace(salesTip, "万+", "0000", -1) + } else if strings.Contains(salesTip, "万") { + salesTipStr = strings.Replace(salesTip, "万", "000", -1) + } + re := regexp.MustCompile("[0-9]+") + SalesTipMap := re.FindAllString(salesTipStr, -1) + if len(SalesTipMap) == 2 { + return gostring.ToInt64(fmt.Sprintf("%s%s", SalesTipMap[0], SalesTipMap[1])) + } else if len(SalesTipMap) == 1 { + return gostring.ToInt64(SalesTipMap[0]) + } else { + return 0 + } + } else { + return parseInt + } +} + +func (app *App) CommissionIntegralToInt64(GoodsPrice, CouponProportion int64) int64 { + return (GoodsPrice * CouponProportion) / 1000 +} diff --git a/crypto.go b/crypto.go new file mode 100644 index 0000000..15246af --- /dev/null +++ b/crypto.go @@ -0,0 +1,15 @@ +package pinduoduo + +import ( + "crypto/md5" + "encoding/hex" + "strings" +) + +// 签名 +func createSign(signStr string) string { + h := md5.New() + h.Write([]byte(signStr)) + cipherStr := h.Sum(nil) + return strings.ToUpper(hex.EncodeToString(cipherStr)) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3b375ef --- /dev/null +++ b/go.mod @@ -0,0 +1,25 @@ +module go.dtapp.net/pinduoduo + +go 1.18 + +require ( + go.dtapp.net/gojson v1.0.0 + go.dtapp.net/golog v1.0.13 + go.dtapp.net/gorequest v1.0.19 + go.dtapp.net/gostring v1.0.3 + go.dtapp.net/gotime v1.0.2 + gorm.io/datatypes v1.0.6 + gorm.io/gorm v1.23.5 +) + +require ( + github.com/go-sql-driver/mysql v1.6.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda // indirect + github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f // indirect + github.com/ulikunitz/xz v0.5.10 // indirect + go.dtapp.net/goip v1.0.16 // indirect + golang.org/x/text v0.3.7 // indirect + gorm.io/driver/mysql v1.3.3 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7bb4234 --- /dev/null +++ b/go.sum @@ -0,0 +1,239 @@ +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.10.1/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.12.1 h1:rsDFzIpRk7xT4B8FufgpCCeyjdNpKyghZeSefViE5W8= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.0 h1:brH0pCGBDkBW07HWlN/oSBXrmo3WB0UvZd1pIuDcL8Y= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.9.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.11.0 h1:u4uiGPz/1hryuXzyaBhSk6dnIyyG2683olG2OV+UUgs= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.14.1/go.mod h1:RgDuE4Z34o7XE92RpLsvFiOEfrAUT0Xt2KxvX73W06M= +github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda h1:h+YpzUB/bGVJcLqW+d5GghcCmE/A25KbzjXvWJQi/+o= +github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda/go.mod h1:MSotTrCv1PwoR8QgU1JurEx+lNNbtr25I+m0zbLyAGw= +github.com/saracen/go7z-fixtures v0.0.0-20190623165746-aa6b8fba1d2f h1:PF9WV5j/x6MT+x/sauUHd4objCvJbZb0wdxZkHSdd5A= +github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f h1:1cJITU3JUI8qNS5T0BlXwANsVdyoJQHQ4hvOxbunPCw= +github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f/go.mod h1:LyBTue+RWeyIfN3ZJ4wVxvDuvlGJtDgCLgCb6HCPgps= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.dtapp.net/goip v1.0.16 h1:jJoXeLVc8BmlKEc+4T9mL2BFK63RJFd4B9xTMYhFRqg= +go.dtapp.net/goip v1.0.16/go.mod h1:BY2Xo5clizPZFQ8CYOlgg91fHMZR1Ll54f3P0sNHxbg= +go.dtapp.net/gojson v1.0.0 h1:jmRjeWChRyv2tKEByHvnW3kXh1jUcL8B7VurV0Zbygc= +go.dtapp.net/gojson v1.0.0/go.mod h1:TkkpTNxHBKxul0e7gC5MrL1K4ICFB9mQ7wHzjBah3/k= +go.dtapp.net/golog v1.0.13 h1:SnU6G4onDYZPOfZ9cgmj5rHdtGGOWP/Qee31aM49Wj0= +go.dtapp.net/golog v1.0.13/go.mod h1:6w5Lt1x6/yUN3iptAi59irm4kqDJHaolDsrZ9ApsZUQ= +go.dtapp.net/gorequest v1.0.19 h1:ZBkXb/oD59aChfzHfReK6M3M4eu3dwpaPTefe1c8P90= +go.dtapp.net/gorequest v1.0.19/go.mod h1:EwOfdfxsWPszOWrphCWHTN4DbYtU6fyQ/fuWQyQwSnk= +go.dtapp.net/gostring v1.0.3 h1:KSOq4D77/g5yZN/bqWfZ0kOOaPr/P1240vg03+XdENI= +go.dtapp.net/gostring v1.0.3/go.mod h1:+ggrOvgQDQturi1QGsXEpyRN/ZPoRDaqhMujIk5lrgQ= +go.dtapp.net/gotime v1.0.2 h1:CFIJHQXC/4t9bsJhk2cLhjHd6rpdPcJXr8BcHKHDuQo= +go.dtapp.net/gotime v1.0.2/go.mod h1:Gq7eNLr2iMLP18UNWONRq4V3Uhf/ADp4bIrS+Tc6ktY= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898 h1:SLP7Q4Di66FONjDJbCYrCRrh97focO6sLogHO7/g8F0= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114 h1:DnSr2mCsxyCE6ZgIkmcWUQY2R5cH/6wL7eIxEmQOMSE= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/datatypes v1.0.6 h1:3cqbakp1DIgC+P7wyODb5k+lSjW8g3mjkg/BIsmhjlE= +gorm.io/datatypes v1.0.6/go.mod h1:Gh/Xd/iUWWybMEk8CzYCK/swqlni2r+ROeM1HGIM0ck= +gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= +gorm.io/driver/mysql v1.3.3 h1:jXG9ANrwBc4+bMvBcSl8zCfPBaVoPyBEBshA8dA93X8= +gorm.io/driver/mysql v1.3.3/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= +gorm.io/driver/postgres v1.3.1/go.mod h1:WwvWOuR9unCLpGWCL6Y3JOeBWvbKi6JLhayiVclSZZU= +gorm.io/driver/postgres v1.3.6 h1:Q0iLoYvWwsJVpYQrSrY5p5P4YzW7fJjFMBG2sa4Bz5U= +gorm.io/driver/sqlite v1.3.1 h1:bwfE+zTEWklBYoEodIOIBwuWHpnx52Z9zJFW5F33WLk= +gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= +gorm.io/driver/sqlserver v1.3.1 h1:F5t6ScMzOgy1zukRTIZgLZwKahgt3q1woAILVolKpOI= +gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ= +gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.2/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.5 h1:TnlF26wScKSvknUC/Rn8t0NLLM22fypYBlvj1+aH6dM= +gorm.io/gorm v1.23.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/param.go b/param.go new file mode 100644 index 0000000..ec4530c --- /dev/null +++ b/param.go @@ -0,0 +1,7 @@ +package pinduoduo + +// CommonGenCustomParameters 自定义参数 +type CommonGenCustomParameters struct { + Uid string `json:"uid"` + Sid string `json:"sid"` +} diff --git a/params.go b/params.go new file mode 100644 index 0000000..8e1ee93 --- /dev/null +++ b/params.go @@ -0,0 +1,90 @@ +package pinduoduo + +import ( + "encoding/json" + "net/url" + "sort" + "strconv" + "time" +) + +// Params 请求参数 +type Params map[string]interface{} + +func NewParams() Params { + p := make(Params) + return p +} + +func NewParamsWithType(_type string, params ...Params) Params { + p := make(Params) + p["type"] = _type + p["timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) + for _, v := range params { + p.SetParams(v) + } + return p +} + +func (app *App) Sign(p Params) { + p["client_id"] = app.clientId + // 排序所有的 key + var keys []string + for key := range p { + keys = append(keys, key) + } + sort.Strings(keys) + signStr := app.clientSecret + for _, key := range keys { + signStr += key + getString(p[key]) + } + signStr += app.clientSecret + p["sign"] = createSign(signStr) +} + +func (p Params) Set(key string, value interface{}) { + p[key] = value +} + +func (p Params) SetParams(params Params) { + for key, value := range params { + p[key] = value + } +} + +func (p Params) SetCustomParameters(uid string, sid string) { + p["custom_parameters"] = map[string]interface{}{ + "uid": uid, + "sid": sid, + } +} + +// SetGoodsSignList 设置商品goodsSign列表 +func (p Params) SetGoodsSignList(goodsSign string) { + p["goods_sign_list"] = []string{goodsSign} +} + +func (p Params) GetQuery() string { + u := url.Values{} + for k, v := range p { + u.Set(k, getString(v)) + } + return u.Encode() +} + +func getString(i interface{}) string { + switch v := i.(type) { + case string: + return v + case []byte: + return string(v) + case int: + return strconv.Itoa(v) + case bool: + return strconv.FormatBool(v) + default: + + bytes, _ := json.Marshal(v) + return string(bytes) + } +} diff --git a/pdd.ddk.cms.prom.url.generate.go b/pdd.ddk.cms.prom.url.generate.go new file mode 100644 index 0000000..6e44432 --- /dev/null +++ b/pdd.ddk.cms.prom.url.generate.go @@ -0,0 +1,77 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type CmsPromUrlGenerateResponse struct { + CmsPromotionUrlGenerateResponse struct { + Total int `json:"total"` + UrlList []struct { + SingleUrlList struct { + TzSchemaUrl string `json:"tz_schema_url"` + MobileUrl string `json:"mobile_url"` + SchemaUrl string `json:"schema_url"` + MobileShortUrl string `json:"mobile_short_url"` + WeAppWebViewUrl string `json:"we_app_web_view_url"` + Url string `json:"url"` + ShortUrl string `json:"short_url"` + WeAppWebViewShortUrl string `json:"we_app_web_view_short_url"` + } `json:"single_url_list"` + MobileUrl string `json:"mobile_url"` + Sign string `json:"sign"` + WeAppInfo struct { + WeAppIconUrl string `json:"we_app_icon_url"` + UserName string `json:"user_name"` + PagePath string `json:"page_path"` + SourceDisplayName string `json:"source_display_name"` + Title string `json:"title"` + AppId string `json:"app_id"` + Desc string `json:"desc"` + } `json:"we_app_info"` + MobileShortUrl string `json:"mobile_short_url"` + WeAppWebViewUrl string `json:"we_app_web_view_url"` + Url string `json:"url"` + ShortUrl string `json:"short_url"` + WeAppWebViewShortUrl string `json:"we_app_web_view_short_url"` + } `json:"url_list"` + RequestId string `json:"request_id"` + } `json:"cms_promotion_url_generate_response"` +} + +type CmsPromUrlGenerateError struct { + ErrorResponse struct { + ErrorMsg string `json:"error_msg"` + SubMsg string `json:"sub_msg"` + SubCode string `json:"sub_code"` + } `json:"error_response"` +} + +type CmsPromUrlGenerateResult struct { + Result CmsPromUrlGenerateResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 + Error CmsPromUrlGenerateError // 错误结果 +} + +func NewCmsPromUrlGenerateResult(result CmsPromUrlGenerateResponse, body []byte, http gorequest.Response, err error, error CmsPromUrlGenerateError) *CmsPromUrlGenerateResult { + return &CmsPromUrlGenerateResult{Result: result, Body: body, Http: http, Err: err, Error: error} +} + +// CmsPromUrlGenerate 生成商城-频道推广链接 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.cms.prom.url.generate +func (app *App) CmsPromUrlGenerate(notMustParams ...Params) *CmsPromUrlGenerateResult { + // 参数 + params := NewParamsWithType("pdd.ddk.cms.prom.url.generate", notMustParams...) + params.Set("p_id_list", []string{app.Pid}) + // 请求 + request, err := app.request(params) + // 定义 + var response CmsPromUrlGenerateResponse + err = json.Unmarshal(request.ResponseBody, &response) + var responseError CmsPromUrlGenerateError + err = json.Unmarshal(request.ResponseBody, &responseError) + return NewCmsPromUrlGenerateResult(response, request.ResponseBody, request, err, responseError) +} diff --git a/pdd.ddk.goods.detail.go b/pdd.ddk.goods.detail.go new file mode 100644 index 0000000..81d37aa --- /dev/null +++ b/pdd.ddk.goods.detail.go @@ -0,0 +1,110 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type GoodsDetailResponse struct { + GoodsDetailResponse struct { + GoodsDetails []struct { + ActivityPromotionRate int `json:"activity_promotion_rate,omitempty"` // 活动佣金比例,千分比(特定活动期间的佣金比例) + ActivityTags []int `json:"activity_tags,omitempty"` // 商品活动标记数组,例:[4,7],4-秒杀 7-百亿补贴等 + BrandName string `json:"brand_name,omitempty"` // 商品品牌词信息,如“苹果”、“阿迪达斯”、“李宁”等 + CashGiftAmount int `json:"cash_gift_amount,omitempty"` // 全局礼金金额,单位分 + CatId int `json:"cat_id,omitempty"` // 商品类目ID,使用pdd.goods.cats.get接口获取 + CatIds []int `json:"cat_ids,omitempty"` // 商品一~四级类目ID列表 + CltCpnBatchSn string `json:"clt_cpn_batch_sn,omitempty"` // 店铺收藏券id + CltCpnDiscount int `json:"clt_cpn_discount,omitempty"` // 店铺收藏券面额,单位为分 + CltCpnEndTime int `json:"clt_cpn_end_time,omitempty"` // 店铺收藏券截止时间 + CltCpnMinAmt int `json:"clt_cpn_min_amt,omitempty"` // 店铺收藏券使用门槛价格,单位为分 + CltCpnQuantity int `json:"clt_cpn_quantity,omitempty"` // 店铺收藏券总量 + CltCpnRemainQuantity int `json:"clt_cpn_remain_quantity,omitempty"` // 店铺收藏券剩余量 + CltCpnStartTime int `json:"clt_cpn_start_time,omitempty"` // 店铺收藏券起始时间 + CouponDiscount int64 `json:"coupon_discount,omitempty"` // 优惠券面额,单位为分 + CouponEndTime int `json:"coupon_end_time,omitempty"` // 优惠券失效时间,UNIX时间戳 + CouponMinOrderAmount int `json:"coupon_min_order_amount,omitempty"` // 优惠券门槛金额,单位为分 + CouponRemainQuantity int `json:"coupon_remain_quantity,omitempty"` // 优惠券剩余数量 + CouponStartTime int `json:"coupon_start_time,omitempty"` // 优惠券生效时间,UNIX时间戳 + CouponTotalQuantity int `json:"coupon_total_quantity,omitempty"` // 优惠券总数量 + CreateAt int `json:"create_at,omitempty"` // 创建时间(unix时间戳) + DescTxt string `json:"desc_txt,omitempty"` // 描述分 + ExtraCouponAmount int `json:"extra_coupon_amount,omitempty"` // 额外优惠券 + GoodsDesc string `json:"goods_desc,omitempty"` // 参与多多进宝的商品描述 + GoodsGalleryUrls []string `json:"goods_gallery_urls,omitempty"` // 商品轮播图 + GoodsImageUrl string `json:"goods_image_url,omitempty"` // 多多进宝商品主图 + GoodsName string `json:"goods_name,omitempty"` // 参与多多进宝的商品标题 + GoodsSign string `json:"goods_sign,omitempty"` // 商品goodsSign,支持通过goodsSign查询商品。goodsSign是加密后的goodsId, goodsId已下线,请使用goodsSign来替代。使用说明:https://jinbao.pinduoduo.com/qa-system?questionId=252 + GoodsThumbnailUrl string `json:"goods_thumbnail_url,omitempty"` // 商品缩略图 + HasCoupon bool `json:"has_coupon,omitempty"` // 商品是否有优惠券 true-有,false-没有 + HasMallCoupon bool `json:"has_mall_coupon,omitempty"` // 是否有店铺券 + LgstTxt string `json:"lgst_txt,omitempty"` // 物流分 + MallCouponDiscountPct int64 `json:"mall_coupon_discount_pct,omitempty"` // 店铺折扣 + MallCouponEndTime int `json:"mall_coupon_end_time,omitempty"` // 店铺券使用结束时间 + MallCouponMaxDiscountAmount int64 `json:"mall_coupon_max_discount_amount,omitempty"` // 最大使用金额 + MallCouponMinOrderAmount int64 `json:"mall_coupon_min_order_amount,omitempty"` // 最小使用金额 + MallCouponRemainQuantity int `json:"mall_coupon_remain_quantity,omitempty"` // 店铺券余量 + MallCouponStartTime int `json:"mall_coupon_start_time,omitempty"` // 店铺券使用开始时间 + MallCouponTotalQuantity int `json:"mall_coupon_total_quantity,omitempty"` // 店铺券总量 + MallCps int64 `json:"mall_cps,omitempty"` // 该商品所在店铺是否参与全店推广,0:否,1:是 + MallId int64 `json:"mall_id,omitempty"` // 商家id + MallImgUrl string `json:"mall_img_url,omitempty"` // 店铺logo图 + MallName string `json:"mall_name,omitempty"` // 店铺名称 + MaterialList []struct { + Id string `json:"id,omitempty"` // 素材ID + ImageList []string `json:"image_list,omitempty"` // 图片列表 + TextList []string `json:"text_list,omitempty"` // 文字列表 + ThumbnailUrl string `json:"thumbnail_url,omitempty"` // 视频缩略图 + Mtype int `json:"type,omitempty"` // 素材类型,1-图文,2-视频 + VideoUrl string `json:"video_url,omitempty"` // 视频url + } `json:"material_list"` + MerchantType int `json:"merchant_type,omitempty"` // 店铺类型,1-个人,2-企业,3-旗舰店,4-专卖店,5-专营店,6-普通店(未传为全部) + MinGroupPrice int64 `json:"min_group_price,omitempty"` // 最低价sku的拼团价,单位为分 + MinNormalPrice int64 `json:"min_normal_price,omitempty"` // 最低价sku的单买价,单位为分 + OnlySceneAuth bool `json:"only_scene_auth,omitempty"` // 快手专享 + OptId int `json:"opt_id,omitempty"` // 商品标签ID,使用pdd.goods.opt.get接口获取 + OptIds []int `json:"opt_ids,omitempty"` // 商品标签ID + OptName string `json:"opt_name,omitempty"` // 商品标签名称 + PlanType int `json:"plan_type,omitempty"` // 推广计划类型: 1-全店推广 2-单品推广 3-定向推广 4-招商推广 5-分销推广 + PredictPromotionRate int `json:"predict_promotion_rate,omitempty"` // 比价行为预判定佣金,需要用户备案 + PromotionRate int64 `json:"promotion_rate,omitempty"` // 佣金比例,千分比 + SalesTip string `json:"sales_tip,omitempty"` // 已售卖件数 + ServiceTags []int `json:"service_tags,omitempty"` // 服务标签: 4-送货入户并安装,5-送货入户,6-电子发票,9-坏果包赔,11-闪电退款,12-24小时发货,13-48小时发货,17-顺丰包邮,18-只换不修,1可定制化,29-预约配送,1000001-正品发票,1000002-送货入户并安装 + ServTxt string `json:"serv_txt,omitempty"` // 服务分 + ShareRate int `json:"share_rate,omitempty"` // 招商分成服务费比例,千分比 + SubsidyAmount int `json:"subsidy_amount,omitempty"` // 优势渠道专属商品补贴金额,单位为分。针对优质渠道的补贴活动,指定优势渠道可通过推广该商品获取相应补贴。补贴活动入口:[进宝网站-官方活动-千万补贴],报名入口:https://jinbao.pinduoduo.com/ten-million-subsidy/entry + SubsidyDuoAmountTenMillion int `json:"subsidy_duo_amount_ten_million,omitempty"` // 千万补贴给渠道的收入补贴,不允许直接给下级代理展示,单位为分 + UnifiedTags []string `json:"unified_tags,omitempty"` // 优惠标签列表,包括:"X元券","比全网低X元","服务费","精选素材","近30天低价","同款低价","同款好评","同款热销","旗舰店","一降到底","招商优选","商家优选","好价再降X元","全站销量XX","实时热销榜第X名","实时好评榜第X名","额外补X元"等 + VideoUrls []string `json:"video_urls,omitempty"` // 商品视频url + ZsDuoId int `json:"zs_duo_id,omitempty"` // 招商团长id + GoodsId int64 `json:"goods_id"` + CategoryId int64 `json:"category_id"` + CategoryName string `json:"category_name"` + } `json:"goods_details"` + } `json:"goods_detail_response"` +} + +type GoodsDetailResult struct { + Result GoodsDetailResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewGoodsDetailResult(result GoodsDetailResponse, body []byte, http gorequest.Response, err error) *GoodsDetailResult { + return &GoodsDetailResult{Result: result, Body: body, Http: http, Err: err} +} + +// GoodsDetail 多多进宝商品详情查询 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.detail +func (app *App) GoodsDetail(notMustParams ...Params) *GoodsDetailResult { + // 参数 + params := NewParamsWithType("pdd.ddk.goods.detail", notMustParams...) + params.Set("pid", app.Pid) + // 请求 + request, err := app.request(params) + // 定义 + var response GoodsDetailResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewGoodsDetailResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.goods.pid.generate.go b/pdd.ddk.goods.pid.generate.go new file mode 100644 index 0000000..61fdfb4 --- /dev/null +++ b/pdd.ddk.goods.pid.generate.go @@ -0,0 +1,42 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type GoodsPidGenerateResponse struct { + PIdGenerateResponse struct { + PIdList []struct { + CreateTime int `json:"create_time,omitempty"` // 推广位创建时间 + PidName string `json:"pid_name,omitempty"` // 推广位名称 + PId string `json:"p_id,omitempty"` // 调用方推广位ID + MediaId int `json:"media_id,omitempty"` // 媒体id + } `json:"p_id_list"` + RemainPidCount int `json:"remain_pid_count"` // PID剩余数量 + } `json:"p_id_generate_response"` +} + +type GoodsPidGenerateResult struct { + Result GoodsPidGenerateResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewGoodsPidGenerateResult(result GoodsPidGenerateResponse, body []byte, http gorequest.Response, err error) *GoodsPidGenerateResult { + return &GoodsPidGenerateResult{Result: result, Body: body, Http: http, Err: err} +} + +// GoodsPidGenerate 创建多多进宝推广位 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.pid.generate +func (app *App) GoodsPidGenerate(notMustParams ...Params) *GoodsPidGenerateResult { + // 参数 + params := NewParamsWithType("pdd.ddk.goods.pid.generate", notMustParams...) + // 请求 + request, err := app.request(params) + // 定义 + var response GoodsPidGenerateResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewGoodsPidGenerateResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.goods.promotion.url.generate.go b/pdd.ddk.goods.promotion.url.generate.go new file mode 100644 index 0000000..a996699 --- /dev/null +++ b/pdd.ddk.goods.promotion.url.generate.go @@ -0,0 +1,63 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type GoodsPromotionUrlGenerateResponse struct { + GoodsPromotionUrlGenerateResponse struct { + GoodsPromotionUrlList []struct { + MobileShortUrl string `json:"mobile_short_url,omitempty"` // 对应出参mobile_url的短链接,与mobile_url功能一致。 + MobileUrl string `json:"mobile_url,omitempty"` // 使用此推广链接,用户安装微信的情况下,默认拉起拼多多福利券微信小程序,否则唤起H5页面 + QqAppInfo struct { + AppId string `json:"app_id,omitempty"` // 拼多多小程序id + BannerUrl string `json:"banner_url,omitempty"` // Banner图 + Desc string `json:"desc,omitempty"` // 描述 + PagePath string `json:"page_path,omitempty"` // 小程序path值 + QqAppIconUrl string `json:"qq_app_icon_url,omitempty"` // 小程序icon + SourceDisplayName string `json:"source_display_name,omitempty"` // 来源名 + Title string `json:"title,omitempty"` // 小程序标题 + UserName string `json:"user_name,omitempty"` // 用户名 + } `json:"qq_app_info"` + SchemaUrl string `json:"schema_url,omitempty"` // 使用此推广链接,用户安装拼多多APP的情况下会唤起APP(需客户端支持schema跳转协议) + ShortUrl string `json:"short_url,omitempty"` // 对应出参url的短链接,与url功能一致 + Url string `json:"url,omitempty"` // 普通推广长链接,唤起H5页面 + WeAppInfo struct { + AppId string `json:"app_id,omitempty"` // 小程序id + BannerUrl string `json:"banner_url,omitempty"` // Banner图 + Desc string `json:"desc,omitempty"` // 描述 + PagePath string `json:"page_path,omitempty"` // 小程序path值 + SourceDisplayName string `json:"source_display_name,omitempty"` // 来源名 + Title string `json:"title,omitempty"` // 小程序标题 + UserName string `json:"user_name,omitempty"` // 用户名 + WeAppIconUrl string `json:"we_app_icon_url,omitempty"` // 小程序图片 + } `json:"we_app_info"` + } `json:"goods_promotion_url_list"` + } `json:"goods_promotion_url_generate_response"` +} + +type GoodsPromotionUrlGenerateResult struct { + Result GoodsPromotionUrlGenerateResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewGoodsPromotionUrlGenerateResult(result GoodsPromotionUrlGenerateResponse, body []byte, http gorequest.Response, err error) *GoodsPromotionUrlGenerateResult { + return &GoodsPromotionUrlGenerateResult{Result: result, Body: body, Http: http, Err: err} +} + +// GoodsPromotionUrlGenerate 多多进宝推广链接生成 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.promotion.url.generate +func (app *App) GoodsPromotionUrlGenerate(notMustParams ...Params) *GoodsPromotionUrlGenerateResult { + // 参数 + params := NewParamsWithType("pdd.ddk.goods.promotion.url.generate", notMustParams...) + params.Set("p_id", app.Pid) + // 请求 + request, err := app.request(params) + // 定义 + var response GoodsPromotionUrlGenerateResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewGoodsPromotionUrlGenerateResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.goods.recommend.get.go b/pdd.ddk.goods.recommend.get.go new file mode 100644 index 0000000..e07d3a3 --- /dev/null +++ b/pdd.ddk.goods.recommend.get.go @@ -0,0 +1,92 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type GoodsRecommendGetResponse struct { + GoodsBasicDetailResponse struct { + List []struct { + ActivityPromotionRate int `json:"activity_promotion_rate"` + ActivityTags []int `json:"activity_tags"` + BrandName string `json:"brand_name"` + CashGiftAmount int `json:"cash_gift_amount"` + CatId string `json:"cat_id"` + CatIds []int `json:"cat_ids"` + CouponDiscount int64 `json:"coupon_discount"` + CouponEndTime int `json:"coupon_end_time"` + CouponMinOrderAmount int `json:"coupon_min_order_amount"` + CouponPrice int `json:"coupon_price"` + CouponRemainQuantity int `json:"coupon_remain_quantity"` + CouponStartTime int `json:"coupon_start_time"` + CouponTotalQuantity int `json:"coupon_total_quantity"` + CreateAt int `json:"create_at"` + DescTxt string `json:"desc_txt"` + ExtraCouponAmount int `json:"extra_coupon_amount"` + GoodsDesc string `json:"goods_desc"` + GoodsImageUrl string `json:"goods_image_url"` + GoodsLabels []int `json:"goods_labels"` + GoodsName string `json:"goods_name"` + GoodsRate int `json:"goods_rate"` + GoodsSign string `json:"goods_sign"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + GoodsType int `json:"goods_type"` + HasCoupon bool `json:"has_coupon"` + HasMaterial bool `json:"has_material"` + LgstTxt string `json:"lgst_txt"` + MallId int64 `json:"mall_id"` + MallName string `json:"mall_name"` + MarketFee int `json:"market_fee"` + MerchantType string `json:"merchant_type"` + MinGroupPrice int64 `json:"min_group_price"` + MinNormalPrice int `json:"min_normal_price"` + OptId string `json:"opt_id"` + OptIds []int `json:"opt_ids"` + OptName string `json:"opt_name"` + PredictPromotionRate int `json:"predict_promotion_rate"` + PromotionRate int64 `json:"promotion_rate"` + QrCodeImageUrl string `json:"qr_code_image_url"` + RealtimeSalesTip string `json:"realtime_sales_tip"` + SalesTip string `json:"sales_tip"` + SearchId string `json:"search_id"` + ServTxt string `json:"serv_txt"` + ShareDesc string `json:"share_desc"` + ShareRate int `json:"share_rate"` + SubsidyAmount int `json:"subsidy_amount"` + SubsidyDuoAmountTenMillion int `json:"subsidy_duo_amount_ten_million"` + UnifiedTags []string `json:"unified_tags"` + GoodsId int64 `json:"goods_id"` + CategoryId string `json:"category_id"` + CategoryName string `json:"category_name"` + } `json:"list"` + ListId string `json:"list_id"` + SearchId string `json:"search_id"` + Total int64 `json:"total"` + } `json:"goods_basic_detail_response"` +} + +type GoodsRecommendGetResult struct { + Result GoodsRecommendGetResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewGoodsRecommendGetResult(result GoodsRecommendGetResponse, body []byte, http gorequest.Response, err error) *GoodsRecommendGetResult { + return &GoodsRecommendGetResult{Result: result, Body: body, Http: http, Err: err} +} + +// GoodsRecommendGet 多多进宝商品推荐API +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.recommend.get +func (app *App) GoodsRecommendGet(notMustParams ...Params) *GoodsRecommendGetResult { + // 参数 + params := NewParamsWithType("pdd.ddk.goods.recommend.get", notMustParams...) + params.Set("pid", app.Pid) + // 请求 + request, err := app.request(params) + // 定义 + var response GoodsRecommendGetResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewGoodsRecommendGetResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.goods.search.go b/pdd.ddk.goods.search.go new file mode 100644 index 0000000..5fd140d --- /dev/null +++ b/pdd.ddk.goods.search.go @@ -0,0 +1,106 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type GoodsSearchResponse struct { + GoodsSearchResponse struct { + GoodsList []struct { + ActivityPromotionRate int `json:"activity_promotion_rate"` + ActivityTags []int `json:"activity_tags"` + ActivityType int `json:"activity_type"` + BrandName string `json:"brand_name"` + CashGiftAmount int `json:"cash_gift_amount"` + CatIds []int `json:"cat_ids"` + CltCpnBatchSn string `json:"clt_cpn_batch_sn"` + CltCpnDiscount int `json:"clt_cpn_discount"` + CltCpnEndTime int `json:"clt_cpn_end_time"` + CltCpnMinAmt int `json:"clt_cpn_min_amt"` + CltCpnQuantity int `json:"clt_cpn_quantity"` + CltCpnRemainQuantity int `json:"clt_cpn_remain_quantity"` + CltCpnStartTime int `json:"clt_cpn_start_time"` + CouponDiscount int64 `json:"coupon_discount"` + CouponEndTime int `json:"coupon_end_time"` + CouponMinOrderAmount int `json:"coupon_min_order_amount"` + CouponRemainQuantity int `json:"coupon_remain_quantity"` + CouponStartTime int `json:"coupon_start_time"` + CouponTotalQuantity int `json:"coupon_total_quantity"` + CreateAt int `json:"create_at"` + DescTxt string `json:"desc_txt"` + ExtraCouponAmount int `json:"extra_coupon_amount"` + GoodsDesc string `json:"goods_desc"` + GoodsImageUrl string `json:"goods_image_url"` + GoodsLabels []int `json:"goods_labels"` + GoodsName string `json:"goods_name"` + GoodsSign string `json:"goods_sign"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + HasCoupon bool `json:"has_coupon"` + HasMallCoupon bool `json:"has_mall_coupon"` + HasMaterial bool `json:"has_material"` + LgstTxt string `json:"lgst_txt"` + MallCouponDiscountPct int `json:"mall_coupon_discount_pct"` + MallCouponEndTime int `json:"mall_coupon_end_time"` + MallCouponId int `json:"mall_coupon_id"` + MallCouponMaxDiscountAmount int `json:"mall_coupon_max_discount_amount"` + MallCouponMinOrderAmount int `json:"mall_coupon_min_order_amount"` + MallCouponRemainQuantity int `json:"mall_coupon_remain_quantity"` + MallCouponStartTime int `json:"mall_coupon_start_time"` + MallCouponTotalQuantity int `json:"mall_coupon_total_quantity"` + MallCps int `json:"mall_cps"` + MallId int64 `json:"mall_id"` + MallName string `json:"mall_name"` + MerchantType int `json:"merchant_type"` + MinGroupPrice int64 `json:"min_group_price"` + MinNormalPrice int `json:"min_normal_price"` + OnlySceneAuth bool `json:"only_scene_auth"` + OptId int `json:"opt_id"` + OptIds []int `json:"opt_ids"` + OptName string `json:"opt_name"` + PlanType int `json:"plan_type"` + PredictPromotionRate int `json:"predict_promotion_rate"` + PromotionRate int64 `json:"promotion_rate"` + SalesTip string `json:"sales_tip"` + SearchId string `json:"search_id"` + ServTxt string `json:"serv_txt"` + ServiceTags []int `json:"service_tags"` + ShareRate int `json:"share_rate"` + SubsidyAmount int `json:"subsidy_amount"` + SubsidyDuoAmountTenMillion int `json:"subsidy_duo_amount_ten_million"` + UnifiedTags []string `json:"unified_tags"` + ZsDuoId int `json:"zs_duo_id"` + GoodsId int64 `json:"goods_id"` + CategoryId int64 `json:"category_id"` + CategoryName string `json:"category_name"` + } `json:"goods_list"` + ListId string `json:"list_id"` + SearchId string `json:"search_id"` + TotalCount int64 `json:"total_count"` + } `json:"goods_search_response"` +} + +type GoodsSearchResult struct { + Result GoodsSearchResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewGoodsSearchResult(result GoodsSearchResponse, body []byte, http gorequest.Response, err error) *GoodsSearchResult { + return &GoodsSearchResult{Result: result, Body: body, Http: http, Err: err} +} + +// GoodsSearch 多多进宝商品查询 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.search +func (app *App) GoodsSearch(notMustParams ...Params) *GoodsSearchResult { + // 参数 + params := NewParamsWithType("pdd.ddk.goods.search", notMustParams...) + params.Set("pid", app.Pid) + // 请求 + request, err := app.request(params) + // 定义 + var response GoodsSearchResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewGoodsSearchResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.member.authority.query.go b/pdd.ddk.member.authority.query.go new file mode 100644 index 0000000..3de4b33 --- /dev/null +++ b/pdd.ddk.member.authority.query.go @@ -0,0 +1,38 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type MemberAuthorityQueryResponse struct { + AuthorityQueryResponse struct { + Bind int `json:"bind"` + RequestId string `json:"request_id"` + } `json:"authority_query_response"` +} + +type MemberAuthorityQueryResult struct { + Result MemberAuthorityQueryResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewMemberAuthorityQueryResult(result MemberAuthorityQueryResponse, body []byte, http gorequest.Response, err error) *MemberAuthorityQueryResult { + return &MemberAuthorityQueryResult{Result: result, Body: body, Http: http, Err: err} +} + +// MemberAuthorityQuery 查询是否绑定备案 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.search +func (app *App) MemberAuthorityQuery(notMustParams ...Params) *MemberAuthorityQueryResult { + // 参数 + params := NewParamsWithType("pdd.ddk.member.authority.query", notMustParams...) + params.Set("pid", app.Pid) + // 请求 + request, err := app.request(params) + // 定义 + var response MemberAuthorityQueryResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewMemberAuthorityQueryResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.order.detail.get.go b/pdd.ddk.order.detail.get.go new file mode 100644 index 0000000..3978e9b --- /dev/null +++ b/pdd.ddk.order.detail.get.go @@ -0,0 +1,80 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type OrderDetailGetResponse struct { + OrderDetailResponse struct { + SepMarketFee int `json:"sep_market_fee"` + GoodsPrice int `json:"goods_price"` + SepDuoId int `json:"sep_duo_id"` + Pid string `json:"pid"` + PromotionRate int `json:"promotion_rate"` + CpsSign string `json:"cps_sign"` + Type int `json:"type"` + SubsidyDuoAmountLevel int `json:"subsidy_duo_amount_level"` + OrderStatus int `json:"order_status"` + CatIds []int `json:"cat_ids"` + OrderCreateTime int64 `json:"order_create_time"` + IsDirect int `json:"is_direct"` + OrderGroupSuccessTime int `json:"order_group_success_time"` + MallId int `json:"mall_id"` + OrderAmount int64 `json:"order_amount"` + PriceCompareStatus int `json:"price_compare_status"` + MallName string `json:"mall_name"` + OrderModifyAt int `json:"order_modify_at"` + AuthDuoId int `json:"auth_duo_id"` + CpaNew int `json:"cpa_new"` + GoodsName string `json:"goods_name"` + BatchNo string `json:"batch_no"` + RedPacketType int `json:"red_packet_type"` + UrlLastGenerateTime int `json:"url_last_generate_time"` + GoodsQuantity int `json:"goods_quantity"` + GoodsId int64 `json:"goods_id"` + SepParameters string `json:"sep_parameters"` + SepRate int `json:"sep_rate"` + SubsidyType int `json:"subsidy_type"` + ShareRate int `json:"share_rate"` + CustomParameters string `json:"custom_parameters"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + PromotionAmount int64 `json:"promotion_amount"` + OrderPayTime int `json:"order_pay_time"` + GroupId int64 `json:"group_id"` + SepPid string `json:"sep_pid"` + ReturnStatus int `json:"return_status"` + OrderStatusDesc string `json:"order_status_desc"` + ShareAmount int `json:"share_amount"` + GoodsCategoryName string `json:"goods_category_name"` + RequestId string `json:"request_id"` + GoodsSign string `json:"goods_sign"` + OrderSn string `json:"order_sn"` + ZsDuoId int `json:"zs_duo_id"` + } `json:"order_detail_response"` +} + +type OrderDetailGetResult struct { + Result OrderDetailGetResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewOrderDetailGetResult(result OrderDetailGetResponse, body []byte, http gorequest.Response, err error) *OrderDetailGetResult { + return &OrderDetailGetResult{Result: result, Body: body, Http: http, Err: err} +} + +// OrderDetailGet 多多进宝商品查询 https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.order.detail.get +func (app *App) OrderDetailGet(orderSn string) *OrderDetailGetResult { + // 参数 + param := NewParams() + param.Set("order_sn", orderSn) + params := NewParamsWithType("pdd.ddk.order.detail.get", param) + // 请求 + request, err := app.request(params) + // 定义 + var response OrderDetailGetResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewOrderDetailGetResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.order.list.increment.get.go b/pdd.ddk.order.list.increment.get.go new file mode 100644 index 0000000..8d292b1 --- /dev/null +++ b/pdd.ddk.order.list.increment.get.go @@ -0,0 +1,83 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type OrderListIncrementGetResponse struct { + OrderListGetResponse struct { + TotalCount int `json:"total_count"` + OrderList []struct { + SepMarketFee int `json:"sep_market_fee"` + GoodsPrice int64 `json:"goods_price"` + SepDuoId int `json:"sep_duo_id"` + PromotionRate int64 `json:"promotion_rate"` + Type int `json:"type"` + SubsidyDuoAmountLevel int `json:"subsidy_duo_amount_level"` + CatIds []int `json:"cat_ids"` + OrderStatus int `json:"order_status"` + OrderCreateTime int64 `json:"order_create_time"` + IsDirect int `json:"is_direct"` + OrderGroupSuccessTime int `json:"order_group_success_time"` + MallId int `json:"mall_id"` + OrderAmount int64 `json:"order_amount"` + PriceCompareStatus int `json:"price_compare_status"` + OrderModifyAt int `json:"order_modify_at"` + AuthDuoId int `json:"auth_duo_id"` + CpaNew int `json:"cpa_new"` + GoodsName string `json:"goods_name"` + BatchNo string `json:"batch_no"` + RedPacketType int `json:"red_packet_type"` + GoodsQuantity int `json:"goods_quantity"` + FailReason string `json:"fail_reason,omitempty"` + GoodsId int64 `json:"goods_id"` + SepParameters string `json:"sep_parameters"` + SepRate int `json:"sep_rate"` + SubsidyType int `json:"subsidy_type"` + CustomParameters string `json:"custom_parameters"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + ShareRate int `json:"share_rate"` + PromotionAmount int64 `json:"promotion_amount"` + OrderPayTime int64 `json:"order_pay_time"` + OrderReceiveTime int64 `json:"order_receive_time"` + OrderSettleTime int64 `json:"order_settle_time"` + ActivityTags []int `json:"activity_tags"` + GroupId int64 `json:"group_id"` + SepPid string `json:"sep_pid"` + OrderStatusDesc string `json:"order_status_desc"` + ShareAmount int `json:"share_amount"` + OrderId string `json:"order_id"` + GoodsSign string `json:"goods_sign"` + OrderSn string `json:"order_sn"` + OrderVerifyTime int64 `json:"order_verify_time"` + PId string `json:"p_id"` + ZsDuoId int `json:"zs_duo_id"` + } `json:"order_list"` + RequestId string `json:"request_id"` + } `json:"order_list_get_response"` +} + +type OrderListIncrementGetResult struct { + Result OrderListIncrementGetResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewOrderListIncrementGetResult(result OrderListIncrementGetResponse, body []byte, http gorequest.Response, err error) *OrderListIncrementGetResult { + return &OrderListIncrementGetResult{Result: result, Body: body, Http: http, Err: err} +} + +// OrderListIncrementGet 最后更新时间段增量同步推广订单信息 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.order.list.increment.get +func (app *App) OrderListIncrementGet(notMustParams ...Params) *OrderListIncrementGetResult { + // 参数 + params := NewParamsWithType("pdd.ddk.order.list.increment.get", notMustParams...) + // 请求 + request, err := app.request(params) + // 定义 + var response OrderListIncrementGetResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewOrderListIncrementGetResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.order.list.range.get.go b/pdd.ddk.order.list.range.get.go new file mode 100644 index 0000000..e0e3889 --- /dev/null +++ b/pdd.ddk.order.list.range.get.go @@ -0,0 +1,83 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type OrderListRangeGetResponse struct { + OrderListGetResponse struct { + TotalCount int `json:"total_count"` + OrderList []struct { + SepMarketFee int `json:"sep_market_fee"` + GoodsPrice int64 `json:"goods_price"` + SepDuoId int `json:"sep_duo_id"` + PromotionRate int64 `json:"promotion_rate"` + Type int `json:"type"` + SubsidyDuoAmountLevel int `json:"subsidy_duo_amount_level"` + CatIds []int `json:"cat_ids"` + OrderStatus int `json:"order_status"` + OrderCreateTime int64 `json:"order_create_time"` + IsDirect int `json:"is_direct"` + OrderGroupSuccessTime int `json:"order_group_success_time"` + MallId int `json:"mall_id"` + OrderAmount int64 `json:"order_amount"` + PriceCompareStatus int `json:"price_compare_status"` + OrderModifyAt int `json:"order_modify_at"` + AuthDuoId int `json:"auth_duo_id"` + CpaNew int `json:"cpa_new"` + GoodsName string `json:"goods_name"` + BatchNo string `json:"batch_no"` + RedPacketType int `json:"red_packet_type"` + GoodsQuantity int `json:"goods_quantity"` + FailReason string `json:"fail_reason,omitempty"` + GoodsId int64 `json:"goods_id"` + SepParameters string `json:"sep_parameters"` + SepRate int `json:"sep_rate"` + SubsidyType int `json:"subsidy_type"` + CustomParameters string `json:"custom_parameters"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + ShareRate int `json:"share_rate"` + PromotionAmount int64 `json:"promotion_amount"` + OrderPayTime int64 `json:"order_pay_time"` + OrderReceiveTime int64 `json:"order_receive_time"` + OrderSettleTime int64 `json:"order_settle_time"` + ActivityTags []int `json:"activity_tags"` + GroupId int64 `json:"group_id"` + SepPid string `json:"sep_pid"` + OrderStatusDesc string `json:"order_status_desc"` + ShareAmount int `json:"share_amount"` + OrderId string `json:"order_id"` + GoodsSign string `json:"goods_sign"` + OrderSn string `json:"order_sn"` + OrderVerifyTime int64 `json:"order_verify_time"` + PId string `json:"p_id"` + ZsDuoId int `json:"zs_duo_id"` + } `json:"order_list"` + RequestId string `json:"request_id"` + } `json:"order_list_get_response"` +} + +type OrderListRangeGetResult struct { + Result OrderListRangeGetResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewOrderListRangeGetResult(result OrderListRangeGetResponse, body []byte, http gorequest.Response, err error) *OrderListRangeGetResult { + return &OrderListRangeGetResult{Result: result, Body: body, Http: http, Err: err} +} + +// OrderListRangeGet 用时间段查询推广订单接口 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.order.list.range.get +func (app *App) OrderListRangeGet(notMustParams ...Params) *OrderListRangeGetResult { + // 参数 + params := NewParamsWithType("pdd.ddk.order.list.range.get", notMustParams...) + // 请求 + request, err := app.request(params) + // 定义 + var response OrderListRangeGetResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewOrderListRangeGetResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.ddk.resource.url.gen.go b/pdd.ddk.resource.url.gen.go new file mode 100644 index 0000000..380ec4d --- /dev/null +++ b/pdd.ddk.resource.url.gen.go @@ -0,0 +1,66 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type ResourceUrlGenResponse struct { + ResourceUrlResponse struct { + MultiUrlList struct { + ShortUrl string `json:"short_url"` // 频道推广短链接 + Url string `json:"url"` // 频道推广长链接 + } `json:"multi_url_list"` // 多人团链接 + Sign string `json:"sign,omitempty"` // sign + SingleUrlList struct { + ShortUrl string `json:"short_url"` // 频道推广短链接 + Url string `json:"url"` // 频道推广长链接 + } `json:"single_url_list"` // 单人团链接 + WeAppInfo struct { + AppId string `json:"app_id"` // 小程序id + BannerUrl string `json:"banner_url"` // Banner图 + Desc string `json:"desc"` // 描述 + PagePath string `json:"page_path"` // 小程序path值 + SourceDisplayName string `json:"source_display_name"` // 来源名 + Title string `json:"title"` // 小程序标题 + UserName string `json:"user_name"` // 用户名 + WeAppIconUrl string `json:"we_app_icon_url"` // 小程序icon + } `json:"we_app_info"` // 拼多多福利券微信小程序信息 + } `json:"resource_url_response"` +} + +type ResourceUrlGenError struct { + ErrorResponse struct { + ErrorMsg string `json:"error_msg"` + SubMsg string `json:"sub_msg"` + SubCode string `json:"sub_code"` + } `json:"error_response"` +} + +type ResourceUrlGenResult struct { + Result ResourceUrlGenResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 + Error ResourceUrlGenError // 错误结果 +} + +func NewResourceUrlGenResult(result ResourceUrlGenResponse, body []byte, http gorequest.Response, err error, error ResourceUrlGenError) *ResourceUrlGenResult { + return &ResourceUrlGenResult{Result: result, Body: body, Http: http, Err: err, Error: error} +} + +// ResourceUrlGen 生成多多进宝频道推广 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.pid.generate +func (app *App) ResourceUrlGen(notMustParams ...Params) *ResourceUrlGenResult { + // 参数 + params := NewParamsWithType("pdd.ddk.resource.url.gen", notMustParams...) + params.Set("pid", app.Pid) + // 请求 + request, err := app.request(params) + // 定义 + var response ResourceUrlGenResponse + err = json.Unmarshal(request.ResponseBody, &response) + var responseError ResourceUrlGenError + err = json.Unmarshal(request.ResponseBody, &responseError) + return NewResourceUrlGenResult(response, request.ResponseBody, request, err, responseError) +} diff --git a/pdd.ddk.rp.prom.url.generate.go b/pdd.ddk.rp.prom.url.generate.go new file mode 100644 index 0000000..6d70b8a --- /dev/null +++ b/pdd.ddk.rp.prom.url.generate.go @@ -0,0 +1,81 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type RpPromUrlGenerateResponse struct { + RpPromotionUrlGenerateResponse struct { + ResourceList []struct { + Desc string `json:"desc"` // 活动描述 + Url string `json:"url"` // 活动地址 + } `json:"resource_list"` + UrlList []struct { + MobileShortUrl string `json:"mobile_short_url"` // 推广移动短链接,对应出参mobile_url的短链接,与mobile_url功能一致。 + MobileUrl string `json:"mobile_url"` // 推广移动链接,用户安装拼多多APP的情况下会唤起APP,否则唤起H5页面 + MultiGroupMobileShortUrl string `json:"multi_group_mobile_short_url"` // 推广多人团移动短链接 + MultiGroupMobileUrl string `json:"multi_group_mobile_url"` // 推广多人团移动链接,用户安装拼多多APP的情况下会唤起APP,否则唤起H5页面 + MultiGroupShortUrl string `json:"multi_group_short_url"` // 推广多人团短链接 + MultiGroupUrl string `json:"multi_group_url"` // 推广多人团链接,唤起H5页面 + QqAppInfo struct { + AppId string `json:"app_id"` // 拼多多小程序id + BannerUrl string `json:"banner_url"` // Banner图 + Desc string `json:"desc"` // 描述 + PagePath string `json:"page_path"` // 小程序path值 + QqAppIconUrl string `json:"qq_app_icon_url"` // 小程序icon + SourceDisplayName string `json:"source_display_name"` // 来源名 + Title string `json:"title"` // 小程序标题 + UserName string `json:"user_name"` // 用户名 + } `json:"qq_app_info"` // qq小程序信息 + SchemaUrl string `json:"schema_url"` // schema链接,用户安装拼多多APP的情况下会唤起APP(需客户端支持schema跳转协议) + ShortUrl string `json:"short_url"` // 推广短链接,对应出参url的短链接,与url功能一致 + Url string `json:"url"` // 普通推广长链接,唤起H5页面 + WeAppInfo struct { + AppId string `json:"app_id"` // 小程序id + BannerUrl string `json:"banner_url"` // Banner图 + Desc string `json:"desc"` // 描述 + PagePath string `json:"page_path"` // 小程序path值 + SourceDisplayName string `json:"source_display_name"` // 来源名 + Title string `json:"title"` // 小程序标题 + UserName string `json:"user_name"` // 用户名 + WeAppIconUrl string `json:"we_app_icon_url"` // 小程序icon + } `json:"we_app_info"` // 拼多多福利券微信小程序信息 + } `json:"url_list"` + } `json:"rp_promotion_url_generate_response"` +} +type RpPromUrlGenerateError struct { + ErrorResponse struct { + ErrorMsg string `json:"error_msg"` + SubMsg string `json:"sub_msg"` + SubCode string `json:"sub_code"` + } `json:"error_response"` +} + +type RpPromUrlGenerateResult struct { + Result RpPromUrlGenerateResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 + Error RpPromUrlGenerateError // 错误结果 +} + +func NewRpPromUrlGenerateResult(result RpPromUrlGenerateResponse, body []byte, http gorequest.Response, err error, error RpPromUrlGenerateError) *RpPromUrlGenerateResult { + return &RpPromUrlGenerateResult{Result: result, Body: body, Http: http, Err: err, Error: error} +} + +// RpPromUrlGenerate 生成营销工具推广链接 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.rp.prom.url.generate +func (app *App) RpPromUrlGenerate(notMustParams ...Params) *RpPromUrlGenerateResult { + // 参数 + params := NewParamsWithType("pdd.ddk.rp.prom.url.generate", notMustParams...) + params.Set("p_id_list", []string{app.Pid}) + // 请求 + request, err := app.request(params) + // 定义 + var response RpPromUrlGenerateResponse + err = json.Unmarshal(request.ResponseBody, &response) + var responseError RpPromUrlGenerateError + err = json.Unmarshal(request.ResponseBody, &responseError) + return NewRpPromUrlGenerateResult(response, request.ResponseBody, request, err, responseError) +} diff --git a/pdd.ddk.top.goods.list.query.go b/pdd.ddk.top.goods.list.query.go new file mode 100644 index 0000000..0f665a1 --- /dev/null +++ b/pdd.ddk.top.goods.list.query.go @@ -0,0 +1,72 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type TopGoodsListQueryResponse struct { + TopGoodsListGetResponse struct { + List []struct { + CatIds []int `json:"cat_ids"` + CouponDiscount int `json:"coupon_discount"` + CouponEndTime int `json:"coupon_end_time"` + CouponMinOrderAmount int `json:"coupon_min_order_amount"` + CouponRemainQuantity int `json:"coupon_remain_quantity"` + CouponStartTime int `json:"coupon_start_time"` + CouponTotalQuantity int `json:"coupon_total_quantity"` + DescTxt string `json:"desc_txt"` + GoodsDesc string `json:"goods_desc"` + GoodsGalleryUrls []string `json:"goods_gallery_urls"` + GoodsId int64 `json:"goods_id"` + GoodsImageUrl string `json:"goods_image_url"` + GoodsName string `json:"goods_name"` + GoodsSign string `json:"goods_sign"` + GoodsThumbnailUrl string `json:"goods_thumbnail_url"` + LgstTxt string `json:"lgst_txt"` + MallId int64 `json:"mall_id"` + MallName string `json:"mall_name"` + MerchantType string `json:"merchant_type"` + MinGroupPrice int `json:"min_group_price"` + MinNormalPrice int `json:"min_normal_price"` + OptId int `json:"opt_id"` + OptIds []int `json:"opt_ids"` + OptName string `json:"opt_name"` + PredictPromotionRate int `json:"predict_promotion_rate"` + PromotionRate int `json:"promotion_rate"` + SalesTip string `json:"sales_tip"` + SearchId string `json:"search_id"` + ServTxt string `json:"serv_txt"` + ShareRate int `json:"share_rate"` + CategoryId int64 `json:"category_id"` + CategoryName string `json:"category_name"` + } `json:"list"` + ListId string `json:"list_id"` + SearchId string `json:"search_id"` + Total int64 `json:"total"` + } `json:"top_goods_list_get_response"` +} +type TopGoodsListQueryResult struct { + Result TopGoodsListQueryResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewTopGoodsListQueryResult(result TopGoodsListQueryResponse, body []byte, http gorequest.Response, err error) *TopGoodsListQueryResult { + return &TopGoodsListQueryResult{Result: result, Body: body, Http: http, Err: err} +} + +// TopGoodsListQuery 多多客获取爆款排行商品接口 +// https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.top.goods.list.query +func (app *App) TopGoodsListQuery(notMustParams ...Params) *TopGoodsListQueryResult { + // 参数 + params := NewParamsWithType("pdd.ddk.top.goods.list.query", notMustParams...) + params.Set("p_id", app.Pid) + // 请求 + request, err := app.request(params) + // 定义 + var response TopGoodsListQueryResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewTopGoodsListQueryResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.goods.cats.get.go b/pdd.goods.cats.get.go new file mode 100644 index 0000000..c0df260 --- /dev/null +++ b/pdd.goods.cats.get.go @@ -0,0 +1,43 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type GoodsCatsGetResponse struct { + GoodsCatsGetResponse struct { + GoodsCatsList []struct { + CatId int `json:"cat_id"` // 商品类目ID + CatName string `json:"cat_name"` // 商品类目名称 + Level int `json:"level"` // 类目层级,1-一级类目,2-二级类目,3-三级类目,4-四级类目 + ParentCatID int `json:"parent_cat_id"` // id所属父类目ID,其中,parent_id=0时为顶级节点 + } `json:"goods_cats_list"` + } `json:"goods_cats_get_response"` +} + +type GoodsCatsGetResult struct { + Result GoodsCatsGetResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewGoodsCatsGetResult(result GoodsCatsGetResponse, body []byte, http gorequest.Response, err error) *GoodsCatsGetResult { + return &GoodsCatsGetResult{Result: result, Body: body, Http: http, Err: err} +} + +// GoodsCatsGet 商品标准类目接口 +// https://open.pinduoduo.com/application/document/api?id=pdd.goods.cats.get +func (app *App) GoodsCatsGet(parentOptId int) *GoodsCatsGetResult { + // 参数 + param := NewParams() + param.Set("parent_cat_id", parentOptId) + params := NewParamsWithType("pdd.goods.cats.get", param) + // 请求 + request, err := app.request(params) + // 定义 + var response GoodsCatsGetResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewGoodsCatsGetResult(response, request.ResponseBody, request, err) +} diff --git a/pdd.goods.opt.get.go b/pdd.goods.opt.get.go new file mode 100644 index 0000000..31805b5 --- /dev/null +++ b/pdd.goods.opt.get.go @@ -0,0 +1,43 @@ +package pinduoduo + +import ( + "encoding/json" + "go.dtapp.net/gorequest" +) + +type GoodsOptGetResponse struct { + GoodsOptGetResponse struct { + GoodsOptList []struct { + Level int `json:"level"` // 层级,1-一级,2-二级,3-三级,4-四级 + OptId int `json:"opt_id"` // 商品标签ID + OptName string `json:"opt_name"` // 商品标签名 + ParentOptId int `json:"parent_opt_id"` // id所属父ID,其中,parent_id=0时为顶级节点 + } `json:"goods_opt_list"` + } `json:"goods_opt_get_response"` +} + +type GoodsOptGetResult struct { + Result GoodsOptGetResponse // 结果 + Body []byte // 内容 + Http gorequest.Response // 请求 + Err error // 错误 +} + +func NewGoodsOptGetResult(result GoodsOptGetResponse, body []byte, http gorequest.Response, err error) *GoodsOptGetResult { + return &GoodsOptGetResult{Result: result, Body: body, Http: http, Err: err} +} + +// GoodsOptGet 查询商品标签列表 +// https://open.pinduoduo.com/application/document/api?id=pdd.goods.opt.get +func (app *App) GoodsOptGet(parentOptId int) *GoodsOptGetResult { + // 参数 + param := NewParams() + param.Set("parent_opt_id", parentOptId) + params := NewParamsWithType("pdd.goods.opt.get", param) + // 请求 + request, err := app.request(params) + // 定义 + var response GoodsOptGetResponse + err = json.Unmarshal(request.ResponseBody, &response) + return NewGoodsOptGetResult(response, request.ResponseBody, request, err) +} diff --git a/pgsql.go b/pgsql.go new file mode 100644 index 0000000..dc1d45d --- /dev/null +++ b/pgsql.go @@ -0,0 +1,26 @@ +package pinduoduo + +import ( + "go.dtapp.net/gojson" + "go.dtapp.net/golog" + "go.dtapp.net/gorequest" + "gorm.io/datatypes" +) + +// 记录日志 +func (app *App) postgresqlLog(api string, request gorequest.Response) { + app.log.Record(golog.ApiPostgresqlLog{ + RequestTime: golog.TimeString{Time: request.RequestTime}, //【请求】时间 + RequestUri: request.RequestUri, //【请求】链接 + RequestUrl: gorequest.UriParse(request.RequestUri).Url, //【请求】链接 + RequestApi: api, //【请求】接口 + RequestMethod: request.RequestMethod, //【请求】方式 + RequestParams: datatypes.JSON(gojson.JsonEncodeNoError(request.RequestParams)), //【请求】参数 + RequestHeader: datatypes.JSON(gojson.JsonEncodeNoError(request.RequestHeader)), //【返回】头部 + ResponseHeader: datatypes.JSON(gojson.JsonEncodeNoError(request.ResponseHeader)), //【返回】头部 + ResponseStatusCode: request.ResponseStatusCode, //【返回】状态码 + ResponseBody: request.ResponseBody, //【返回】内容 + ResponseContentLength: request.ResponseContentLength, //【返回】大小 + ResponseTime: golog.TimeString{Time: request.ResponseTime}, //【返回】时间 + }) +} diff --git a/version.go b/version.go new file mode 100644 index 0000000..cfc31fa --- /dev/null +++ b/version.go @@ -0,0 +1,3 @@ +package pinduoduo + +const Version = "1.0.0"