23 KiB
针对kongfz.dll文件使用教程
1.需要先创建dll工具实例
1. 加载DLL,用于调用dll文件,代码示例:
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.初始化配置信息,代码示例:
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"`
}
直接调用接口,代码示例:入参、返回参数都在下面
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 | 字数 |
响应示例
{
"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 | 字数 |
响应示例
{
"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 |
响应示例
{
"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 |
响应示例
{
"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
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函数方法
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