daShangDao_kfzgw-info/pddTask/common/pddDll.go
2026-02-27 11:46:40 +08:00

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
}