From 67880d36ae35a7d3ec26ebfab52b1e2fbd6da63f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=85=89=E6=98=A5?= Date: Fri, 27 May 2022 01:01:26 +0800 Subject: [PATCH] - init --- .drone.yml | 17 ++ .gitignore | 10 + app.go | 108 +++++++++++ crypto.go | 15 ++ go.mod | 25 +++ go.sum | 239 ++++++++++++++++++++++++ param.go | 7 + params.go | 90 +++++++++ pdd.ddk.cms.prom.url.generate.go | 77 ++++++++ pdd.ddk.goods.detail.go | 110 +++++++++++ pdd.ddk.goods.pid.generate.go | 42 +++++ pdd.ddk.goods.promotion.url.generate.go | 63 +++++++ pdd.ddk.goods.recommend.get.go | 92 +++++++++ pdd.ddk.goods.search.go | 106 +++++++++++ pdd.ddk.member.authority.query.go | 38 ++++ pdd.ddk.order.detail.get.go | 80 ++++++++ pdd.ddk.order.list.increment.get.go | 83 ++++++++ pdd.ddk.order.list.range.get.go | 83 ++++++++ pdd.ddk.resource.url.gen.go | 66 +++++++ pdd.ddk.rp.prom.url.generate.go | 81 ++++++++ pdd.ddk.top.goods.list.query.go | 72 +++++++ pdd.goods.cats.get.go | 43 +++++ pdd.goods.opt.get.go | 43 +++++ pgsql.go | 26 +++ version.go | 3 + 25 files changed, 1619 insertions(+) create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 app.go create mode 100644 crypto.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 param.go create mode 100644 params.go create mode 100644 pdd.ddk.cms.prom.url.generate.go create mode 100644 pdd.ddk.goods.detail.go create mode 100644 pdd.ddk.goods.pid.generate.go create mode 100644 pdd.ddk.goods.promotion.url.generate.go create mode 100644 pdd.ddk.goods.recommend.get.go create mode 100644 pdd.ddk.goods.search.go create mode 100644 pdd.ddk.member.authority.query.go create mode 100644 pdd.ddk.order.detail.get.go create mode 100644 pdd.ddk.order.list.increment.get.go create mode 100644 pdd.ddk.order.list.range.get.go create mode 100644 pdd.ddk.resource.url.gen.go create mode 100644 pdd.ddk.rp.prom.url.generate.go create mode 100644 pdd.ddk.top.goods.list.query.go create mode 100644 pdd.goods.cats.get.go create mode 100644 pdd.goods.opt.get.go create mode 100644 pgsql.go create mode 100644 version.go 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"