{
  "openapi": "3.0.3",
  "info": {
    "title": "wrouter API",
    "version": "0.1.0",
    "description": "本地阅读服务聚合 API。\n\nSwagger UI 只允许 GET 在线执行；POST 操作完整展示，但需要在其他客户端中明确调用。\n\n规范中不包含本地账号、Token、Cookie、日志内容或文件路径示例。"
  },
  "servers": [
    {
      "url": "/",
      "description": "当前 wrouter 实例"
    }
  ],
  "tags": [
    {
      "name": "Router",
      "description": "聚合路由、状态、统计与服务管理。"
    },
    {
      "name": "HBooker",
      "description": "HBooker / 刺猬猫搜索、详情、目录与正文。"
    },
    {
      "name": "Fanqie",
      "description": "番茄小说官方搜索适配器，无需账号或 Cookie。"
    },
    {
      "name": "Qidian",
      "description": "运行于当前 wrouter 进程的起点搜索、书籍详情与章节解密服务。"
    },
    {
      "name": "Dudaoyue",
      "description": "独阅读加密 App 协议适配器，支持默认游客注册和请求级账号覆盖。"
    }
  ],
  "paths": {
    "/_router": {
      "get": {
        "tags": [
          "Router"
        ],
        "operationId": "getRouterIndex",
        "summary": "获取路由总览",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouterIndexResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/_router/health": {
      "get": {
        "tags": [
          "Router"
        ],
        "operationId": "getRouterHealth",
        "summary": "检查全部服务健康状态",
        "description": "返回所有注册服务的运行状态、健康探测结果和请求摘要。",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouterHealthResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/_router/stats": {
      "get": {
        "tags": [
          "Router"
        ],
        "operationId": "getRouterStats",
        "summary": "获取请求统计",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouterStatsResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/_router/services": {
      "get": {
        "tags": [
          "Router"
        ],
        "operationId": "listRouterServices",
        "summary": "列出全部服务",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouterServicesResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/_router/services/{id}": {
      "get": {
        "tags": [
          "Router"
        ],
        "operationId": "getRouterService",
        "summary": "获取单个服务",
        "parameters": [
          {
            "$ref": "#/components/parameters/ServiceId"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceActionResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/_router/services/{id}/logs": {
      "get": {
        "tags": [
          "Router"
        ],
        "operationId": "getRouterServiceLogs",
        "summary": "获取服务日志",
        "description": "日志可能包含运行信息。不要将响应公开到不受信任的网络。",
        "parameters": [
          {
            "$ref": "#/components/parameters/ServiceId"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouterLogsResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/_router/services/start-all": {
      "post": {
        "tags": [
          "Router"
        ],
        "operationId": "startAllRouterServices",
        "summary": "启动全部服务",
        "description": "危险操作。Swagger UI 仅展示，不开放在线执行。",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkStartResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-dangerous": true
      }
    },
    "/_router/services/stop-all": {
      "post": {
        "tags": [
          "Router"
        ],
        "operationId": "stopAllRouterServices",
        "summary": "停止全部服务",
        "description": "危险操作。Swagger UI 仅展示，不开放在线执行。",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkStopResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-dangerous": true
      }
    },
    "/_router/services/{id}/start": {
      "post": {
        "tags": [
          "Router"
        ],
        "operationId": "startRouterService",
        "summary": "启动服务",
        "description": "危险操作。Swagger UI 仅展示，不开放在线执行。",
        "parameters": [
          {
            "$ref": "#/components/parameters/ServiceId"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceActionResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-dangerous": true
      }
    },
    "/_router/services/{id}/stop": {
      "post": {
        "tags": [
          "Router"
        ],
        "operationId": "stopRouterService",
        "summary": "停止服务",
        "description": "危险操作。Swagger UI 仅展示，不开放在线执行。",
        "parameters": [
          {
            "$ref": "#/components/parameters/ServiceId"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceActionResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-dangerous": true
      }
    },
    "/_router/services/{id}/restart": {
      "post": {
        "tags": [
          "Router"
        ],
        "operationId": "restartRouterService",
        "summary": "重启服务",
        "description": "危险操作。Swagger UI 仅展示，不开放在线执行。",
        "parameters": [
          {
            "$ref": "#/components/parameters/ServiceId"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceActionResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-dangerous": true
      }
    },
    "/hbooker/health": {
      "get": {
        "tags": [
          "HBooker"
        ],
        "operationId": "getHbookerHealth",
        "summary": "检查 HBooker 配置与运行状态",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerHealthResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/hbooker/login/guest": {
      "post": {
        "tags": [
          "HBooker"
        ],
        "operationId": "registerHbookerGuest",
        "summary": "注册或刷新游客账号",
        "description": "会访问上游并可写入本地 HBooker 配置。Swagger UI 仅展示，不开放在线执行。",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HbookerGuestInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerGuestResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-dangerous": true
      }
    },
    "/hbooker/auth/check": {
      "post": {
        "tags": [
          "HBooker"
        ],
        "operationId": "checkHbookerAuth",
        "summary": "校验临时账号",
        "description": "凭据只用于当前请求，不写入本地配置。Swagger UI 仅展示，不开放在线执行。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HbookerAuthInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/HbookerAuthInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerAuthCheckResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/hbooker/search": {
      "get": {
        "tags": [
          "HBooker"
        ],
        "operationId": "searchHbookerBooks",
        "summary": "搜索书籍",
        "description": "使用本地 HBooker 配置搜索书籍。临时凭据请改用 POST。",
        "parameters": [
          {
            "$ref": "#/components/parameters/Keyword"
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/Count"
          },
          {
            "$ref": "#/components/parameters/Detail"
          },
          {
            "$ref": "#/components/parameters/Raw"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "HBooker"
        ],
        "operationId": "searchHbookerBooksWithBody",
        "summary": "使用请求体搜索书籍",
        "description": "支持临时账号、分页、详情展开和原始响应选项。 Swagger UI 仅展示该操作，不开放在线执行。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HbookerSearchInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/HbookerSearchInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/hbooker/detail": {
      "get": {
        "tags": [
          "HBooker"
        ],
        "operationId": "getHbookerBookDetail",
        "summary": "获取书籍详情",
        "description": "使用本地 HBooker 配置获取详情。临时凭据请改用 POST。",
        "parameters": [
          {
            "$ref": "#/components/parameters/BookId"
          },
          {
            "$ref": "#/components/parameters/Raw"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerDetailResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "HBooker"
        ],
        "operationId": "getHbookerBookDetailWithBody",
        "summary": "使用请求体获取书籍详情",
        "description": "支持临时账号和原始响应选项。 Swagger UI 仅展示该操作，不开放在线执行。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HbookerBookInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/HbookerBookInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerDetailResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/hbooker/catalog": {
      "get": {
        "tags": [
          "HBooker"
        ],
        "operationId": "getHbookerCatalog",
        "summary": "获取章节目录",
        "description": "使用本地 HBooker 配置获取目录。临时凭据请改用 POST。",
        "parameters": [
          {
            "$ref": "#/components/parameters/BookId"
          },
          {
            "$ref": "#/components/parameters/Raw"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerCatalogResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "HBooker"
        ],
        "operationId": "getHbookerCatalogWithBody",
        "summary": "使用请求体获取章节目录",
        "description": "支持临时账号和原始响应选项。 Swagger UI 仅展示该操作，不开放在线执行。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HbookerBookInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/HbookerBookInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerCatalogResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/hbooker/content": {
      "get": {
        "tags": [
          "HBooker"
        ],
        "operationId": "getHbookerChapterContent",
        "summary": "获取章节正文",
        "description": "使用本地 HBooker 配置获取正文。付费且未购买的章节返回 403。临时凭据请改用 POST。",
        "parameters": [
          {
            "$ref": "#/components/parameters/ChapterId"
          },
          {
            "$ref": "#/components/parameters/Raw"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerContentResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "HBooker"
        ],
        "operationId": "getHbookerChapterContentWithBody",
        "summary": "使用请求体获取章节正文",
        "description": "支持临时账号和原始响应选项。付费且未购买的章节返回 403。 Swagger UI 仅展示该操作，不开放在线执行。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HbookerChapterInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/HbookerChapterInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerContentResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/hbooker/raw": {
      "post": {
        "tags": [
          "HBooker"
        ],
        "operationId": "proxyRawHbookerRequest",
        "summary": "发送原始 HBooker 请求",
        "description": "高风险接口。可调用配置域名下的 HBooker 上游路径。Swagger UI 仅展示，不开放在线执行。",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HbookerRawInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/HbookerRawInput"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string",
                "description": "抓包文本或原始表单正文。"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HbookerRawResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "x-dangerous": true
      }
    },
    "/fanqie/health": {
      "get": {
        "tags": [
          "Fanqie"
        ],
        "operationId": "getFanqieHealth",
        "summary": "检查番茄适配器状态",
        "description": "轻量本地检查，不请求番茄上游。签名器会在首次搜索时惰性初始化。",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FanqieHealthResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/fanqie/search": {
      "get": {
        "tags": [
          "Fanqie"
        ],
        "operationId": "searchFanqieBooks",
        "summary": "搜索番茄小说",
        "description": "无需账号或 Cookie。页码从 1 开始，每页最多返回 10 条结果。",
        "parameters": [
          {
            "$ref": "#/components/parameters/Keyword"
          },
          {
            "$ref": "#/components/parameters/FanqiePage"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FanqieSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/qidian/v2/health": {
      "get": {
        "tags": [
          "Qidian"
        ],
        "operationId": "getQidianHealth",
        "summary": "检查起点服务",
        "description": "轻量本地检查。起点作为 builtin 运行在当前 wrouter 进程，并报告章节与 App 搜索/详情能力。",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QidianHealthResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/qidian/v2/chapter/content": {
      "get": {
        "tags": [
          "Qidian"
        ],
        "operationId": "getQidianChapterContent",
        "summary": "获取并解密起点章节",
        "description": "传入章节 URL，或同时传入 bookId 与 chapterId。显式解密密钥和 Cookie 应通过本地配置提供，不应放入 URL。",
        "parameters": [
          {
            "$ref": "#/components/parameters/QidianUrl"
          },
          {
            "$ref": "#/components/parameters/QidianBookId"
          },
          {
            "$ref": "#/components/parameters/QidianChapterId"
          },
          {
            "$ref": "#/components/parameters/QidianFormat"
          },
          {
            "$ref": "#/components/parameters/QidianEnvelope"
          },
          {
            "$ref": "#/components/parameters/QidianRaw"
          },
          {
            "$ref": "#/components/parameters/QidianDebug"
          },
          {
            "$ref": "#/components/parameters/QidianTimeout"
          }
        ],
        "responses": {
          "200": {
            "description": "章节数据或纯文本正文",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QidianChapterResponse"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/qidian/v2/search": {
      "get": {
        "tags": [
          "Qidian"
        ],
        "operationId": "searchQidianBooks",
        "summary": "搜索起点书籍",
        "description": "使用本地 QDInfo 调用起点只读 App 接口，返回分页后的精简书籍模型。",
        "parameters": [
          {
            "$ref": "#/components/parameters/QidianKeyword"
          },
          {
            "$ref": "#/components/parameters/QidianPage"
          },
          {
            "$ref": "#/components/parameters/QidianPageSize"
          },
          {
            "$ref": "#/components/parameters/QidianTimeout"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QidianSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "起点 App 身份尚未配置",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "起点 App 上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/qidian/v2/detail": {
      "get": {
        "tags": [
          "Qidian"
        ],
        "operationId": "getQidianBookDetail",
        "summary": "获取起点书籍详情",
        "description": "使用本地 QDInfo 调用起点只读 App 接口，返回书籍、作者、票数与最新章节。",
        "parameters": [
          {
            "$ref": "#/components/parameters/QidianDetailBookId"
          },
          {
            "$ref": "#/components/parameters/QidianTimeout"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QidianDetailResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "起点 App 身份尚未配置",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "起点 App 上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/dudaoyue/health": {
      "get": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "getDudaoyueHealth",
        "summary": "检查独阅读配置与游客状态",
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueHealthResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/dudaoyue/login/guest": {
      "get": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "registerDudaoyueGuestByGet",
        "summary": "注册并保存独阅读游客账号",
        "description": "请求级 account+token 只作用于当前请求；不传凭据时按环境变量、本地配置、自动游客注册顺序解析。",
        "parameters": [
          {
            "$ref": "#/components/parameters/DudaoyueSave"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueAuthResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "registerDudaoyueGuest",
        "summary": "注册独阅读游客账号",
        "description": "支持 JSON 或表单传参。请求级凭据必须同时提供 account 与 token/login_token，缺一会返回 400。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueAuthResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/dudaoyue/auth/check": {
      "get": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "checkDudaoyueAuthByGet",
        "summary": "校验独阅读账号",
        "description": "请求级 account+token 只作用于当前请求；不传凭据时按环境变量、本地配置、自动游客注册顺序解析。",
        "parameters": [],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueAuthCheckResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "checkDudaoyueAuth",
        "summary": "校验请求体中的独阅读账号",
        "description": "支持 JSON 或表单传参。请求级凭据必须同时提供 account 与 token/login_token，缺一会返回 400。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueAuthCheckResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/dudaoyue/search": {
      "get": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "searchDudaoyueBooks",
        "summary": "搜索独阅读书籍",
        "description": "请求级 account+token 只作用于当前请求；不传凭据时按环境变量、本地配置、自动游客注册顺序解析。",
        "parameters": [
          {
            "$ref": "#/components/parameters/DudaoyueKeyword"
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/Count"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "searchDudaoyueBooksWithBody",
        "summary": "使用请求体搜索独阅读书籍",
        "description": "支持 JSON 或表单传参。请求级凭据必须同时提供 account 与 token/login_token，缺一会返回 400。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/dudaoyue/detail": {
      "get": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "getDudaoyueDetail",
        "summary": "获取独阅读书籍详情",
        "description": "请求级 account+token 只作用于当前请求；不传凭据时按环境变量、本地配置、自动游客注册顺序解析。",
        "parameters": [
          {
            "$ref": "#/components/parameters/BookId"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueDetailResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "getDudaoyueDetailWithBody",
        "summary": "使用请求体获取独阅读书籍详情",
        "description": "支持 JSON 或表单传参。请求级凭据必须同时提供 account 与 token/login_token，缺一会返回 400。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueDetailResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/dudaoyue/catalog": {
      "get": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "getDudaoyueCatalog",
        "summary": "获取独阅读目录",
        "description": "请求级 account+token 只作用于当前请求；不传凭据时按环境变量、本地配置、自动游客注册顺序解析。",
        "parameters": [
          {
            "$ref": "#/components/parameters/BookId"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueCatalogResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "getDudaoyueCatalogWithBody",
        "summary": "使用请求体获取独阅读目录",
        "description": "支持 JSON 或表单传参。请求级凭据必须同时提供 account 与 token/login_token，缺一会返回 400。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueCatalogResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/dudaoyue/content": {
      "get": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "getDudaoyueContent",
        "summary": "获取独阅读章节正文",
        "description": "请求级 account+token 只作用于当前请求；不传凭据时按环境变量、本地配置、自动游客注册顺序解析。",
        "parameters": [
          {
            "$ref": "#/components/parameters/ChapterId"
          },
          {
            "$ref": "#/components/parameters/DudaoyueFormat"
          }
        ],
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueContentResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dudaoyue"
        ],
        "operationId": "getDudaoyueContentWithBody",
        "summary": "使用请求体获取独阅读章节正文",
        "description": "支持 JSON 或表单传参。请求级凭据必须同时提供 account 与 token/login_token，缺一会返回 400。",
        "requestBody": {
          "required": true,
          "description": "支持 JSON 或表单格式。",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DudaoyueInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "请求成功",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DudaoyueContentResponse"
                }
              }
            }
          },
          "400": {
            "description": "请求参数无效",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "资源不可访问",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "接口或服务不存在",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "请求进入风控冷却",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "内部错误",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "上游服务或代理失败",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "服务暂不可用",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "504": {
            "description": "独阅读上游请求超时",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "ServiceId": {
        "name": "id",
        "in": "path",
        "required": true,
        "description": "服务 ID。",
        "schema": {
          "type": "string",
          "example": "qidian"
        }
      },
      "Keyword": {
        "name": "keyword",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string",
          "minLength": 1
        }
      },
      "Page": {
        "name": "page",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 0,
          "default": 0
        }
      },
      "FanqiePage": {
        "name": "page",
        "in": "query",
        "description": "番茄搜索页码，从 1 开始。",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 1
        }
      },
      "Count": {
        "name": "count",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50
        }
      },
      "Detail": {
        "name": "detail",
        "in": "query",
        "description": "是否同时抓取书籍详情。",
        "schema": {
          "type": "boolean",
          "default": false
        }
      },
      "Raw": {
        "name": "raw",
        "in": "query",
        "description": "是否包含原始上游响应。",
        "schema": {
          "type": "boolean",
          "default": false
        }
      },
      "BookId": {
        "name": "bookId",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "ChapterId": {
        "name": "chapterId",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "QidianUrl": {
        "name": "url",
        "in": "query",
        "description": "完整起点章节 URL。与 bookId + chapterId 二选一。",
        "schema": {
          "type": "string",
          "format": "uri"
        }
      },
      "QidianBookId": {
        "name": "bookId",
        "in": "query",
        "description": "起点书籍 ID。需要和 chapterId 一起提供。",
        "schema": {
          "type": "string"
        }
      },
      "QidianChapterId": {
        "name": "chapterId",
        "in": "query",
        "description": "起点章节 ID。需要和 bookId 一起提供。",
        "schema": {
          "type": "string"
        }
      },
      "QidianFormat": {
        "name": "format",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "json",
            "text"
          ],
          "default": "json"
        }
      },
      "QidianEnvelope": {
        "name": "envelope",
        "in": "query",
        "description": "设为 1 时返回解密诊断 envelope。",
        "schema": {
          "type": "string",
          "enum": [
            "0",
            "1"
          ],
          "default": "0"
        }
      },
      "QidianRaw": {
        "name": "raw",
        "in": "query",
        "description": "仅在 envelope=1 时生效。",
        "schema": {
          "type": "string",
          "enum": [
            "0",
            "1"
          ],
          "default": "0"
        }
      },
      "QidianDebug": {
        "name": "debug",
        "in": "query",
        "description": "设为 1 时附带解密尝试和错误详情。",
        "schema": {
          "type": "string",
          "enum": [
            "0",
            "1"
          ],
          "default": "0"
        }
      },
      "QidianTimeout": {
        "name": "timeoutMs",
        "in": "query",
        "schema": {
          "type": "integer",
          "default": 15000,
          "minimum": 1000,
          "maximum": 30000
        }
      },
      "QidianKeyword": {
        "name": "keyword",
        "in": "query",
        "required": true,
        "description": "起点书名或作者关键词。",
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        }
      },
      "QidianPage": {
        "name": "page",
        "in": "query",
        "description": "搜索页码，从 1 开始。",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 1
        }
      },
      "QidianPageSize": {
        "name": "pageSize",
        "in": "query",
        "description": "每页返回书籍数量。",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 20,
          "default": 20
        }
      },
      "QidianDetailBookId": {
        "name": "bookId",
        "in": "query",
        "required": true,
        "description": "1–20 位正整数起点书籍 ID。",
        "schema": {
          "type": "string",
          "pattern": "^[1-9]\\d{0,19}$"
        }
      },
      "DudaoyueKeyword": {
        "name": "keyword",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        }
      },
      "DudaoyueSave": {
        "name": "save",
        "in": "query",
        "description": "默认为 true；false 时只返回本次游客注册结果，不写入本地配置。",
        "schema": {
          "type": "boolean",
          "default": true
        }
      },
      "DudaoyueFormat": {
        "name": "format",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "json",
            "text"
          ],
          "default": "json"
        }
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "details": {
                "nullable": true
              }
            },
            "additionalProperties": true
          }
        }
      },
      "HealthProbe": {
        "type": "object",
        "properties": {
          "healthy": {
            "type": "boolean"
          },
          "statusCode": {
            "type": "integer",
            "nullable": true
          },
          "durationMs": {
            "type": "integer",
            "minimum": 0
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": true
      },
      "ServiceStatus": {
        "type": "object",
        "required": [
          "id",
          "name",
          "type",
          "routePrefix",
          "target",
          "status"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "builtin",
              "proxy"
            ]
          },
          "routePrefix": {
            "type": "string"
          },
          "stripPrefix": {
            "type": "boolean"
          },
          "target": {
            "type": "string"
          },
          "healthPath": {
            "type": "string"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "autoStart": {
            "type": "boolean"
          },
          "startOnRequest": {
            "type": "boolean"
          },
          "status": {
            "type": "string"
          },
          "pid": {
            "type": "integer",
            "nullable": true
          },
          "startedByRouter": {
            "type": "boolean"
          },
          "lastStartedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastStoppedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastError": {
            "type": "string",
            "nullable": true
          },
          "health": {
            "$ref": "#/components/schemas/HealthProbe",
            "nullable": true
          }
        },
        "additionalProperties": true
      },
      "TopEndpoint": {
        "type": "object",
        "properties": {
          "serviceId": {
            "type": "string"
          },
          "method": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "requests": {
            "type": "integer",
            "minimum": 0
          },
          "uniqueIps": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "StatsSnapshot": {
        "type": "object",
        "properties": {
          "startedAt": {
            "type": "string",
            "format": "date-time"
          },
          "uptimeSeconds": {
            "type": "integer",
            "minimum": 0
          },
          "totalRequests": {
            "type": "integer",
            "minimum": 0
          },
          "serviceRequests": {
            "type": "integer",
            "minimum": 0
          },
          "uniqueIps": {
            "type": "integer",
            "minimum": 0
          },
          "todayRequests": {
            "type": "integer",
            "minimum": 0
          },
          "recentMinuteRequests": {
            "type": "integer",
            "minimum": 0
          },
          "recentFiveMinuteRequests": {
            "type": "integer",
            "minimum": 0
          },
          "methods": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "services": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            }
          },
          "topEndpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TopEndpoint"
            }
          },
          "storage": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "RouterIndexResponse": {
        "type": "object",
        "required": [
          "ok",
          "name",
          "routes",
          "api"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "name": {
            "type": "string",
            "enum": [
              "wrouter"
            ]
          },
          "routes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceStatus"
            }
          },
          "stats": {
            "$ref": "#/components/schemas/StatsSnapshot"
          },
          "api": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "RouterHealthResponse": {
        "type": "object",
        "required": [
          "ok",
          "services",
          "stats"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceStatus"
            }
          },
          "stats": {
            "$ref": "#/components/schemas/StatsSnapshot"
          }
        }
      },
      "RouterStatsResponse": {
        "type": "object",
        "required": [
          "ok",
          "stats"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/StatsSnapshot"
          }
        }
      },
      "RouterServicesResponse": {
        "type": "object",
        "required": [
          "ok",
          "services",
          "stats"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceStatus"
            }
          },
          "stats": {
            "$ref": "#/components/schemas/StatsSnapshot"
          }
        }
      },
      "ServiceActionResponse": {
        "type": "object",
        "required": [
          "ok",
          "service"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "service": {
            "$ref": "#/components/schemas/ServiceStatus"
          }
        }
      },
      "RouterLogsResponse": {
        "type": "object",
        "required": [
          "ok",
          "logs"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "logs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "stream": {
                  "type": "string"
                },
                "line": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          }
        }
      },
      "BulkStartResponse": {
        "type": "object",
        "required": [
          "ok",
          "results"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        }
      },
      "BulkStopResponse": {
        "type": "object",
        "required": [
          "ok",
          "services"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceStatus"
            }
          }
        }
      },
      "HbookerAuthFields": {
        "type": "object",
        "properties": {
          "account": {
            "type": "string",
            "description": "临时 HBooker 账号。"
          },
          "token": {
            "type": "string",
            "format": "password",
            "writeOnly": true
          },
          "ua": {
            "type": "string",
            "description": "完整 Android User-Agent。"
          },
          "appVersion": {
            "type": "string"
          },
          "deviceToken": {
            "type": "string"
          },
          "authCheck": {
            "type": "boolean",
            "default": true
          },
          "reloadConfig": {
            "type": "boolean",
            "default": false
          },
          "raw": {
            "type": "boolean",
            "default": false
          },
          "upload": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "HbookerAuthInput": {
        "allOf": [
          {
            "$ref": "#/components/schemas/HbookerAuthFields"
          },
          {
            "type": "object",
            "required": [
              "account",
              "token",
              "ua"
            ]
          }
        ]
      },
      "HbookerSearchInput": {
        "allOf": [
          {
            "$ref": "#/components/schemas/HbookerAuthFields"
          },
          {
            "type": "object",
            "required": [
              "keyword"
            ],
            "properties": {
              "keyword": {
                "type": "string",
                "minLength": 1
              },
              "page": {
                "type": "integer",
                "minimum": 0,
                "default": 0
              },
              "count": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              },
              "detail": {
                "type": "boolean",
                "default": false
              }
            }
          }
        ]
      },
      "HbookerBookInput": {
        "allOf": [
          {
            "$ref": "#/components/schemas/HbookerAuthFields"
          },
          {
            "type": "object",
            "required": [
              "bookId"
            ],
            "properties": {
              "bookId": {
                "type": "string"
              }
            }
          }
        ]
      },
      "HbookerChapterInput": {
        "allOf": [
          {
            "$ref": "#/components/schemas/HbookerAuthFields"
          },
          {
            "type": "object",
            "required": [
              "chapterId"
            ],
            "properties": {
              "chapterId": {
                "type": "string"
              }
            }
          }
        ]
      },
      "HbookerRawInput": {
        "allOf": [
          {
            "$ref": "#/components/schemas/HbookerAuthFields"
          },
          {
            "type": "object",
            "required": [
              "endpoint"
            ],
            "properties": {
              "endpoint": {
                "type": "string",
                "description": "HBooker 上游 endpoint。"
              },
              "body": {
                "nullable": true
              },
              "form": {
                "type": "object",
                "additionalProperties": true
              },
              "data": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "additionalProperties": true
          }
        ]
      },
      "HbookerGuestInput": {
        "type": "object",
        "properties": {
          "save": {
            "type": "boolean",
            "default": true
          },
          "appVersion": {
            "type": "string"
          },
          "deviceToken": {
            "type": "string"
          },
          "userAgent": {
            "type": "string"
          },
          "raw": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "HbookerAuthSummary": {
        "type": "object",
        "properties": {
          "temporary": {
            "type": "boolean"
          },
          "account": {
            "type": "string"
          },
          "loginToken": {
            "type": "string",
            "description": "掩码后的 Token。"
          },
          "appVersion": {
            "type": "string"
          },
          "userAgent": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "HbookerBook": {
        "type": "object",
        "properties": {
          "bookId": {
            "type": "string"
          },
          "sourceId": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "cover": {
            "type": "string",
            "format": "uri"
          },
          "description": {
            "type": "string"
          },
          "tags": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "wordCount": {
            "type": "integer"
          },
          "latestChapterId": {
            "type": "string"
          },
          "latestChapterName": {
            "type": "string"
          },
          "isPaid": {
            "type": "boolean"
          },
          "raw": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "HbookerChapterItem": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "string"
          },
          "sourceChapterId": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "divisionId": {
            "type": "string"
          },
          "divisionName": {
            "type": "string"
          },
          "volume": {
            "type": "boolean"
          },
          "isPaid": {
            "type": "boolean"
          },
          "readable": {
            "type": "boolean"
          },
          "wordCount": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      },
      "HbookerHealthResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "configured",
          "guest",
          "runtime",
          "upload"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "configured": {
            "type": "boolean"
          },
          "guest": {
            "type": "object",
            "additionalProperties": true
          },
          "network": {
            "type": "object",
            "additionalProperties": true
          },
          "runtime": {
            "type": "object",
            "additionalProperties": true
          },
          "upload": {
            "type": "object",
            "additionalProperties": true
          },
          "uploadUrl": {
            "type": "string"
          },
          "userAgent": {
            "type": "string"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "HbookerSearchResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "keyword",
          "books"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "keyword": {
            "type": "string"
          },
          "page": {
            "type": "integer"
          },
          "count": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "books": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HbookerBook"
            }
          },
          "end": {
            "type": "boolean"
          },
          "detail": {
            "type": "object",
            "additionalProperties": true
          },
          "upload": {
            "type": "object",
            "additionalProperties": true
          },
          "auth": {
            "$ref": "#/components/schemas/HbookerAuthSummary"
          }
        }
      },
      "HbookerDetailResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "book"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "book": {
            "$ref": "#/components/schemas/HbookerBook"
          },
          "upload": {
            "type": "object",
            "additionalProperties": true
          },
          "auth": {
            "$ref": "#/components/schemas/HbookerAuthSummary"
          }
        }
      },
      "HbookerCatalogResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "bookId",
          "chapters"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "bookId": {
            "type": "string"
          },
          "sourceId": {
            "type": "string"
          },
          "total": {
            "type": "integer"
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HbookerChapterItem"
            }
          },
          "catalog": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HbookerChapterItem"
            }
          },
          "volumes": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "raw": {
            "type": "object",
            "additionalProperties": true
          },
          "auth": {
            "$ref": "#/components/schemas/HbookerAuthSummary"
          }
        }
      },
      "HbookerContentResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "chapterId",
          "content"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "chapterId": {
            "type": "string"
          },
          "sourceChapterId": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "content": {
            "type": "string"
          },
          "authorSay": {
            "type": "string"
          },
          "wordCount": {
            "type": "integer"
          },
          "isPaid": {
            "type": "boolean"
          },
          "readable": {
            "type": "boolean"
          },
          "needsPurchase": {
            "type": "boolean"
          },
          "auth": {
            "$ref": "#/components/schemas/HbookerAuthSummary"
          },
          "raw": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "HbookerRawResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "endpoint",
          "books"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "endpoint": {
            "type": "string"
          },
          "total": {
            "type": "integer"
          },
          "books": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HbookerBook"
            }
          },
          "raw": {
            "type": "object",
            "additionalProperties": true
          },
          "upload": {
            "type": "object",
            "additionalProperties": true
          },
          "auth": {
            "$ref": "#/components/schemas/HbookerAuthSummary"
          }
        }
      },
      "HbookerAuthCheckResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "verified",
          "auth"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "verified": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "auth": {
            "$ref": "#/components/schemas/HbookerAuthSummary"
          }
        }
      },
      "HbookerGuestResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "saved"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "platform": {
            "type": "string",
            "enum": [
              "hbooker"
            ]
          },
          "saved": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          },
          "account": {
            "type": "string"
          },
          "loginToken": {
            "type": "string",
            "description": "掩码后的 Token。"
          },
          "deviceToken": {
            "type": "string"
          },
          "appVersion": {
            "type": "string"
          },
          "userAgent": {
            "type": "string"
          },
          "statusCode": {
            "type": "integer"
          },
          "code": {
            "type": "string"
          },
          "raw": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "FanqieHealthResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "authRequired",
          "signerMode",
          "pageSize",
          "runtime",
          "endpoints"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "fanqie"
            ]
          },
          "authRequired": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "upstream": {
            "type": "string",
            "enum": [
              "https://fanqienovel.com"
            ]
          },
          "signerMode": {
            "type": "string",
            "enum": [
              "lazy"
            ]
          },
          "pageSize": {
            "type": "integer",
            "enum": [
              10
            ]
          },
          "limits": {
            "type": "object",
            "properties": {
              "keywordCharacters": {
                "type": "integer",
                "enum": [
                  100
                ]
              },
              "pageMaximum": {
                "type": "integer",
                "enum": [
                  1000
                ]
              }
            }
          },
          "runtime": {
            "type": "object",
            "properties": {
              "signerVersion": {
                "type": "string"
              },
              "signerReady": {
                "type": "boolean"
              },
              "signerReadyAt": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "cacheTtlMs": {
                "type": "integer",
                "minimum": 0
              },
              "cacheEntries": {
                "type": "integer",
                "minimum": 0
              },
              "inflightSearches": {
                "type": "integer",
                "minimum": 0
              },
              "activeRequests": {
                "type": "integer",
                "minimum": 0
              },
              "queuedRequests": {
                "type": "integer",
                "minimum": 0
              },
              "maxConcurrentRequests": {
                "type": "integer",
                "minimum": 1
              },
              "maxQueuedRequests": {
                "type": "integer",
                "minimum": 0
              }
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "FanqieBook": {
        "type": "object",
        "required": [
          "bookId",
          "title",
          "author",
          "description",
          "category",
          "status",
          "cover",
          "wordCount",
          "readCount",
          "latestChapterName",
          "firstChapterId",
          "lastChapterId"
        ],
        "properties": {
          "bookId": {
            "type": "string",
            "description": "番茄书籍 ID；超过安全整数范围，始终按字符串返回。"
          },
          "title": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "nullable": true
          },
          "cover": {
            "type": "string"
          },
          "wordCount": {
            "type": "integer",
            "minimum": 0
          },
          "readCount": {
            "type": "integer",
            "minimum": 0
          },
          "latestChapterName": {
            "type": "string"
          },
          "firstChapterId": {
            "type": "string"
          },
          "lastChapterId": {
            "type": "string"
          }
        }
      },
      "FanqieSearchResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "keyword",
          "page",
          "pageSize",
          "elapsedMs",
          "totalCount",
          "count",
          "fontHash",
          "rows"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "fanqie"
            ]
          },
          "keyword": {
            "type": "string"
          },
          "page": {
            "type": "integer",
            "minimum": 1
          },
          "pageSize": {
            "type": "integer",
            "enum": [
              10
            ]
          },
          "elapsedMs": {
            "type": "integer",
            "minimum": 0
          },
          "totalCount": {
            "type": "integer",
            "minimum": 0
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10
          },
          "fontHash": {
            "type": "string"
          },
          "rows": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "$ref": "#/components/schemas/FanqieBook"
            }
          }
        }
      },
      "QidianHealthResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "mode",
          "configured",
          "capabilities",
          "runtime",
          "endpoints"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "qidian"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "builtin"
            ]
          },
          "configured": {
            "type": "boolean"
          },
          "capabilities": {
            "type": "object",
            "required": [
              "chapter",
              "search",
              "detail"
            ],
            "properties": {
              "chapter": {
                "type": "boolean"
              },
              "search": {
                "type": "boolean"
              },
              "detail": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "runtime": {
            "type": "object",
            "properties": {
              "activeRequests": {
                "type": "integer",
                "minimum": 0
              },
              "queuedRequests": {
                "type": "integer",
                "minimum": 0
              },
              "maxConcurrentRequests": {
                "type": "integer",
                "enum": [
                  1
                ]
              },
              "maxQueuedRequests": {
                "type": "integer",
                "enum": [
                  8
                ]
              },
              "app": {
                "type": "object",
                "properties": {
                  "cacheEntries": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "inflightRequests": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "searchCacheTtlMs": {
                    "type": "integer",
                    "enum": [
                      30000
                    ]
                  },
                  "detailCacheTtlMs": {
                    "type": "integer",
                    "enum": [
                      300000
                    ]
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "QidianChapterInfo": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "string"
          },
          "chapterName": {
            "type": "string"
          },
          "chapterOrder": {
            "type": "integer"
          },
          "content": {
            "type": "string"
          },
          "contentText": {
            "type": "string"
          },
          "wordsCount": {
            "type": "integer"
          },
          "authorSay": {
            "type": "string"
          },
          "updateTime": {
            "type": "string"
          },
          "vipStatus": {
            "type": "integer"
          },
          "isBuy": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      },
      "QidianChapterResponse": {
        "type": "object",
        "description": "默认返回起点兼容 payload；envelope=1 时附加解密诊断字段。",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "source": {
            "type": "string"
          },
          "strategy": {
            "type": "string"
          },
          "bookId": {
            "type": "string"
          },
          "chapterId": {
            "type": "string"
          },
          "confidence": {
            "type": "string"
          },
          "diagnostics": {
            "type": "object",
            "additionalProperties": true
          },
          "data": {
            "type": "object",
            "properties": {
              "chapterInfo": {
                "$ref": "#/components/schemas/QidianChapterInfo"
              }
            },
            "additionalProperties": true
          },
          "attempts": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "QidianSearchBook": {
        "type": "object",
        "required": [
          "bookId",
          "title",
          "author",
          "authorId",
          "description",
          "category",
          "subCategory",
          "status",
          "cover",
          "wordCount",
          "chapterCount",
          "bookLevel",
          "popularity"
        ],
        "properties": {
          "bookId": {
            "type": "string",
            "pattern": "^[1-9]\\d*$"
          },
          "title": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "authorId": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "subCategory": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "cover": {
            "type": "string"
          },
          "wordCount": {
            "type": "integer",
            "minimum": 0
          },
          "chapterCount": {
            "type": "integer",
            "minimum": 0
          },
          "bookLevel": {
            "type": "integer",
            "minimum": 0
          },
          "popularity": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "QidianSearchResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "keyword",
          "page",
          "pageSize",
          "elapsedMs",
          "totalCount",
          "count",
          "rows"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "qidian"
            ]
          },
          "keyword": {
            "type": "string"
          },
          "page": {
            "type": "integer",
            "minimum": 1
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20
          },
          "elapsedMs": {
            "type": "integer",
            "minimum": 0
          },
          "totalCount": {
            "type": "integer",
            "minimum": 0
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "rows": {
            "type": "array",
            "maxItems": 20,
            "items": {
              "$ref": "#/components/schemas/QidianSearchBook"
            }
          }
        },
        "additionalProperties": false
      },
      "QidianLatestChapter": {
        "type": "object",
        "nullable": true,
        "required": [
          "chapterId",
          "title",
          "updatedAt"
        ],
        "properties": {
          "chapterId": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "QidianDetailBook": {
        "type": "object",
        "required": [
          "bookId",
          "title",
          "author",
          "authorId",
          "authorAvatar",
          "authorLevel",
          "description",
          "category",
          "subCategory",
          "status",
          "cover",
          "wordCount",
          "chapterCount",
          "isVip",
          "isPublication",
          "signStatus",
          "recommendCount",
          "monthlyTicketCount",
          "tags",
          "latestChapter"
        ],
        "properties": {
          "bookId": {
            "type": "string",
            "pattern": "^[1-9]\\d*$"
          },
          "title": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "authorId": {
            "type": "string"
          },
          "authorAvatar": {
            "type": "string"
          },
          "authorLevel": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "subCategory": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "cover": {
            "type": "string"
          },
          "wordCount": {
            "type": "integer",
            "minimum": 0
          },
          "chapterCount": {
            "type": "integer",
            "minimum": 0
          },
          "isVip": {
            "type": "boolean"
          },
          "isPublication": {
            "type": "boolean"
          },
          "signStatus": {
            "type": "string"
          },
          "recommendCount": {
            "type": "integer",
            "minimum": 0
          },
          "monthlyTicketCount": {
            "type": "integer",
            "minimum": 0
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "uniqueItems": true
          },
          "latestChapter": {
            "$ref": "#/components/schemas/QidianLatestChapter"
          }
        },
        "additionalProperties": false
      },
      "QidianDetailResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "elapsedMs",
          "book"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "qidian"
            ]
          },
          "elapsedMs": {
            "type": "integer",
            "minimum": 0
          },
          "book": {
            "$ref": "#/components/schemas/QidianDetailBook"
          }
        },
        "additionalProperties": false
      },
      "DudaoyueInput": {
        "type": "object",
        "properties": {
          "keyword": {
            "type": "string"
          },
          "bookId": {
            "type": "string"
          },
          "chapterId": {
            "type": "string"
          },
          "page": {
            "type": "integer",
            "minimum": 0
          },
          "count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "account": {
            "type": "string",
            "description": "请求级账号；必须与 token/login_token 成对出现。"
          },
          "token": {
            "type": "string",
            "description": "请求级登录 Token；仅作用于当前请求。"
          },
          "login_token": {
            "type": "string"
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "text"
            ]
          }
        },
        "additionalProperties": true
      },
      "DudaoyueBook": {
        "type": "object",
        "properties": {
          "bookId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "cover": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "words": {
            "type": "integer",
            "minimum": 0
          },
          "update": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "DudaoyueHealthResponse": {
        "type": "object",
        "required": [
          "ok",
          "platform",
          "auth",
          "guest",
          "endpoints"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "dudaoyue"
            ]
          },
          "auth": {
            "type": "object",
            "additionalProperties": true
          },
          "guest": {
            "type": "object",
            "additionalProperties": true
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "DudaoyueAuthResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "dudaoyue"
            ]
          },
          "auth": {
            "type": "object",
            "additionalProperties": true
          },
          "reader": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "DudaoyueAuthCheckResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "dudaoyue"
            ]
          },
          "auth": {
            "type": "object",
            "additionalProperties": true
          },
          "balance": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "DudaoyueSearchResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "dudaoyue"
            ]
          },
          "keyword": {
            "type": "string"
          },
          "page": {
            "type": "integer",
            "minimum": 0
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "end": {
            "type": "boolean"
          },
          "books": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DudaoyueBook"
            }
          }
        }
      },
      "DudaoyueDetailResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "dudaoyue"
            ]
          },
          "book": {
            "$ref": "#/components/schemas/DudaoyueBook"
          }
        }
      },
      "DudaoyueCatalogResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "dudaoyue"
            ]
          },
          "bookId": {
            "type": "string"
          },
          "chapters": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        }
      },
      "DudaoyueContentResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "platform": {
            "type": "string",
            "enum": [
              "dudaoyue"
            ]
          },
          "chapterId": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "content": {
            "type": "string"
          }
        }
      }
    }
  }
}
