获取商品列表-已登的店铺,删除商品-已登的店铺,新增商品等接口,版本1.0

This commit is contained in:
Cai1Cai1 2025-11-24 18:09:12 +08:00
parent 3c0c91bf3b
commit aed65dfb31
8 changed files with 279 additions and 12 deletions

2
.gitignore vendored
View File

@ -4,7 +4,7 @@
# Binaries for programs and plugins # Binaries for programs and plugins
*.exe *.exe
*.exe~ *.exe~
*.dll #*.dll
*.so *.so
*.dylib *.dylib

BIN
dll/kongfz.dll Normal file

Binary file not shown.

View File

@ -92,6 +92,30 @@ extern "C" {
#endif #endif
// 登录(带有Out的都非官方标准接口)
//
extern __declspec(dllexport) char* OutLogin(char* username, char* password);
// 获取用户信息(带有Out的都非官方标准接口)
//
extern __declspec(dllexport) char* OutGetUserMsg(char* token);
// 获取商品模版(带有Out的都非官方标准接口)
//
extern __declspec(dllexport) char* OutGetGoodsTplMsg(char* token, char* itemId, char* proxy);
// 获取商品列表-已登的店铺(带有Out的都非官方标准接口)
//
extern __declspec(dllexport) char* OutGetGoodsListMsgFromSelfShop(char* token, char* proxy, char* itemSn, char* priceMin, char* priceMax, int startCreateTime, int endCreateTime, char* requestType, int isItemSnEqual, int page, int size);
// 删除商品-已登的店铺(带有Out的都非官方标准接口)
//
extern __declspec(dllexport) char* OutDelGoodsFromSelfShop(char* token, char* proxy, char* itemId);
// 新增商品(带有Out的都非官方标准接口)
//
extern __declspec(dllexport) char* OutAddGoods(char* token, char* proxy, char* formData);
// 获取商品图片(带有Out的都非官方标准接口) // 获取商品图片(带有Out的都非官方标准接口)
// //
extern __declspec(dllexport) char* OutGetImageByIsbn(char* token, char* isbn, char* proxy, int isLiveImage, int isReturnMsg); extern __declspec(dllexport) char* OutGetImageByIsbn(char* token, char* isbn, char* proxy, int isLiveImage, int isReturnMsg);

BIN
dll/proxyConfig.dll Normal file

Binary file not shown.

BIN
dll/test.dll Normal file

Binary file not shown.

BIN
dll/xkongfz.dll Normal file

Binary file not shown.

101
main.go
View File

@ -519,7 +519,69 @@ func outGetGoodsListMsgFromSelfShop(token string, proxy string, itemSn string, p
if err := json.Unmarshal([]byte(body), &data); err != nil { if err := json.Unmarshal([]byte(body), &data); err != nil {
return nil, fmt.Errorf("解析JSON失败: %w", err) return nil, fmt.Errorf("解析JSON失败: %w", err)
} }
if val, ok := data["status"]; ok && val == 1 { if _, ok := data["status"]; ok {
return data, nil
}
return nil, fmt.Errorf("API返回错误: %+v", data)
}
// 删除商品-已登的店铺(带有Out的都非官方标准接口)
func outDelGoodsFromSelfShop(token, proxy, itemId string) (map[string]interface{}, error) {
if token == "" {
return nil, fmt.Errorf("请先登录获取Token")
}
url := "https://seller.kongfz.com/pc-gw/book-manage-service/client/pc/goods/quickUpdate"
formData := map[string]string{
"itemId": itemId,
"updateType": "delete",
"value": "1",
}
request := gorequest.New()
if proxy != "" {
request.Proxy(proxy)
}
resp, body, errs := request.Post(url).
Set("Cookie", fmt.Sprintf("PHPSESSID=%s", token)).
Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36").
Set("Accept", "application/json, text/plain, */*").
Send(formData).
Timeout(15 * time.Second).
End()
if errs != nil {
// 检查是否是代理相关错误
var isProxyError bool
var errorDetails []string
for _, e := range errs {
errorStr := e.Error()
errorDetails = append(errorDetails, errorStr)
if strings.Contains(errorStr, "Proxy Authentication Required") ||
strings.Contains(errorStr, "connectex: A connection attempt failed") ||
strings.Contains(errorStr, "connectex: No connection could be made") ||
strings.Contains(errorStr, "proxyconnect tcp") ||
strings.Contains(errorStr, "timeout") ||
strings.Contains(errorStr, "connection refused") {
isProxyError = true
}
}
log.Printf("[ERROR] 请求错误详情: %v", errorDetails)
if isProxyError {
// 处理代理失败
return nil, fmt.Errorf("代理连接失败")
}
return nil, fmt.Errorf("查询请求失败: %v", errs)
}
//检查HTTP状态码
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("HTTP错误: %s", resp.Status)
}
var data map[string]interface{}
if err := json.Unmarshal([]byte(body), &data); err != nil {
return nil, fmt.Errorf("解析JSON失败: %w", err)
}
if status, ok := data["status"].(bool); ok && status {
return data, nil
}
if status, ok := data["status"].(float64); ok && status == 1 {
return data, nil return data, nil
} }
return nil, fmt.Errorf("API返回错误: %+v", data) return nil, fmt.Errorf("API返回错误: %+v", data)
@ -527,6 +589,9 @@ func outGetGoodsListMsgFromSelfShop(token string, proxy string, itemSn string, p
// 新增商品(带有Out的都非官方标准接口) // 新增商品(带有Out的都非官方标准接口)
func outAddGoods(token, proxy, formData string) (map[string]interface{}, error) { func outAddGoods(token, proxy, formData string) (map[string]interface{}, error) {
if token == "" {
return nil, fmt.Errorf("请先登录获取Token")
}
url := "https://seller.kongfz.com/pc/itemInfo/add" url := "https://seller.kongfz.com/pc/itemInfo/add"
request := gorequest.New() request := gorequest.New()
if proxy != "" { if proxy != "" {
@ -2782,6 +2847,40 @@ func OutGetGoodsListMsgFromSelfShop(token, proxy, itemSn, priceMin, priceMax *C.
return C.CString(string(jsonData)) return C.CString(string(jsonData))
} }
// 删除商品-已登的店铺(带有Out的都非官方标准接口)
//
//export OutDelGoodsFromSelfShop
func OutDelGoodsFromSelfShop(token, proxy, itemId *C.char) *C.char {
goToken := C.GoString(token)
goProxy := C.GoString(proxy)
goItemId := C.GoString(itemId)
info, err := outDelGoodsFromSelfShop(goToken, goProxy, goItemId)
var apiResponse APIResponse
if err != nil {
apiResponse = APIResponse{
Success: false,
Message: err.Error(),
}
} else {
apiResponse = APIResponse{
Success: true,
Data: info,
}
}
// 转换为JSON字符串
jsonData, marshalErr := json.Marshal(apiResponse)
if marshalErr != nil {
// 如果JSON序列化失败返回错误信息
apiResponse = APIResponse{
Success: false,
Message: fmt.Sprintf("JSON序列化失败: %v", marshalErr),
}
errorJson, _ := json.Marshal(apiResponse)
return C.CString(string(errorJson))
}
return C.CString(string(jsonData))
}
// 新增商品(带有Out的都非官方标准接口) // 新增商品(带有Out的都非官方标准接口)
// //
//export OutAddGoods //export OutAddGoods

View File

@ -417,6 +417,115 @@ func (m *DLLManager) OutLogin(username, password string) (string, error) {
return string(resultBytes), nil return string(resultBytes), nil
} }
// 获取 OutGetUserMsg
func (m *DLLManager) OutGetUserMsg(token string) (string, error) {
// 获取函数
proc, err := m.dll.FindProc("OutGetUserMsg")
if err != nil {
return "", fmt.Errorf("找不到函数 %s: %v", "OutGetUserMsg", err)
}
// 转换参数
tokenPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(token)))
// 调用函数
ret, _, err := proc.Call(tokenPtr)
if ret == 0 {
return "", fmt.Errorf("DLL调用失败: %v", err)
}
// 将C字符串转换为Go字符串
var resultBytes []byte
for i := 0; ; i++ {
if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(ret)) + uintptr(i))) == 0 {
break
}
resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(ret)) + uintptr(i))))
}
// 释放内存假设DLL提供了FreeMemory函数
findProc, err := m.dll.FindProc("FreeString")
if findProc != nil {
findProc.Call(ret)
}
return string(resultBytes), nil
}
// 获取 OutGetGoodsTplMsg
func (m *DLLManager) OutGetGoodsTplMsg(token, itemId, proxy string) (string, error) {
// 获取函数
proc, err := m.dll.FindProc("OutGetGoodsTplMsg")
if err != nil {
return "", fmt.Errorf("找不到函数 %s: %v", "OutGetGoodsTplMsg", err)
}
// 转换参数
tokenPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(token)))
itemIdPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(itemId)))
proxyPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(proxy)))
// 调用函数
ret, _, err := proc.Call(tokenPtr, itemIdPtr, proxyPtr)
if ret == 0 {
return "", fmt.Errorf("DLL调用失败: %v", err)
}
// 将C字符串转换为Go字符串
var resultBytes []byte
for i := 0; ; i++ {
if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(ret)) + uintptr(i))) == 0 {
break
}
resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(ret)) + uintptr(i))))
}
// 释放内存假设DLL提供了FreeMemory函数
findProc, err := m.dll.FindProc("FreeString")
if findProc != nil {
findProc.Call(ret)
}
return string(resultBytes), nil
}
// 获取 OutGetGoodsListMsgFromSelfShop
func (m *DLLManager) OutGetGoodsListMsgFromSelfShop(token string, proxy string, itemSn string, priceMin string, priceMax string, startCreateTime int,
endCreateTime int, requestType string, isItemSnEqual int, page int, size int) (string, error) {
// 获取函数
proc, err := m.dll.FindProc("OutGetGoodsListMsgFromSelfShop")
if err != nil {
return "", fmt.Errorf("找不到函数 %s: %v", "OutGetGoodsListMsgFromSelfShop", err)
}
// 转换参数
tokenPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(token)))
proxyPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(proxy)))
itemSnPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(itemSn)))
priceMinPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(priceMin)))
priceMaxPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(priceMax)))
startCreateTimePtr := uintptr(startCreateTime)
endCreateTimePtr := uintptr(endCreateTime)
requestTypePtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(requestType)))
isItemSnEqualPtr := uintptr(isItemSnEqual)
pagePtr := uintptr(page)
sizePtr := uintptr(size)
// 调用函数
ret, _, err := proc.Call(tokenPtr, proxyPtr, itemSnPtr, priceMinPtr, priceMaxPtr, startCreateTimePtr, endCreateTimePtr, requestTypePtr, isItemSnEqualPtr, pagePtr, sizePtr)
if ret == 0 {
return "", fmt.Errorf("DLL调用失败: %v", err)
}
// 将C字符串转换为Go字符串
var resultBytes []byte
for i := 0; ; i++ {
if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(ret)) + uintptr(i))) == 0 {
break
}
resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(ret)) + uintptr(i))))
}
// 释放内存假设DLL提供了FreeMemory函数
findProc, err := m.dll.FindProc("FreeString")
if findProc != nil {
findProc.Call(ret)
}
return string(resultBytes), nil
}
// 获取 OutGetImageByIsbn // 获取 OutGetImageByIsbn
func (m *DLLManager) OutGetImageByIsbn(token string, isbn string, proxy string, isLiveImage bool, isReturnMsg bool) (string, error) { func (m *DLLManager) OutGetImageByIsbn(token string, isbn string, proxy string, isLiveImage bool, isReturnMsg bool) (string, error) {
// 获取函数 // 获取函数
@ -793,7 +902,7 @@ func main() {
func handleGetKFZShopBookInfo(w http.ResponseWriter, r *http.Request) { func handleGetKFZShopBookInfo(w http.ResponseWriter, r *http.Request) {
// 加载DLL // 加载DLL
manager, err := NewDLLManager("dll/xkongfz.dll") manager, err := NewDLLManager("dll/kongfz.dll")
if err != nil { if err != nil {
fmt.Printf("初始化DLL管理器失败: %v", err) fmt.Printf("初始化DLL管理器失败: %v", err)
} }
@ -833,24 +942,55 @@ func handleGetKFZShopBookInfo(w http.ResponseWriter, r *http.Request) {
return return
} }
login, err := outLogin("15140030829", "cuiyang") // 获取代理信息
typeManager, err := proxyTypeManager("CALF_ELEPHANT_PROXY", "1297757178467602432", "QgQBvP7f", "")
if err != nil { if err != nil {
fmt.Printf(err.Error()) fmt.Printf(err.Error())
} }
fmt.Println(login) fmt.Println(typeManager)
msg, err := outGetGoodsTplMsg(login, "1181761", "") user, err := manager.OutLogin("18904056801", "Long6166@@")
if err != nil {
fmt.Printf(err.Error())
}
fmt.Println(user)
var data APIResponse
if err := json.Unmarshal([]byte(user), &data); err != nil {
log.Printf("[ERROR] 解析第 %d 页失败: %v", data, err)
}
var token string
// 从 Data 中提取 token
if dataMap, ok := data.Data.(map[string]interface{}); ok {
if tk, exists := dataMap["token"]; exists {
fmt.Println("Token:", tk)
token = tk.(string)
// Token: d322c80960ab6722922912dd2ce219d4b4099d54
} else {
fmt.Println("Token 不存在")
}
} else {
fmt.Println("Data 格式不正确")
}
fmt.Println(token)
msg, err := manager.OutGetUserMsg(token)
if err != nil { if err != nil {
fmt.Printf(err.Error()) fmt.Printf(err.Error())
} }
fmt.Println(msg) fmt.Println(msg)
//// 获取代理信息 tplMsg, err := manager.OutGetGoodsTplMsg(token, "9142583516", "")
//typeManager, err := proxyTypeManager("CALF_ELEPHANT_PROXY", "1297757178467602432", "QgQBvP7f", "") if err != nil {
//if err != nil { fmt.Printf(err.Error())
// fmt.Printf(err.Error()) }
//} fmt.Println(tplMsg)
//fmt.Println(typeManager)
shop, err := manager.OutGetGoodsListMsgFromSelfShop(token, "", "", "", "", 0, 0, "allUnSold", 0, 1, 10)
if err != nil {
fmt.Printf(err.Error())
}
fmt.Println(shop)
//// 获取cookie //// 获取cookie
//cookie, err := loginCookie() //cookie, err := loginCookie()
@ -955,6 +1095,10 @@ func handleGetKFZShopBookInfo(w http.ResponseWriter, r *http.Request) {
} }
func manegiyoutGetGoodsListMsgFromSelfShop() {
}
// 发送错误响应 // 发送错误响应
func sendErrorResponse(w http.ResponseWriter, statusCode int, message string) { func sendErrorResponse(w http.ResponseWriter, statusCode int, message string) {
response := APIResp{ response := APIResp{