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 }