# 针对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