# 针对kongfz.dll文件使用教程 ## 1.需要先创建dll工具实例 ### 1. 加载DLL,用于调用dll文件,代码示例: ```go func main(){ // 加载DLL manager, err := NewDLLManager("main.dll") if err != nil { log.Fatalf("初始化DLL管理器失败: %v", err) } // 确保字段被释放,但是需要注意,如果加这个,可能把你的dll文件释放掉了,导致程序崩溃 defer manager.Close() } 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) 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(proxyType, username, password, machineCode, shopId, isImage, bookNum, pageNum, sortType, sort, priceDown, priceUp string) (string, error) { return m.callFunctionTwelveArgs("GetKFZShopBookInfo", proxyType, username, password, machineCode, shopId, isImage, bookNum, pageNum, sortType, sort, priceDown, priceUp) } ``` ### 2.初始化配置信息,代码示例: ````go func main(){ // 使用默认配置初始化 config := createDefaultConfig() configJSON, err := json.Marshal(config) if err != nil { log.Fatalf("序列化配置失败: %v", err) } result, err := manager.Initialize(string(configJSON)) if err != nil { log.Fatalf("初始化失败: %v", err) } var initResp APIResponses if err := json.Unmarshal([]byte(result), &initResp); err != nil { log.Fatalf("解析初始化响应失败: %v", err) } if !initResp.Success { log.Fatalf("初始化失败: %s", initResp.Message) } } // 创建默认配置示例 func createDefaultConfig() Configs { var configs Configs // 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" return configs } // 配置结构 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"` } ```` ### 直接调用接口,代码示例:入参、返回参数都在下面 ```go func main() { // 调用方法示例 shopResult, err := manager.GetKFZShopBookInfo( proxyType, username, password, machineCode, shopId, isImage, bookNum, pageNum, sortType, sort, priceDown, priceUp, ) } ``` --- ## 接口详情 ### 1. 获取孔网官图 **请求信息** gtResult, err := manager.GetKFZGTImageURL(testCase.isbn) **请求参数** | 参数名 | 类型 | 必填 | 说明 | |------|--------|----|-----------| | proxyType | string | 是 | 代理类型(小象代理:CALF_ELEPHANT_PROXY,内置代理:TAIL_PROXY) | | username | string | 是 | 小象代理账号 | | password | string | 是 | 小象代理密码 | | machineCode | string | 是 | 内置代理机械码 | | isbn | string | 是 | 图书的 ISBN 号 | **响应数据** | 字段名 | 类型 | 说明 | 示例值 | |--------|------|------|---------| | `success` | boolean | 请求是否成功 | `true` | | `message` | string | 响应消息 | `"查询成功"` | | `data` | array | 图书信息列表 | - | **图书信息字段说明(data数据)** | 字段名 | 类型 | 说明 | |--------|------|------| | `author` | string | 作者 | | `binding_layout` | string | 装帧布局 | | `book_name` | string | 图书名称 | | `book_pic` | string | 图书图片(大图) | | `book_pic_s` | string | 图书图片(小图) | | `buyCount` | string | 购买数量 | | `category` | string | 分类 | | `condition` | string | 图书状况 | | `content` | string | 内容简介 | | `edition` | string | 版次 | | `editor` | string | 编者 | | `express_delivery_fee` | string | 快递费用 | | `fix_price` | string | 定价 | | `format` | string | 开本 | | `isbn` | string | ISBN号 | | `item_id` | number | 商品ID | | `languages` | string | 语言 | | `mid` | number | 商家ID | | `pages` | string | 页数 | | `paper` | string | 纸张 | | `print_time` | string | 印刷时间 | | `publication_time` | number | 出版时间(时间戳) | | `publisher` | string | 出版社 | | `sellCount` | string | 销售数量 | | `shop_id` | number | 店铺ID | | `wordage` | string | 字数 | **响应示例** ```json { "success": true, "message": "查询成功", "data": { "author": "", "binding_layout": "", "book_name": "", "book_pic": "", "book_pic_s": "", "buyCount": "", "category": "", "condition": "", "content": "", "edition": "", "editor": "", "express_delivery_fee": "", "fix_price": "", "format": "", "isbn": "", "item_id": 0, "languages": "", "mid": 0, "pages": "", "paper": "", "print_time": "", "publication_time": 0, "publisher": "", "sellCount": "", "shop_id": 0, "wordage": "" } } ``` ### 2. 获取孔网实拍图 **请求信息** sptResult, err := manager.GetKFZSPTImageURL(testCase.isbn) **请求参数** | 参数名 | 类型 | 必填 | 说明 | |------|--------|----|------------| | proxyType | string | 是 | 代理类型(小象代理:CALF_ELEPHANT_PROXY,内置代理:TAIL_PROXY) | | username | string | 是 | 小象代理账号 | | password | string | 是 | 小象代理密码 | | machineCode | string | 是 | 内置代理机械码 | | isbn | string | 是 | 图书的 ISBN 号 | **响应数据** | 字段名 | 类型 | 说明 | 示例值 | |--------|------|------|---------| | `success` | boolean | 请求是否成功 | `true` | | `message` | string | 响应消息 | `"查询成功"` | | `data` | array | 图书信息列表 | - | **图书信息字段说明(data数据)** | 字段名 | 类型 | 说明 | |--------|------|------| | `author` | string | 作者 | | `binding_layout` | string | 装帧布局 | | `book_name` | string | 图书名称 | | `book_pic` | string | 图书图片(大图) | | `book_pic_s` | string | 图书图片(小图) | | `buyCount` | string | 购买数量 | | `category` | string | 分类 | | `condition` | string | 图书状况 | | `content` | string | 内容简介 | | `edition` | string | 版次 | | `editor` | string | 编者 | | `express_delivery_fee` | string | 快递费用 | | `fix_price` | string | 定价 | | `format` | string | 开本 | | `isbn` | string | ISBN号 | | `item_id` | number | 商品ID | | `languages` | string | 语言 | | `mid` | number | 商家ID | | `pages` | string | 页数 | | `paper` | string | 纸张 | | `print_time` | string | 印刷时间 | | `publication_time` | number | 出版时间(时间戳) | | `publisher` | string | 出版社 | | `sellCount` | string | 销售数量 | | `shop_id` | number | 店铺ID | | `wordage` | string | 字数 | **响应示例** ```json { "success": true, "message": "查询成功", "data": { "author": "", "binding_layout": "", "book_name": "", "book_pic": "", "book_pic_s": "https://www0.kfzimg.com/sw/kfz-cos/kfzimg/adaaecbf/a1e5df0a21cfdbba_s.jpg", "buyCount": "", "category": "", "condition": "", "content": "", "edition": "", "editor": "", "express_delivery_fee": "", "fix_price": "", "format": "", "isbn": "", "item_id": 0, "languages": "", "mid": 0, "pages": "", "paper": "", "print_time": "", "publication_time": 0, "publisher": "", "sellCount": "", "shop_id": 0, "wordage": "" } } ``` ### 3. 获取店铺图书信息 **请求信息** shopResult, err := manager.GetKFZShopBookInfo( proxyType, //代理类型 username, //小象代理账号 password, //小象代理密码 machineCode, //内置代理机械码 shopId, isImage, bookNum, pageNum, sortType, sort, priceDown, priceUp, ) **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|--------|----|------------------------------------------------| | fetchMode | string | 是 | 是否使用代理 (使用代理:proxy 不使用代理:direct) | | proxyType | string | 是 | 代理类型(小象代理:CALF_ELEPHANT_PROXY,内置代理:TAIL_PROXY) | | username | string | 是 | 小象代理账号 | | password | string | 是 | 小象代理密码 | | machineCode | string | 是 | 内置代理机械码 | | shopId | string | 是 | 店铺编号 | | isImage | string | 否 | 是否有图片 | | bookNum | string | 否 | 图书数量 | | pageNum | string | 否 | 页数 | | sortType | string | 否 | 排序类型(sort,putDate,newItem,price只有这四种) | | sort | string | 否 | 排序方式(asc,desc) | | priceUp | string | 否 | 最低价格 | | priceDown | string | 否 | 最高价格 | **响应数据** | 字段名 | 类型 | 说明 | 示例值 | |--------|------|--------|---------| | `success` | boolean | 请求是否成功 | `true` | | `message` | string | 响应消息 | `"查询成功"` | | `goods_num` | string | 商品数量 | `"查询成功"` | | `pnum` | string | 店铺商品页数 | `"查询成功"` | | `data` | array | 图书信息列表 | - | **图书信息字段说明(data数据)** | 字段名 | 类型 | 说明 | |--------|------|--------| | `book_name` | string | 书名 | | `author` | string | 作者 | | `publisher` | string | 出版社 | | `isbn` | string | ISBN号 | | `publication_time` | number | 出版时间(时间戳) | | `edition` | string | 版次 | | `print_time` | string | 印刷时间 | | `fix_price` | string | 定价 | | `binding_layout` | string | 装帧 | | `format` | string | 开本 | | `paper` | string | 纸张 | | `pages` | string | 页数 | | `wordage` | string | 字数 | | `languages` | string | 语种 | | `era` | string | 年代 | | `engraving_method` | string | 刻印方式 | | `dimensions` | string | 尺寸 | | `volume_number` | string | 册数 | | `book_pic` | string | 图书图片(官图) | | `book_pic_s` | string | 图书图片(实拍图) | | `selling_price` | string | 售价 | | `condition` | string | 品相 | | `express_delivery_fee` | string | 快递费 | | `editor` | string | 编辑 | | `category` | string | 分类 | | `buy_count` | string | 买过 | | `sell_count` | string | 买过 | | `content` | string | 内容 | | `mid` | number | 商家ID | | `item_id` | number | 商品ID | | `shop_id` | number | 店铺ID | **响应示例** ```json { "success": true, "message": "查询成功", "goods_num": "", "pnum": "", "data": [ { "author": "", "binding_layout": "", "book_name": "", "book_pic": "", "book_pic_s": "https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cddbcbda/6833c1d27437d121_s.jpg", "buyCount": "", "category": "", "condition": "", "content": "", "edition": "", "editor": "", "express_delivery_fee": "", "fix_price": "", "format": "", "isbn": "", "item_id": 0, "languages": "", "mid": 0, "pages": "", "paper": "", "print_time": "", "publication_time": 0, "publisher": "", "sellCount": "", "shop_id": 0, "wordage": "" } ] } ``` ### 4. 根据url获取单个图书详情信息 **请求信息** shopResult, err := manager.GetUrlBookDetails( fetchMode, proxyType, username, password, machineCode, url ) **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|--------|----|------------------------------------------------| | fetchMode | string | 是 | 是否使用代理 (使用代理:proxy 不使用代理:direct) | | proxyType | string | 是 | 代理类型(小象代理:CALF_ELEPHANT_PROXY,内置代理:TAIL_PROXY) | | username | string | 是 | 小象代理账号 | | password | string | 是 | 小象代理密码 | | machineCode | string | 是 | 内置代理机械码 | | url | string | 是 | 传入详情页的url | **响应数据** | 字段名 | 类型 | 说明 | 示例值 | |--------|------|--------|---------| | `success` | boolean | 请求是否成功 | `true` | | `message` | string | 响应消息 | `"查询成功"` | | `goods_num` | string | 商品数量 | `"查询成功"` | | `pnum` | string | 店铺商品页数 | `"查询成功"` | | `data` | array | 图书信息列表 | - | **图书信息字段说明(data数据)** | 字段名 | 类型 | 说明 | |--------|------|--------| | `book_name` | string | 书名 | | `author` | string | 作者 | | `publisher` | string | 出版社 | | `isbn` | string | ISBN号 | | `publication_time` | number | 出版时间(时间戳) | | `edition` | string | 版次 | | `print_time` | string | 印刷时间 | | `fix_price` | string | 定价 | | `binding_layout` | string | 装帧 | | `format` | string | 开本 | | `paper` | string | 纸张 | | `pages` | string | 页数 | | `wordage` | string | 字数 | | `languages` | string | 语种 | | `era` | string | 年代 | | `engraving_method` | string | 刻印方式 | | `dimensions` | string | 尺寸 | | `volume_number` | string | 册数 | | `book_pic` | string | 图书图片(官图) | | `book_pic_s` | string | 图书图片(实拍图) | | `selling_price` | string | 售价 | | `condition` | string | 品相 | | `express_delivery_fee` | string | 快递费 | | `editor` | string | 编辑 | | `category` | string | 分类 | | `buy_count` | string | 买过 | | `sell_count` | string | 买过 | | `content` | string | 内容 | | `mid` | number | 商家ID | | `item_id` | number | 商品ID | | `shop_id` | number | 店铺ID | **响应示例** ```json { "success": true, "message": "查询成功", "goods_num": "", "pnum": "", "data": [ { "author": "", "binding_layout": "", "book_name": "", "book_pic": "", "book_pic_s": "https://www0.kfzimg.com/sw/kfz-cos/kfzimg/cddbcbda/6833c1d27437d121_s.jpg", "buyCount": "", "category": "", "condition": "", "content": "", "edition": "", "editor": "", "express_delivery_fee": "", "fix_price": "", "format": "", "isbn": "", "item_id": 0, "languages": "", "mid": 0, "pages": "", "paper": "", "print_time": "", "publication_time": 0, "publisher": "", "sellCount": "", "shop_id": 0, "wordage": "" } ] } ``` ### 5. 初始化 **请求信息** manager.Initialize( configJSON, ) **请求参数** | 参数名 | 类型 | 必填 | 说明 | |--------|--------|----|------| | configJSON | string | 是 | 配置信息 | **响应数据** | 字段名 | 类型 | 说明 | 示例值 | |--------|------|--------|---------| | `success` | boolean | 请求是否成功 | `true` | | `message` | string | 响应消息 | `"查询成功"` | **图书信息字段说明(data数据)** | 字段名 | 类型 | 说明 | |--------|------|--------| | `book_name` | string | 书名 | | `author` | string | 作者 | | `publisher` | string | 出版社 | | `isbn` | string | ISBN号 | | `publication_time` | number | 出版时间(时间戳) | | `edition` | string | 版次 | | `print_time` | string | 印刷时间 | | `fix_price` | string | 定价 | | `binding_layout` | string | 装帧 | | `format` | string | 开本 | | `paper` | string | 纸张 | | `pages` | string | 页数 | | `wordage` | string | 字数 | | `languages` | string | 语种 | | `era` | string | 年代 | | `engraving_method` | string | 刻印方式 | | `dimensions` | string | 尺寸 | | `volume_number` | string | 册数 | | `book_pic` | string | 图书图片(官图) | | `book_pic_s` | string | 图书图片(实拍图) | | `selling_price` | string | 售价 | | `condition` | string | 品相 | | `express_delivery_fee` | string | 快递费 | | `editor` | string | 编辑 | | `category` | string | 分类 | | `buy_count` | string | 买过 | | `sell_count` | string | 买过 | | `content` | string | 内容 | | `mid` | number | 商家ID | | `item_id` | number | 商品ID | | `shop_id` | number | 店铺ID | # proxyConfig.dll文件使用讲解 由于是kongfz.dll文件去调用proxyConfig.dll文件里面的函数,无需再去调用。 除非直接使用proxyConfig.dll文件。 ## 1.直接使用proxyConfig.dll文件,应先加载DLL ```go func main(){ // 加载DLL manager, err := NewDLLManager("文件路径") if err != nil { log.Fatalf("初始化DLL管理器失败: %v", err) } // 确保字段被释放,但是需要注意,如果加这个,可能把你的dll文件释放掉了,导致程序崩溃 defer manager.Close() } 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() } } // ProxyTypeManager 调用代理类型管理器 func (m *ProxyConfigManager) 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("FreeCString") if freeProc != nil { freeProc.Call(r1) } return string(resultBytes), nil } ``` ## 直接调用ProxyTypeManager函数方法 ```go typeManager, err := globalProxyManager.ProxyTypeManager( proxyType, username, password, machineCode, ) ``` **请求信息** typeManager, err := globalProxyManager.ProxyTypeManager( proxyType, username, password, machineCode, ) **请求参数** | 参数名 | 类型 | 必填 | 说明 | |------|--------|----|------------| | proxyType | string | 是 | 代理类型(小象代理:CALF_ELEPHANT_PROXY,内置代理:TAIL_PROXY) | | username | string | 是 | 小象代理账号 | | password | string | 是 | 小象代理密码 | | machineCode | string | 是 | 内置代理机械码 | **响应信息** string字符串: http://18434270290:JWt15lWW@111.179.77.244:44751