129 lines
4.0 KiB
Go
129 lines
4.0 KiB
Go
package common
|
|
|
|
import "C"
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
// ErrorResponse 错误响应结构
|
|
type ErrorResponse struct {
|
|
ErrorMsg string `json:"error_msg"` // 错误信息
|
|
SubMsg string `json:"sub_msg"` // 子错误信息
|
|
SubCode interface{} `json:"sub_code"` // 使用json.RawMessage处理null和不同类型
|
|
ErrorCode int `json:"error_code"` // 错误代码
|
|
RequestID string `json:"request_id"` // 请求ID
|
|
}
|
|
|
|
// ErrorWrapper 最外层错误响应包装
|
|
type ErrorWrapper struct {
|
|
ErrorResponse ErrorResponse `json:"error_response"` // 错误响应
|
|
}
|
|
|
|
// GoodsImageUploadResp 商品图片上传响应结构体
|
|
type GoodsImageUploadResp struct {
|
|
GoodsImageUploadResponse struct {
|
|
ImageURL string `json:"image_url"` // 上传后的图片URL
|
|
RequestID string `json:"request_id"` // 请求ID
|
|
} `json:"goods_image_upload_response"`
|
|
}
|
|
|
|
// PddDLL 拼多多工具DLL结构
|
|
type pddDLL struct {
|
|
dll *syscall.DLL
|
|
pddGoodsOuterCatMappingGet *syscall.Proc // 类目预测接口
|
|
pddGoodsAdd *syscall.Proc // 商品新增接口
|
|
pddGoodsAd *syscall.Proc // 商品新增接口
|
|
pddGoodsImageUpload *syscall.Proc // 商品图片上传接口
|
|
freeCString *syscall.Proc // 释放C字符串
|
|
}
|
|
|
|
// InitPddDLL 初始化pddDLL
|
|
func InitPddDLL() (*pddDLL, error) {
|
|
dllPath := filepath.Join("pddTask", "dll", "pdd.dll")
|
|
if _, err := os.Stat(dllPath); os.IsNotExist(err) {
|
|
return nil, fmt.Errorf("pdd DLL 不存在: %s", dllPath)
|
|
}
|
|
if dll, err := syscall.LoadDLL(dllPath); err != nil {
|
|
return nil, fmt.Errorf("加载pdd DLL 失败: %s", err)
|
|
} else {
|
|
return &pddDLL{
|
|
dll: dll,
|
|
pddGoodsOuterCatMappingGet: dll.MustFindProc("PddGoodsOuterCatMappingGet"),
|
|
pddGoodsAdd: dll.MustFindProc("PddGoodsAdd"),
|
|
pddGoodsAd: dll.MustFindProc("PddGoodsAd"),
|
|
pddGoodsImageUpload: dll.MustFindProc("PddGoodsImageUpload"),
|
|
freeCString: dll.MustFindProc("FreeCString"),
|
|
}, nil
|
|
}
|
|
}
|
|
|
|
// cStr 获取C字符串
|
|
func (m *pddDLL) cStr(p uintptr) string {
|
|
if p == 0 {
|
|
return ""
|
|
}
|
|
b := []byte{}
|
|
for i := uintptr(0); ; i++ {
|
|
c := *(*byte)(unsafe.Pointer(p + i))
|
|
if c == 0 {
|
|
break
|
|
}
|
|
b = append(b, c)
|
|
}
|
|
s := string(b)
|
|
if m.freeCString != nil {
|
|
m.freeCString.Call(p)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// PddGoodsAdd 商品新增接口
|
|
func PddGoodsAdd(clientId, clientSecret, accessToken, goodsAddJson string) (string, error) {
|
|
dll, err := InitPddDLL()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
|
|
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
|
|
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
|
|
goodsAddJsonPtr, _ := syscall.BytePtrFromString(goodsAddJson)
|
|
info, _, _ := dll.pddGoodsAdd.Call(
|
|
uintptr(unsafe.Pointer(clientIdPtr)),
|
|
uintptr(unsafe.Pointer(clientSecretPtr)),
|
|
uintptr(unsafe.Pointer(accessTokenPtr)),
|
|
uintptr(unsafe.Pointer(goodsAddJsonPtr)),
|
|
)
|
|
result := dll.cStr(info)
|
|
return result, err
|
|
}
|
|
|
|
// PddGoodsImageUpload 商品图片上传接口
|
|
func (m *pddDLL) PddGoodsImageUpload(clientId, clientSecret, accessToken, fileBase string) (string, error) {
|
|
proc := m.pddGoodsImageUpload
|
|
|
|
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
|
|
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
|
|
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
|
|
fileBasePtr, _ := syscall.BytePtrFromString(fileBase)
|
|
|
|
info, _, _ := proc.Call(
|
|
uintptr(unsafe.Pointer(clientIdPtr)),
|
|
uintptr(unsafe.Pointer(clientSecretPtr)),
|
|
uintptr(unsafe.Pointer(accessTokenPtr)),
|
|
uintptr(unsafe.Pointer(fileBasePtr)),
|
|
)
|
|
result := m.cStr(info)
|
|
// 解析
|
|
var goodsImageUploadResp GoodsImageUploadResp
|
|
if err := json.Unmarshal([]byte(result), &goodsImageUploadResp); err != nil {
|
|
return "", fmt.Errorf("解析 goodsImageUploadResp JSON失败: %s,响应信息: %s", err, result)
|
|
}
|
|
return goodsImageUploadResp.GoodsImageUploadResponse.ImageURL, nil
|
|
}
|