package main import "C" import ( "encoding/json" "fmt" "log" "net/http" "os" "path/filepath" "syscall" "unsafe" ) // 配置结构 type Configs struct { App struct { MaxRetryTimes int `json:"max_retry_times"` RateLimitDelay int `json:"rate_limit_delay"` Size int `json:"size"` DefaultUserAgent string `json:"default_user_agent"` } `json:"app"` API struct { LoginURL string `json:"login_url"` BookSearchURL string `json:"book_search_url"` ProductSearchURL string `json:"product_search_url"` } `json:"api"` Proxy struct { Servers string `json:"servers"` Username string `json:"username"` Password string `json:"password"` TailMachineCode string `json:"tail_machine_code"` TailCardKey string `json:"tail_card_key"` ProxyFilePath string `json:"proxy_file_path"` } `json:"proxy"` } // API响应结构 type APIResponses struct { Success bool `json:"success"` Message string `json:"message,omitempty"` GoodsNum string `json:"goods_num,omitempty"` PNum string `json:"pnum,omitempty"` Data interface{} `json:"data,omitempty"` Error string `json:"error,omitempty"` } type DLLManager struct { dll *syscall.DLL } func NewDLLManager(dllPath string) (*DLLManager, error) { dll, err := syscall.LoadDLL(dllPath) if err != nil { return nil, fmt.Errorf("加载DLL失败: %v", err) } return &DLLManager{dll: dll}, nil } func (m *DLLManager) Close() { if m.dll != nil { m.dll.Release() } } // 单参数函数调用 func (m *DLLManager) callFunction(funcName string, arg string) (string, error) { proc, err := m.dll.FindProc(funcName) if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", funcName, err) } argPtr, _ := syscall.BytePtrFromString(arg) r1, _, err := proc.Call(uintptr(unsafe.Pointer(argPtr))) if err != nil && err.Error() != "The operation completed successfully." { return "", fmt.Errorf("调用函数 %s 失败: %v", funcName, err) } result := (*byte)(unsafe.Pointer(r1)) // 将C字符串转换为Go字符串 var resultBytes []byte for i := 0; ; i++ { if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i))) == 0 { break } resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i)))) } // 释放内存 freeProc, _ := m.dll.FindProc("FreeString") if freeProc != nil { freeProc.Call(r1) } return string(resultBytes), nil } // 二参数函数调用 func (m *DLLManager) callFunctionTwoArgs(funcName string, args ...string) (string, error) { if len(args) != 2 { return "", fmt.Errorf("函数 %s 需要2个参数,但提供了 %d 个", funcName, len(args)) } proc, err := m.dll.FindProc(funcName) if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", funcName, err) } // 准备参数指针 argPtrs := make([]uintptr, 2) for i, arg := range args { argPtr, _ := syscall.BytePtrFromString(arg) argPtrs[i] = uintptr(unsafe.Pointer(argPtr)) } r1, _, err := proc.Call( argPtrs[0], // proxyType argPtrs[1], // username ) if err != nil && err.Error() != "The operation completed successfully." { return "", fmt.Errorf("调用函数 %s 失败: %v", funcName, err) } result := (*byte)(unsafe.Pointer(r1)) // 将C字符串转换为Go字符串 var resultBytes []byte for i := 0; ; i++ { if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i))) == 0 { break } resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i)))) } // 释放内存 freeProc, _ := m.dll.FindProc("FreeString") if freeProc != nil { freeProc.Call(r1) } return string(resultBytes), nil } // 五参数函数调用 - 用于 GetKFZGTImageURL 和 GetKFZSPTImageURL func (m *DLLManager) callFunctionFiveArgs(funcName string, args ...string) (string, error) { if len(args) != 5 { return "", fmt.Errorf("函数 %s 需要5个参数,但提供了 %d 个", funcName, len(args)) } proc, err := m.dll.FindProc(funcName) if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", funcName, err) } // 准备参数指针 argPtrs := make([]uintptr, 5) for i, arg := range args { argPtr, _ := syscall.BytePtrFromString(arg) argPtrs[i] = uintptr(unsafe.Pointer(argPtr)) } r1, _, err := proc.Call( argPtrs[0], // proxyType argPtrs[1], // username argPtrs[2], // password argPtrs[3], // machineCode argPtrs[4], // isbn ) if err != nil && err.Error() != "The operation completed successfully." { return "", fmt.Errorf("调用函数 %s 失败: %v", funcName, err) } result := (*byte)(unsafe.Pointer(r1)) // 将C字符串转换为Go字符串 var resultBytes []byte for i := 0; ; i++ { if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i))) == 0 { break } resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i)))) } // 释放内存 freeProc, _ := m.dll.FindProc("FreeString") if freeProc != nil { freeProc.Call(r1) } return string(resultBytes), nil } // 六参数函数调用 func (m *DLLManager) callFunctionSixArgs(funcName string, args ...string) (string, error) { if len(args) != 6 { return "", fmt.Errorf("函数 %s 需要6个参数,但提供了 %d 个", funcName, len(args)) } proc, err := m.dll.FindProc(funcName) if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", funcName, err) } // 准备参数指针 argPtrs := make([]uintptr, 6) for i, arg := range args { argPtr, _ := syscall.BytePtrFromString(arg) argPtrs[i] = uintptr(unsafe.Pointer(argPtr)) } r1, _, err := proc.Call( argPtrs[0], // fetchMode argPtrs[1], // proxyType argPtrs[2], // username argPtrs[3], // password argPtrs[4], // machineCode argPtrs[5], // isbn ) if err != nil && err.Error() != "The operation completed successfully." { return "", fmt.Errorf("调用函数 %s 失败: %v", funcName, err) } result := (*byte)(unsafe.Pointer(r1)) // 将C字符串转换为Go字符串 var resultBytes []byte for i := 0; ; i++ { if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i))) == 0 { break } resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i)))) } // 释放内存 freeProc, _ := m.dll.FindProc("FreeString") if freeProc != nil { freeProc.Call(r1) } return string(resultBytes), nil } // 十二参数函数调用 - 专门用于 GetKFZShopBookInfo func (m *DLLManager) callFunctionTwelveArgs(funcName string, args ...string) (string, error) { if len(args) != 12 { return "", fmt.Errorf("函数 %s 需要12个参数,但提供了 %d 个", funcName, len(args)) } proc, err := m.dll.FindProc(funcName) if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", funcName, err) } // 准备参数指针 argPtrs := make([]uintptr, 12) for i, arg := range args { argPtr, _ := syscall.BytePtrFromString(arg) argPtrs[i] = uintptr(unsafe.Pointer(argPtr)) } r1, _, err := proc.Call( argPtrs[0], // proxyType argPtrs[1], // username argPtrs[2], // password argPtrs[3], // machineCode argPtrs[4], // shopId argPtrs[5], // isImage argPtrs[6], // bookNum argPtrs[7], // pageNum argPtrs[8], // sortType argPtrs[9], // sort argPtrs[10], // priceDown argPtrs[11], // priceUp ) if err != nil && err.Error() != "The operation completed successfully." { return "", fmt.Errorf("调用函数 %s 失败: %v", funcName, err) } result := (*byte)(unsafe.Pointer(r1)) // 将C字符串转换为Go字符串 var resultBytes []byte for i := 0; ; i++ { if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i))) == 0 { break } resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i)))) } // 释放内存 freeProc, _ := m.dll.FindProc("FreeString") if freeProc != nil { freeProc.Call(r1) } return string(resultBytes), nil } // 十三参数函数调用 - 专门用于 GetKFZShopBookInfo func (m *DLLManager) callFunctionThirteenArgs(funcName string, args ...string) (string, error) { if len(args) != 13 { return "", fmt.Errorf("函数 %s 需要13个参数,但提供了 %d 个", funcName, len(args)) } proc, err := m.dll.FindProc(funcName) if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", funcName, err) } // 准备参数指针 argPtrs := make([]uintptr, 13) for i, arg := range args { argPtr, _ := syscall.BytePtrFromString(arg) argPtrs[i] = uintptr(unsafe.Pointer(argPtr)) } r1, _, err := proc.Call( argPtrs[0], // fetchMode argPtrs[1], // proxyType argPtrs[2], // username argPtrs[3], // password argPtrs[4], // machineCode argPtrs[5], // shopId argPtrs[6], // isImage argPtrs[7], // bookNum argPtrs[8], // pageNum argPtrs[9], // sortType argPtrs[10], // sort argPtrs[11], // priceDown argPtrs[12], // priceUp ) if err != nil && err.Error() != "The operation completed successfully." { return "", fmt.Errorf("调用函数 %s 失败: %v", funcName, err) } result := (*byte)(unsafe.Pointer(r1)) // 将C字符串转换为Go字符串 var resultBytes []byte for i := 0; ; i++ { if *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i))) == 0 { break } resultBytes = append(resultBytes, *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i)))) } // 释放内存 freeProc, _ := m.dll.FindProc("FreeString") if freeProc != nil { freeProc.Call(r1) } return string(resultBytes), nil } func (m *DLLManager) Initialize(configJSON string) (string, error) { return m.callFunction("Initialize", configJSON) } // 修改后的 GetKFZGTImageURL - 需要5个参数 func (m *DLLManager) GetKFZGTImageURL(proxyType, username, password, machineCode, isbn string) (string, error) { return m.callFunctionFiveArgs("GetKFZGTImageURL", proxyType, username, password, machineCode, isbn) } // 修改后的 GetKFZSPTImageURL - 需要5个参数 func (m *DLLManager) GetKFZSPTImageURL(proxyType, username, password, machineCode, isbn string) (string, error) { return m.callFunctionFiveArgs("GetKFZSPTImageURL", proxyType, username, password, machineCode, isbn) } // 修改后的 GetKFZShopBookInfo - 需要12个参数 func (m *DLLManager) GetKFZShopBookInfo(fetchMode, proxyType, username, password, machineCode, shopId, isImage, bookNum, pageNum, sortType, sort, priceDown, priceUp string) (string, error) { return m.callFunctionThirteenArgs("GetKFZShopBookInfo", fetchMode, proxyType, username, password, machineCode, shopId, isImage, bookNum, pageNum, sortType, sort, priceDown, priceUp) } // 获取 GetUrlBookDetails - 需要6个参数 func (m *DLLManager) GetUrlBookDetails(fetchMode, proxyType, username, password, machineCode, url string) (string, error) { return m.callFunctionSixArgs("GetUrlBookDetails", fetchMode, proxyType, username, password, machineCode, url) } // 获取 OutLogin func (m *DLLManager) OutLogin(username, password string) (string, error) { // 获取函数 proc, err := m.dll.FindProc("OutLogin") if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", "OutLogin", err) } // 转换参数 usernamePtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(username))) passwordPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(password))) // 调用函数 ret, _, err := proc.Call(usernamePtr, passwordPtr) 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 } // 获取 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 func (m *DLLManager) OutGetImageByIsbn(token string, isbn string, proxy string, isLiveImage bool, isReturnMsg bool) (string, error) { // 获取函数 proc, err := m.dll.FindProc("OutGetImageByIsbn") if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", "OutGetImageByIsbn", err) } // 转换参数 tokenPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(token))) isbnPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(isbn))) var proxyPtr uintptr if proxy != "" { proxyPtr = uintptr(unsafe.Pointer(syscall.StringBytePtr(proxy))) } else { proxyPtr = 0 } var isLiveImageInt int if isLiveImage { isLiveImageInt = 0 } else { isLiveImageInt = 1 } isLiveImagePtr := uintptr(isLiveImageInt) var isReturnMsgInt int if isReturnMsg { isLiveImageInt = 0 } else { isLiveImageInt = 1 } isReturnMsgPtr := uintptr(isReturnMsgInt) // 调用函数 ret, _, err := proc.Call(tokenPtr, isbnPtr, proxyPtr, isLiveImagePtr, isReturnMsgPtr) 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 } // 获取 OutGetGoodsMsgByDetailUrl func (m *DLLManager) OutGetGoodsMsgByDetailUrl(url, proxy string) (string, error) { // 获取函数 proc, err := m.dll.FindProc("OutGetGoodsMsgByDetailUrl") if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", "OutGetGoodsMsgByDetailUrl", err) } // 转换参数 urlPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(url))) var proxyPtr uintptr if proxy != "" { proxyPtr = uintptr(unsafe.Pointer(syscall.StringBytePtr(proxy))) } else { proxyPtr = 0 } // 调用函数 ret, _, err := proc.Call(urlPtr, 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 } // 获取 OutGetGoodsListMsgByShopId func (m *DLLManager) OutGetGoodsListMsgByShopId(shopId int, proxy string, isImage bool, sortType string, sort string, priceMin float32, priceMax float32, pageNum, returnNum int) (string, error) { // 获取函数 proc, err := m.dll.FindProc("OutGetGoodsListMsgByShopId") if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", "OutGetGoodsListMsgByShopId", err) } // 转换参数 shopIdPtr := uintptr(shopId) var isImageInt int if isImage { isImageInt = 0 } else { isImageInt = 1 } isImagePtr := uintptr(isImageInt) sortTypePtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(sortType))) sortPtr := uintptr(unsafe.Pointer(syscall.StringBytePtr(sort))) priceMinPtr := uintptr(*(*uint32)(unsafe.Pointer(&priceMin))) priceMaxPtr := uintptr(*(*uint32)(unsafe.Pointer(&priceMax))) pageNumPtr := uintptr(pageNum) returnNumPtr := uintptr(returnNum) var proxyPtr uintptr if proxy != "" { proxyPtr = uintptr(unsafe.Pointer(syscall.StringBytePtr(proxy))) } else { proxyPtr = 0 } // 调用函数 ret, _, err := proc.Call(shopIdPtr, proxyPtr, isImagePtr, sortTypePtr, sortPtr, priceMinPtr, priceMaxPtr, pageNumPtr, returnNumPtr) 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 } // 获取 OutGetTopGoodsListMsg func (m *DLLManager) OutGetTopGoodsListMsg(catId int, proxy string) (string, error) { // 获取函数 proc, err := m.dll.FindProc("OutGetTopGoodsListMsg") if err != nil { return "", fmt.Errorf("找不到函数 %s: %v", "OutGetTopGoodsListMsg", err) } // 转换参数 catIdPtr := uintptr(catId) var proxyPtr uintptr if proxy != "" { proxyPtr = uintptr(unsafe.Pointer(syscall.StringBytePtr(proxy))) } else { proxyPtr = 0 } // 调用函数 ret, _, err := proc.Call(catIdPtr, 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 } // 创建默认配置 func createDefaultConfig() Config { var configs Config // App配置 configs.App.MaxRetryTimes = 3 configs.App.RateLimitDelay = 1000 configs.App.Size = 10 configs.App.DefaultUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" // API配置 configs.API.LoginURL = "https://login.kongfz.com/Pc/Login/account" configs.API.BookSearchURL = "https://search.kongfz.com/pc-gw/search-web/client/pc/bookLib/keyword/list" configs.API.ProductSearchURL = "https://search.kongfz.com/pc-gw/search-web/client/pc/product/keyword/list" // 代理配置(需要根据实际情况修改) configs.Proxy.Servers = "http-dynamic.xiaoxiangdaili.com,http-dynamic-S02.xiaoxiangdaili.com,http-dynamic-S03.xiaoxiangdaili.com,http-dynamic-S04.xiaoxiangdaili.com" configs.Proxy.Username = "1297757178467602432" configs.Proxy.Password = "QgQBvP7f" configs.Proxy.TailMachineCode = "b7bf22a237ec692f13fcc2c43ee63252" configs.Proxy.TailCardKey = "DL_20_YK_1920acb2129844c2aabade3896560a9b" configs.Proxy.ProxyFilePath = "dll/proxyConfig.dll" configs.Database.Username = "newAdmin" configs.Database.Password = "bYPp8SbBe5F7nz2i" configs.Database.Host = "146.56.227.42:3306" configs.Database.Name = "newadmin" return configs } // 获取当前可执行文件所在目录 func getExecutableDir() string { exePath, err := os.Executable() if err != nil { return "." } return filepath.Dir(exePath) } // 格式化输出JSON响应 func printFormattedResponse(operation string, result string, err error) int { var apiResp APIResponses fmt.Printf("\n%s:\n", operation) fmt.Println("=" + string(make([]byte, 50)) + "=") if err != nil { fmt.Printf("❌ 错误: %v\n", err) } var count int if err := json.Unmarshal([]byte(result), &apiResp); err == nil { if apiResp.Success { fmt.Printf("✅ 成功: %s\n", apiResp.Message) if apiResp.Data != nil { fmt.Println("📊 数据:") jsonData, _ := json.MarshalIndent(apiResp.Data, "", " ") fmt.Println(string(jsonData)) // 方法1: 判断 Data 的类型并统计条数 switch data := apiResp.Data.(type) { case []interface{}: // 如果是切片/数组 count = len(data) fmt.Printf("📈 数据条数: %d\n", count) case []BookInfo: // 如果是 BookInfo 切片 count = len(data) fmt.Printf("📚 图书数量: %d\n", count) case map[string]interface{}: // 如果是映射 count = len(data) fmt.Printf("🗂️ 数据字段数: %d\n", count) case []ProductInfo: // 如果是 ProductInfo 切片 count = len(data) fmt.Printf("🛒 商品数量: %d\n", count) default: fmt.Printf("ℹ️ 数据类型: %T\n", apiResp.Data) } } if apiResp.GoodsNum != "" { fmt.Printf("📦 商品数量: %s\n", apiResp.GoodsNum) } if apiResp.PNum != "" { fmt.Printf("📄 页码: %s\n", apiResp.PNum) } } else { fmt.Printf("❌ 失败: %s\n", apiResp.Error) } } else { fmt.Printf("原始响应: %s\n", result) // 如果是代理地址,可以进一步处理 if len(result) > 0 && (result[0:4] == "http" || result[0:3] == "socks") { fmt.Printf("✅ 代理服务器地址获取成功\n") fmt.Printf("🔗 代理地址: %s\n", result) } } return count } // 专门处理代理配置响应的函数 func handleProxyResponse(result string, err error) { fmt.Printf("\n代理配置测试:\n") fmt.Println("=" + string(make([]byte, 50)) + "=") if err != nil { fmt.Printf("❌ 错误: %v\n", err) return } // 代理配置通常返回代理服务器地址,不是JSON格式 fmt.Printf("📡 代理服务器地址: %s\n", result) fmt.Printf("✅ 代理配置获取成功\n") // 如果需要,可以在这里进一步处理代理地址 // 例如:验证代理格式、提取IP和端口等 if result != "" { fmt.Printf("🔗 可用代理: %s\n", result) } } // // ProxyTypeManager 调用代理类型管理器 // // func (m *DLLManager) ProxyTypeManager(proxyType, username, password, machineCode string) (string, error) { // proc, err := m.dll.FindProc("ProxyTypeManager") // if err != nil { // return "", fmt.Errorf("找不到函数 ProxyTypeManager: %v", err) // } // // // 准备参数 // proxyTypePtr, _ := syscall.BytePtrFromString(proxyType) // usernamePtr, _ := syscall.BytePtrFromString(username) // passwordPtr, _ := syscall.BytePtrFromString(password) // machineCodePtr, _ := syscall.BytePtrFromString(machineCode) // // // 调用函数 // r1, _, err := proc.Call( // uintptr(unsafe.Pointer(proxyTypePtr)), // uintptr(unsafe.Pointer(usernamePtr)), // uintptr(unsafe.Pointer(passwordPtr)), // uintptr(unsafe.Pointer(machineCodePtr)), // ) // // if err != nil && err.Error() != "The operation completed successfully." { // return "", fmt.Errorf("调用 ProxyTypeManager 失败: %v", err) // } // // // 转换结果 // result := (*byte)(unsafe.Pointer(r1)) // var resultBytes []byte // for i := 0; ; i++ { // bytePtr := (*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(result)) + uintptr(i))) // if *bytePtr == 0 { // break // } // resultBytes = append(resultBytes, *bytePtr) // } // // // 释放内存 // freeProc, _ := m.dll.FindProc("FreeString") // if freeProc != nil { // freeProc.Call(r1) // } // // return string(resultBytes), nil // } // // FreeCString 释放C字符串内存 func (m *DLLManager) FreeCString(strPtr uintptr) error { proc, err := m.dll.FindProc("FreeCString") if err != nil { return fmt.Errorf("找不到函数 FreeCString: %v", err) } _, _, err = proc.Call(strPtr) if err != nil && err.Error() != "The operation completed successfully." { return fmt.Errorf("调用 FreeCString 失败: %v", err) } return nil } func main() { http.HandleFunc("/api/kfzShopBookInfo", handleGetKFZShopBookInfo) port := "8080" server := &http.Server{ Addr: ":" + port, Handler: nil, } // 启动服务器 if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { fmt.Printf("服务器启动失败: %v\n", err) } } func handleGetKFZShopBookInfo(w http.ResponseWriter, r *http.Request) { // 加载DLL manager, err := NewDLLManager("dll/kongfz.dll") if err != nil { fmt.Printf("初始化DLL管理器失败: %v", err) } //defer manager.Close() log.Println("✅ DLL加载成功") // 使用默认配置初始化 config := createDefaultConfig() initializeConfig(config) configJSON, err := json.Marshal(config) if err != nil { fmt.Printf("序列化配置失败: %v", err) } result, err := manager.Initialize(string(configJSON)) if err != nil { fmt.Printf("初始化失败: %v", err) } var initResp APIResponses if err := json.Unmarshal([]byte(result), &initResp); err != nil { fmt.Printf("解析初始化响应失败: %v", err) } if !initResp.Success { fmt.Printf("初始化失败: %s", initResp.Message) } log.Println("✅ DLL初始化成功") // 设置响应头 w.Header().Set("Content-Type", "application/json; charset=utf-8") // 只支持GET请求 if r.Method != http.MethodGet { sendErrorResponse(w, http.StatusMethodNotAllowed, "只支持GET方法") return } // 获取代理信息 typeManager, err := proxyTypeManager("CALF_ELEPHANT_PROXY", "1297757178467602432", "QgQBvP7f", "") if err != nil { fmt.Printf(err.Error()) } fmt.Println(typeManager) 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 { fmt.Printf(err.Error()) } fmt.Println(msg) tplMsg, err := manager.OutGetGoodsTplMsg(token, "9142583516", "") if err != nil { fmt.Printf(err.Error()) } fmt.Println(tplMsg) shop, err := manager.OutGetGoodsListMsgFromSelfShop(token, "", "", "", "", 0, 0, "allUnSold", 0, 1, 10) if err != nil { fmt.Printf(err.Error()) } fmt.Println(shop) //// 获取cookie //cookie, err := loginCookie() //if err != nil { // fmt.Printf(err.Error()) //} //fmt.Println(cookie) //account, err := getRandomAccount() //if err != nil { // fmt.Printf(err.Error()) //} //fmt.Println(account) //var isbns = []string{ // "9787500601593", "9787506331746", "9787020106752", "9787807089353", "9787536692930", "9787530221532", "9787544270878", "9787208061644", "9787506365437", "9787513708371", "9787513922135", "9787536693968", "9787541151736", "9787544213561", "9787544754781", "9787549204304", "9787108006639", "9787531764700", "9787544253994", "9787540456023", "9787540456429", "9787544267618", "9787544277723", "9787550008496", "9787806070680", "9787806801529", "9787807530244", "9787020008728", "9787020139590", "9787204055401", "9787500680239", "9787505724778", "9787506365680", "9787530221525", "9787536097261", //} // //for _, isbn := range isbns { // // 获取孔网图片 // isbnss, err := outGetImageByIsbn("", isbn, "", 0, 0) // if err != nil { // fmt.Printf(err.Error()) // } // fmt.Println(isbnss) //} //books, num, pNum, err := outGetGoodsListMsgByShopId(3092, // typeManager, true, "", // "", 0, 14, 1, 5) //msg, err := manager.OutGetTopGoodsListMsg(0, "") //if err != nil { // //} //fmt.Println(msg) //fetchMode := r.URL.Query().Get("fetchMode") //proxyType := r.URL.Query().Get("proxyType") //username := r.URL.Query().Get("username") //password := r.URL.Query().Get("password") //machineCode := r.URL.Query().Get("machineCode") //url := r.URL.Query().Get("url") //shopId := r.URL.Query().Get("shopId") //https://shop.kongfz.com/793900/all/0_100_0_0_1_sort_desc_0_0/ //isImage := r.URL.Query().Get("isImage") //bookNum := r.URL.Query().Get("bookNum") //pageNum := r.URL.Query().Get("pageNum") //sortType := r.URL.Query().Get("sortType") //sort := r.URL.Query().Get("sort") //priceDown := r.URL.Query().Get("priceDown") //priceUp := r.URL.Query().Get("priceUp") //details, err := manager.OutGetGoodsMsgByDetailUrl("https://book.kongfz.com/151391/6531924071/", "") //if err != nil { // //} //fmt.Println(details) //id, err := manager.OutGetGoodsListMsgByShopId(1181761, // "", true, "", // "", 0, 0, 1, 5) //if err != nil { // fmt.Println(err) //} //fmt.Println(id) //var pa ShopBookResult //if err := json.Unmarshal([]byte(id), &pa); err != nil { // log.Printf("[ERROR] 解析第 %d 页失败: %v", pa, err) //} //for _, urls := range pa.Data.Data { // ss, err := proxyTypeManager("CALF_ELEPHANT_PROXY", "1297757178467602432", "QgQBvP7f", "") // if err != nil { // fmt.Printf(err.Error()) // } // fmt.Println(ss) // url, err := manager.OutGetGoodsMsgByDetailUrl(urls.DetailURL, ss) // if err != nil { // fmt.Println(err) // } // fmt.Println(url) //} //books, num, pNum, err := outGetGoodsListMsgByShopId(1181761, // typeManager, true, "", // "", 0, 0, 1, 5) // //fmt.Println(books) //fmt.Println(num) //fmt.Println(pNum) //fmt.Println(err) //for _, book := range books { // ss, err := proxyTypeManager("TAIL_PROXY", "", "", "07f4d0fbcff99966c2b37b0c1fb7f01c") // if err != nil { // fmt.Printf(err.Error()) // } // fmt.Println(ss) // url, err := outGetGoodsMsgByDetailUrl(book.DetailUrl, ss) // if err != nil { // fmt.Println(err) // } // fmt.Println(url) //} } func manegiyoutGetGoodsListMsgFromSelfShop() { } // 发送错误响应 func sendErrorResponse(w http.ResponseWriter, statusCode int, message string) { response := APIResp{ Success: false, Message: message, } w.WriteHeader(statusCode) json.NewEncoder(w).Encode(response) } type ShopBookResult struct { Success bool `json:"success"` Message string `json:"message"` Data struct { GoodsNum string `json:"goods_num"` Pnum string `json:"pnum"` Data []struct { BookName string `json:"book_name"` Author string `json:"author"` Publisher string `json:"publisher"` ISBN string `json:"isbn"` PublishTime int64 `json:"publication_time"` Edition string `json:"edition"` PrintTime string `json:"print_time"` FixPrice string `json:"fix_price"` BindingLayout string `json:"binding_layout"` Format string `json:"format"` Paper string `json:"paper"` Pages string `json:"pages"` Wordage string `json:"wordage"` Languages string `json:"languages"` Era string `json:"era"` EngravingMethod string `json:"engraving_method"` Dimensions string `json:"dimensions"` VolumeNumber string `json:"volume_number"` BookPic string `json:"book_pic"` BookPicS string `json:"book_pic_s"` SellingPrice string `json:"selling_price"` Condition string `json:"condition"` ExpressDeliveryFee string `json:"express_delivery_fee"` Editor string `json:"editor"` Category string `json:"category"` BuyCount string `json:"buy_count"` SellCount string `json:"sell_count"` Content string `json:"content"` Mid int `json:"mid"` ItemID int64 `json:"item_id"` ShopID int `json:"shop_id"` DetailURL string `json:"detail_url"` } `json:"data"` } `json:"data"` }