{"openapi":"3.1.0","info":{"title":"WeChat Download API","description":"\n微信公众号文章下载 API，支持文章解析、公众号搜索、文章列表获取等功能。\n\n## 快速开始\n\n1. 访问 `/login.html` 扫码登录微信公众号后台\n2. 调用 `GET /api/public/searchbiz?query=公众号名称` 搜索目标公众号\n3. 从返回结果中取 `fakeid`，调用 `GET /api/public/articles?fakeid=xxx` 获取文章列表\n4. 对每篇文章调用 `POST /api/article` 获取完整内容\n\n## 认证说明\n\n所有核心接口都需要先登录。登录后凭证自动保存到 `.env` 文件，服务重启后无需重新登录（有效期约 4 天）。\n","license":{"name":"AGPL-3.0","url":"https://www.gnu.org/licenses/agpl-3.0.html"},"version":"1.0.0"},"paths":{"/api/health":{"get":{"tags":["健康检查"],"summary":"健康检查","description":"检查服务健康状态，包括 HTTP 引擎、代理池和微信每日配额信息。","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stats":{"get":{"tags":["统计信息"],"summary":"获取API统计信息","description":"获取API统计信息\n\n包括:\n- 限频统计\n- 请求统计","operationId":"get_stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}}}}},"/api/article":{"post":{"tags":["文章内容"],"summary":"获取文章内容","description":"解析微信公众号文章，返回标题、正文、图片等结构化数据。\n\n**请求体参数：**\n- **url** (必填): 微信文章链接，支持 `https://mp.weixin.qq.com/s/xxxxx` 格式\n\n**返回字段：**\n- `title`: 文章标题\n- `content`: HTML 正文（保留原始排版）\n- `plain_content`: 纯文本正文（去除所有 HTML 标签，适合直接阅读或 AI 处理）\n- `author`: 作者\n- `publish_time`: 发布时间戳\n- `images`: 文章内的图片列表","operationId":"get_article_api_article_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/articles":{"get":{"tags":["文章列表"],"summary":"获取文章列表","description":"获取指定公众号的文章列表，支持分页。\n\n**使用流程：**\n1. 先调用 `GET /api/public/searchbiz` 搜索目标公众号\n2. 从搜索结果中获取目标公众号的 `fakeid`\n3. 使用 `fakeid` 调用本接口获取文章列表\n\n**查询参数：**\n- **fakeid** (必填): 目标公众号的 FakeID\n- **begin** (可选): 偏移量，默认 0\n- **count** (可选): 获取数量，默认 10，最大 100\n- **keyword** (可选): 在该公众号内搜索关键词","operationId":"get_articles_api_public_articles_get","parameters":[{"name":"fakeid","in":"query","required":true,"schema":{"type":"string","description":"目标公众号的 FakeID（通过搜索接口获取）","title":"Fakeid"},"description":"目标公众号的 FakeID（通过搜索接口获取）"},{"name":"begin","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"偏移量，从第几条开始","default":0,"title":"Begin"},"description":"偏移量，从第几条开始"},{"name":"count","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"获取数量，最大 100","default":10,"title":"Count"},"description":"获取数量，最大 100"},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"在该公众号内搜索关键词（可选）","title":"Keyword"},"description":"在该公众号内搜索关键词（可选）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticlesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/articles/search":{"get":{"tags":["文章列表"],"summary":"搜索公众号文章","description":"在指定公众号内按关键词搜索文章。\n\n**查询参数：**\n- **fakeid** (必填): 目标公众号的 FakeID\n- **query** (必填): 搜索关键词\n- **begin** (可选): 偏移量，默认 0\n- **count** (可选): 获取数量，默认 10，最大 100","operationId":"search_articles_api_public_articles_search_get","parameters":[{"name":"fakeid","in":"query","required":true,"schema":{"type":"string","description":"目标公众号的 FakeID","title":"Fakeid"},"description":"目标公众号的 FakeID"},{"name":"query","in":"query","required":true,"schema":{"type":"string","description":"搜索关键词","title":"Query"},"description":"搜索关键词"},{"name":"begin","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"偏移量，默认 0","default":0,"title":"Begin"},"description":"偏移量，默认 0"},{"name":"count","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"获取数量，默认 10，最大 100","default":10,"title":"Count"},"description":"获取数量，默认 10，最大 100"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticlesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/searchbiz":{"get":{"tags":["公众号搜索"],"summary":"搜索公众号","description":"按关键词搜索微信公众号，获取 FakeID。\n\n**查询参数：**\n- **query** (必填): 搜索关键词（公众号名称）\n\n**返回字段（均在 `data` 下）：**\n- `list[]`: 匹配的公众号列表，每项含 `fakeid`、`nickname`、`alias`、`round_head_img`、`service_type`\n- `total`: 匹配数量（已过滤黑名单）","operationId":"search_accounts_api_public_searchbiz_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","description":"公众号名称或关键词","title":"Query"},"description":"公众号名称或关键词"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/accountinfo":{"get":{"tags":["公众号信息"],"summary":"获取公众号主体信息","description":"获取指定公众号的主体信息（认证主体、原创文章数等）。\n\n**使用流程：**\n1. 先调用 `GET /api/public/searchbiz` 搜索目标公众号\n2. 从搜索结果中获取目标公众号的 `fakeid`\n3. 使用 `fakeid` 调用本接口获取主体信息\n\n**查询参数：**\n- **fakeid** (必填): 目标公众号的 FakeID\n\n**返回字段：**\n- `identity_name`: 认证主体名称（如\"腾讯科技有限公司\"）\n- `is_verify`: 认证状态（0=未认证, 1=微信认证, 2=新媒体认证）\n- `original_article_count`: 原创文章数量","operationId":"get_account_info_api_public_accountinfo_get","parameters":[{"name":"fakeid","in":"query","required":true,"schema":{"type":"string","description":"公众号的 FakeID（通过搜索接口获取）","title":"Fakeid"},"description":"公众号的 FakeID（通过搜索接口获取）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/status":{"get":{"tags":["管理"],"summary":"获取登录状态","description":"获取当前登录状态（含微信侧真实会话探活，消除「假在线」误报）","operationId":"get_status_api_admin_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}}}},"/api/admin/logout":{"post":{"tags":["管理"],"summary":"退出登录","description":"退出登录，清除凭证","operationId":"logout_api_admin_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/blacklist":{"get":{"tags":["管理"],"summary":"获取黑名单列表","description":"获取公众号黑名单列表","operationId":"get_blacklist_api_admin_blacklist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["管理"],"summary":"添加到黑名单","description":"手动添加公众号到黑名单","operationId":"add_to_blacklist_api_admin_blacklist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddBlacklistRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blacklist/{fakeid}":{"delete":{"tags":["管理"],"summary":"从黑名单移除","description":"从黑名单移除公众号（标记为非活跃）","operationId":"remove_from_blacklist_api_admin_blacklist__fakeid__delete","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blacklist/record/{blacklist_id}":{"delete":{"tags":["管理"],"summary":"永久删除黑名单记录","description":"永久删除黑名单记录（仅可删除非活跃记录）","operationId":"delete_blacklist_record_api_admin_blacklist_record__blacklist_id__delete","parameters":[{"name":"blacklist_id","in":"path","required":true,"schema":{"type":"integer","title":"Blacklist Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/categories":{"get":{"tags":["管理"],"summary":"获取分类列表","description":"获取所有分类","operationId":"get_categories_api_admin_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["管理"],"summary":"创建分类","description":"创建新分类","operationId":"create_category_api_admin_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/categories/{category_id}":{"patch":{"tags":["管理"],"summary":"更新分类","description":"更新分类信息","operationId":"update_category_api_admin_categories__category_id__patch","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["管理"],"summary":"删除分类","description":"删除分类（订阅会自动解除关联）","operationId":"delete_category_api_admin_categories__category_id__delete","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/categories/{category_id}/subscriptions":{"get":{"tags":["管理"],"summary":"获取分类下的订阅","description":"获取分类下的所有订阅","operationId":"get_category_subscriptions_api_admin_categories__category_id__subscriptions_get","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/subscriptions/{fakeid}/category":{"put":{"tags":["管理"],"summary":"设置订阅分类","description":"设置订阅的分类","operationId":"set_subscription_category_api_admin_subscriptions__fakeid__category_put","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCategoryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/history/fetch":{"post":{"tags":["管理"],"summary":"获取历史文章","description":"获取公众号的历史文章并存入数据库。\n简化版：直接调用微信 API 获取历史文章列表，不涉及用户权限和付费逻辑。","operationId":"fetch_history_articles_api_admin_history_fetch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchHistoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/diagnose":{"get":{"tags":["管理"],"summary":"微信读书诊断（聚合面板）","description":"聚合展示微信读书相关的人话版诊断结果（不暴露原始 JSON/代码）。\n\n包含：Cookie 状态、健康检查、本站入站限频、订阅轮询情况与失败原因、文章抓取统计。\n仅复用现有 cookie_status 的一次校验，不额外调用微信读书接口（防风控）。","operationId":"diagnose_api_admin_diagnose_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/poll-schedule":{"get":{"tags":["管理"],"summary":"获取定时轮询规则","description":"返回当前全局定时规则 + next_run（ISO CST 字符串，无未来则空串）。无鉴权。","operationId":"get_poll_schedule_route_api_admin_poll_schedule_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["管理"],"summary":"设置定时轮询规则","description":"保存全局定时规则（落库 settings 表，热生效），返回 next_run。无鉴权。","operationId":"put_poll_schedule_route_api_admin_poll_schedule_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollScheduleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/poll-now":{"post":{"tags":["管理"],"summary":"立即触发一次全局轮询","description":"立即触发一次全局轮询（串行于 _poll_lock），返回 {fetched, errors}。无鉴权。","operationId":"poll_now_route_api_admin_poll_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/poll-schedule/{fakeid}":{"get":{"tags":["管理"],"summary":"获取单号轮询覆盖规则","description":"返回某号覆盖规则；无覆盖时 inherited:true 并回退返回全局规则。无鉴权。","operationId":"get_poll_schedule_fakeid_api_admin_poll_schedule__fakeid__get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["管理"],"summary":"设置单号轮询覆盖规则","description":"保存单号覆盖规则；enabled:false 表示回退全局并清除覆盖。无鉴权。","operationId":"put_poll_schedule_fakeid_api_admin_poll_schedule__fakeid__put","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/article-retention":{"get":{"tags":["管理"],"summary":"获取文章保留设置","description":"返回当前保留天数、是否启用、选项列表。无鉴权。","operationId":"get_article_retention_api_admin_article_retention_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["管理"],"summary":"设置文章保留策略","description":"保存保留天数（落库），并立即执行一次清理（删除过期 + 空正文）。无鉴权。","operationId":"put_article_retention_api_admin_article_retention_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleRetentionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/backfill-content":{"post":{"tags":["管理"],"summary":"回填空壳文章正文（进程内）","description":"对 content 偏短的文章重抓正文并强制覆盖。进程内运行，可使用当前 WEREAD_COOKIE。\n立即返回，进度用 GET /api/admin/backfill-content/status 查询。无鉴权。","operationId":"backfill_content_route_api_admin_backfill_content_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/backfill-content/status":{"get":{"tags":["管理"],"summary":"查询回填进度","description":"返回回填任务进度。无鉴权。","operationId":"backfill_content_status_api_admin_backfill_content_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/poll-limit":{"get":{"tags":["轮询上限"],"summary":"获取轮询上限","description":"获取当前轮询上限（全局 + 各账号覆盖）。需登录。","operationId":"get_poll_limit_api_admin_poll_limit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["轮询上限"],"summary":"设置轮询上限","description":"部分更新轮询上限，落库 settings 表（热生效，无需重启）。需登录。\n\n- value: 设置全局上限\n- per_account: {fakeid: 上限} 批量设置单账号上限","operationId":"put_poll_limit_api_admin_poll_limit_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollLimitPutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/login/session/{sessionid}":{"post":{"tags":["登录"],"summary":"初始化登录会话","description":"初始化登录会话，必须在获取二维码之前调用。\n\n**路径参数：**\n- **sessionid**: 会话标识，由前端生成","operationId":"create_session_api_login_session__sessionid__post","parameters":[{"name":"sessionid","in":"path","required":true,"schema":{"type":"string","title":"Sessionid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/login/getqrcode":{"get":{"tags":["登录"],"summary":"获取登录二维码","description":"获取微信公众号登录二维码图片，用微信扫码登录。\n\n**返回：** 二维码图片（PNG/JPEG 格式）","operationId":"get_qrcode_api_login_getqrcode_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/login/scan":{"get":{"tags":["登录"],"summary":"检查扫码状态","description":"轮询检查二维码扫描状态。\n\n**返回状态：** 等待扫码 / 已扫码待确认 / 确认成功 / 二维码过期","operationId":"check_scan_status_api_login_scan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/login/bizlogin":{"post":{"tags":["登录"],"summary":"完成登录","description":"扫码确认后调用此接口完成登录，成功后凭证自动保存到 `.env`。\n\n**返回：** Token、Cookie、FakeID、昵称等登录凭证","operationId":"biz_login_api_login_bizlogin_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/login/manual":{"post":{"tags":["登录"],"summary":"手动配置登录凭证","description":"手动提交登录凭证（适用于已通过其他方式获取凭证的场景）。\n\n**请求体参数：**\n- **token** (必填): 微信 Token\n- **cookie** (必填): 微信 Cookie\n- **fakeid** (可选): 公众号 FakeID\n- **nickname** (可选): 公众号昵称\n- **expire_time** (可选): 过期时间戳","operationId":"manual_login_api_login_manual_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/login/info":{"get":{"tags":["登录"],"summary":"获取登录信息","description":"获取当前登录用户的昵称、FakeID、过期时间等信息。","operationId":"get_login_info_api_login_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/image":{"get":{"tags":["图片代理"],"summary":"图片代理下载","description":"代理下载微信图片，避免防盗链。\n\n安全约束：\n- 仅允许 ALLOWED_IMAGE_HOSTS 中的微信 CDN 域名\n- 单图最大 30MB（content-length 预检 + 流式累计校验）\n\nReturns:\n    StreamingResponse: 真流式输出图片数据，内存峰值 ~8KB","operationId":"proxy_image_api_image_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"图片URL","title":"Url"},"description":"图片URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/recent-articles":{"get":{"tags":["近期文章"],"summary":"获取近期文章","description":"获取近期文章（支持按公众号 / 日期 / 是否含网盘资源过滤），需登录。\n\n用于「文章管理」前端：左栏列表 + 右栏正文渲染。","operationId":"recent_articles_api_rss_recent_articles_get","parameters":[{"name":"fakeid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"按公众号 FakeID 过滤（可选）","title":"Fakeid"},"description":"按公众号 FakeID 过滤（可选）"},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"发布日期：today 或 YYYY-MM-DD（可选）","title":"Date"},"description":"发布日期：today 或 YYYY-MM-DD（可选）"},{"name":"has_resource","in":"query","required":false,"schema":{"type":"boolean","description":"仅返回正文含网盘链接（夸克/百度）的文章","default":false,"title":"Has Resource"},"description":"仅返回正文含网盘链接（夸克/百度）的文章"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"每页数量","default":50,"title":"Limit"},"description":"每页数量"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"偏移量","default":0,"title":"Offset"},"description":"偏移量"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/subscribe":{"post":{"tags":["RSS 订阅"],"summary":"添加 RSS 订阅","description":"添加一个公众号到 RSS 订阅列表。\n\n添加后，后台轮询器会定时拉取该公众号的最新文章。\n\n**请求体参数：**\n- **fakeid** (必填): 公众号 FakeID，通过搜索接口获取\n- **nickname** (可选): 公众号名称\n- **alias** (可选): 公众号微信号\n- **head_img** (可选): 公众号头像 URL","operationId":"subscribe_api_rss_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/batch-subscribe":{"post":{"tags":["RSS 订阅"],"summary":"批量订阅（多个公众号名称）","description":"粘一批公众号名称（每行一个）→ 逐个搜索并订阅。\n\n- 单一匹配：直接订阅；已订阅的跳过并提示。\n- 多个同名：返回 needs_confirm 让用户勾选（不盲订），前端逐个调 /rss/subscribe。\n- 搜不到 / 登录态失效：计入 failed 并给原因。\n\n为保护服务端登录态，单批最多 20 个、逐个搜索并间隔 1s（微信搜索接口有限频）。","operationId":"batch_subscribe_api_rss_batch_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/subscribe/{fakeid}":{"delete":{"tags":["RSS 订阅"],"summary":"取消 RSS 订阅","description":"取消订阅一个公众号，同时删除该公众号的缓存文章。\n\n**路径参数：**\n- **fakeid**: 公众号 FakeID","operationId":"unsubscribe_api_rss_subscribe__fakeid__delete","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/subscriptions":{"get":{"tags":["RSS 订阅"],"summary":"获取订阅列表","description":"获取当前所有 RSS 订阅的公众号列表。\n\n返回每个订阅的基本信息、缓存文章数和 RSS 地址。","operationId":"get_subscriptions_api_rss_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionListResponse"}}}}}}},"/api/rss/poll":{"post":{"tags":["RSS 订阅"],"summary":"手动触发轮询","description":"手动触发一次轮询，立即拉取所有订阅公众号的最新文章。\n\n通常用于首次订阅后立即获取文章，无需等待下一个轮询周期。","operationId":"trigger_poll_api_rss_poll_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollerStatusResponse"}}}}}}},"/api/rss/poll/{fakeid}":{"get":{"tags":["RSS 订阅"],"summary":"单号手动触发轮询","description":"手动触发单个公众号的轮询，立即拉取该号最新文章。\n\n供管理页诊断面板「立即轮询」按钮调用，无需等待下一个轮询周期。\n返回 {code,data:{fetched,errors,error,message},message}。","operationId":"trigger_poll_one_api_rss_poll__fakeid__get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/status":{"get":{"tags":["RSS 订阅"],"summary":"轮询器状态","description":"获取 RSS 轮询器运行状态。","operationId":"poller_status_api_rss_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollerStatusResponse"}}}}}}},"/api/rss/all":{"get":{"tags":["RSS 订阅"],"summary":"聚合 RSS 订阅源","description":"获取所有订阅公众号的聚合 RSS 2.0 订阅源。\n\n将此地址添加到 RSS 阅读器，即可在一个订阅源中查看所有公众号文章。\n订阅增减后自动生效，无需更换链接。","operationId":"get_aggregated_rss_feed_api_rss_all_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":4500,"minimum":1,"description":"文章数量上限","default":4500,"title":"Limit"},"description":"文章数量上限"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(full|links)$","description":"输出格式: full 完整 / links 仅网盘链接","default":"full","title":"Format"},"description":"输出格式: full 完整 / links 仅网盘链接"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/export":{"get":{"tags":["RSS 订阅"],"summary":"导出订阅列表","description":"导出当前订阅列表。\n\n- **csv**: 包含公众号名称、FakeID、RSS 地址、文章数、订阅时间\n- **opml**: 标准 OPML 格式，可直接导入 RSS 阅读器","operationId":"export_subscriptions_api_rss_export_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|opml)$","description":"导出格式: csv 或 opml","default":"csv","title":"Format"},"description":"导出格式: csv 或 opml"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/{fakeid}":{"get":{"tags":["RSS 订阅"],"summary":"获取 RSS 订阅源","description":"获取指定公众号的 RSS 2.0 订阅源（XML 格式）。\n\n只包含订阅后发布的文章（常规更新），历史文章请使用 /api/rss/{fakeid}/history\n\n将此地址添加到任何 RSS 阅读器即可订阅公众号文章。\n\n**路径参数：**\n- **fakeid**: 公众号 FakeID\n\n**查询参数：**\n- **limit** (可选): 返回文章数量上限，默认 30，最大 50","operationId":"get_rss_feed_api_rss__fakeid__get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"文章数量上限","default":30,"title":"Limit"},"description":"文章数量上限"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/{fakeid}/history":{"get":{"tags":["RSS 订阅"],"summary":"获取历史文章 RSS 订阅源","description":"获取指定公众号的历史文章 RSS 2.0 订阅源（XML 格式）。\n\n历史文章指订阅前发布的文章，通过\"获取历史文章\"功能拉取。\n与常规 RSS 分离，避免大量历史文章导致加载缓慢。\n\n**使用建议**：\n- 默认 per_page=500，最大支持 5000 篇/次\n- 如果历史文章超过 5000 篇，使用 page 参数分批加载\n\n**路径参数：**\n- **fakeid**: 公众号 FakeID\n\n**查询参数：**\n- **page** (可选): 页码，默认 1\n- **per_page** (可选): 每页数量，默认 500，最大 5000","operationId":"get_historical_rss_feed_api_rss__fakeid__history_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"页码","default":1,"title":"Page"},"description":"页码"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":10,"description":"每页数量","default":500,"title":"Per Page"},"description":"每页数量"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rss/category/{category_id}":{"get":{"tags":["RSS 订阅"],"summary":"获取分类 RSS 订阅源","description":"获取指定分类的 RSS 2.0 订阅源（XML 格式）。\n\n聚合该分类下所有公众号的最新文章。\n\n**路径参数：**\n- **category_id**: 分类 ID\n\n**查询参数：**\n- **limit** (可选): 返回文章数量上限","operationId":"get_category_rss_feed_api_rss_category__category_id__get","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":4500,"minimum":1,"description":"文章数量上限","default":4500,"title":"Limit"},"description":"文章数量上限"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feed/articles.json":{"get":{"tags":["Feed（文章列表 / markdown 导出）"],"summary":"本地已抓取文章列表（含 id，增量同步）","description":"按 publish_time 正序、游标分页返回本地已抓取的文章元数据（不含正文）。\n拿到 `id` 后配合 `/api/feed/article/{id}.md` 下载 markdown 正文。\n\n每次响应含 `next_since`（本批最后一篇的 publish_time），作为下次 `since`，\n循环调用直到 `articles` 为空即拉完；之后用保存的 `next_since` 做每日增量。","operationId":"feed_articles_api_feed_articles_json_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Unix 时间戳，返回 publish_time > since 的文章；首次传 0","default":0,"title":"Since"},"description":"Unix 时间戳，返回 publish_time > since 的文章；首次传 0"},{"name":"fakeid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"可选，筛选单个公众号","title":"Fakeid"},"description":"可选，筛选单个公众号"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"单次返回条数（1-200）","default":50,"title":"Limit"},"description":"单次返回条数（1-200）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feed/article/{article_id}.md":{"get":{"tags":["Feed（文章列表 / markdown 导出）"],"summary":"单篇文章 markdown 正文","description":"获取单篇文章的 markdown 正文，带 YAML frontmatter（title/author/nickname/fakeid/\npublish_time/source_url），图片走 `/api/image` 代理，Obsidian/Logseq 可直接渲染。\n\n状态码：200 正文 / 404 不存在 / 422 内容尚未抓取完成。\n浏览器与下载工具会按文章标题自动存为「标题.md」。","operationId":"feed_article_md_api_feed_article__article_id__md_get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/account/{fakeid}.zip":{"get":{"tags":["文章导出（整号 md/html/pdf/docx/epub/xlsx/json）"],"summary":"整号导出为 Markdown 合集（zip，每篇一文件）","operationId":"export_account_md_zip_api_export_account__fakeid__zip_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"只导 publish_time>=since 的文章（时间窗起点/增量，秒级时间戳）","default":0,"title":"Since"},"description":"只导 publish_time>=since 的文章（时间窗起点/增量，秒级时间戳）"},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"只导 publish_time<=before 的文章（时间窗终点）","default":0,"title":"Before"},"description":"只导 publish_time<=before 的文章（时间窗终点）"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":3000,"minimum":1,"description":"最多导出篇数（最近优先）","default":3000,"title":"Limit"},"description":"最多导出篇数（最近优先）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/account/{fakeid}.html":{"get":{"tags":["文章导出（整号 md/html/pdf/docx/epub/xlsx/json）"],"summary":"整号导出为单文件 HTML 合集","operationId":"export_account_html_api_export_account__fakeid__html_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":3000,"minimum":1,"default":3000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/account/{fakeid}.pdf":{"get":{"tags":["文章导出（整号 md/html/pdf/docx/epub/xlsx/json）"],"summary":"整号导出为 PDF（图片内嵌，离线可读）","operationId":"export_account_pdf_api_export_account__fakeid__pdf_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/account/{fakeid}.docx":{"get":{"tags":["文章导出（整号 md/html/pdf/docx/epub/xlsx/json）"],"summary":"整号导出为 Word(.docx，图去重压缩，可编辑离线)","operationId":"export_account_docx_api_export_account__fakeid__docx_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/account/{fakeid}.epub":{"get":{"tags":["文章导出（整号 md/html/pdf/docx/epub/xlsx/json）"],"summary":"整号导出为 EPUB(合集阅读，图去重，手机/阅读器)","operationId":"export_account_epub_api_export_account__fakeid__epub_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/account/{fakeid}.xlsx":{"get":{"tags":["文章导出（整号 md/html/pdf/docx/epub/xlsx/json）"],"summary":"整号文章信息导出为 Excel 表","operationId":"export_account_xlsx_api_export_account__fakeid__xlsx_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":3000,"minimum":1,"default":3000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export/account/{fakeid}.json":{"get":{"tags":["文章导出（整号 md/html/pdf/docx/epub/xlsx/json）"],"summary":"整号文章信息导出为 JSON","operationId":"export_account_json_api_export_account__fakeid__json_get","parameters":[{"name":"fakeid","in":"path","required":true,"schema":{"type":"string","title":"Fakeid"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":3000,"minimum":1,"default":3000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/weread/articles":{"get":{"tags":["微信读书(试点)"],"summary":"[试点] 微信读书文章列表","description":"[试点] 通过微信读书 Web 接口获取指定公众号的文章列表。\n\n流程：fakeid → fakeid_to_bookid → ensure_subscribed（确保已订阅）→\nget_article_list → 映射成与现有 ArticlesResponse 兼容结构。\n\n返回结构（兼容 routes/articles.py 的 ArticlesResponse / ArticleItem）：\n{\n  \"success\": true,\n  \"data\": {\n    \"articles\": [{\"aid\",\"title\",\"link\",\"update_time\",\"create_time\",\n                   \"digest\",\"cover\",\"author\"}, ...],\n    \"total\": <int>, \"begin\": <offset>, \"count\": <len>, \"keyword\": null\n  },\n  \"error\": null\n}","operationId":"weread_articles_api_weread_articles_get","parameters":[{"name":"fakeid","in":"query","required":true,"schema":{"type":"string","description":"目标公众号的 FakeID","title":"Fakeid"},"description":"目标公众号的 FakeID"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"偏移量，默认 0","default":0,"title":"Offset"},"description":"偏移量，默认 0"},{"name":"count","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"获取数量，默认 50","default":50,"title":"Count"},"description":"获取数量，默认 50"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/weread/article":{"get":{"tags":["微信读书(试点)"],"summary":"[试点] 微信读书文章正文","description":"[试点] 通过微信读书 Web 接口获取单篇文章正文。\n\n返回结构（兼容 routes/article.py 的 ArticleResponse / ArticleData）：\n{\n  \"success\": true,\n  \"data\": {\n    \"title\",\"content\",\"plain_content\",\"images\",\"author\",\n    \"publish_time\",\"publish_time_str\",\"link\"\n  },\n  \"error\": null\n}","operationId":"weread_article_api_weread_article_get","parameters":[{"name":"reviewId","in":"query","required":false,"schema":{"type":"string","description":"文章 reviewId（形如 <BOOK_ID>_<ARTICLE_TOKEN>）","title":"Reviewid"},"description":"文章 reviewId（形如 <BOOK_ID>_<ARTICLE_TOKEN>）"},{"name":"fakeid","in":"query","required":false,"schema":{"type":"string","description":"公众号 FakeID（可选，仅作上下文；以 reviewId 为准）","title":"Fakeid"},"description":"公众号 FakeID（可选，仅作上下文；以 reviewId 为准）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/weread/cookie_status":{"get":{"tags":["微信读书登录"],"summary":"微信读书 Cookie 当前状态","description":"返回当前 WEREAD_COOKIE 状态。\n\n返回字段：\n  - configured: 是否已配置（内存全局 cookie 长度 > 0）\n  - valid:      有效性（调一次 /web/shelf/bookIds 测试；-2012 则无效；\n               网络异常时为 null）\n  - cookie_len: 当前 cookie 字符串长度\n  - checked_at: 本次检查时间（ISO 8601 UTC）\n  - configured_at: .env 文件最后修改时间（ISO 8601 UTC，无则 null）\n  - error:      验证过程中的错误信息（无则 null）","operationId":"cookie_status_api_weread_cookie_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cookie Status Api Weread Cookie Status Get"}}}}}}},"/api/weread/auto_login":{"post":{"tags":["微信读书登录"],"summary":"用持久登录态免扫码恢复 Cookie","description":"尝试用磁盘上的持久登录态（有头浏览器 profile）免扫码恢复微信读书 Cookie。\n\n适用于：容器重启后自动续期；或手动触发补登。若登录态已失效则返回 need_scan\n（需用户重新扫码）。详见 utils.weread_qr.auto_restore_session。","operationId":"auto_login_api_weread_auto_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auto Login Api Weread Auto Login Post"}}}}}}},"/api/weread/trigger_tea":{"post":{"tags":["微信读书登录"],"summary":"一键重试触发 wr_tea_cookie 签名","description":"在已有登录态的基础上，多策略导航触发 wr_tea_cookie 签名（无需重新扫码）。\n\n适用于：扫码后签名未就绪（xvfb 虚拟显示器可能被检测为非真实浏览器），\n手动重试不同页面类型以增加命中概率。内部会依次访问书籍页/首页/书架页/阅读页\n等多种内容页，每种等待 3 秒，总最长约 40 秒。\n\n返回：\n  - {\"ok\": true, \"tea_ready\": true, ...}  签名捕获成功\n  - {\"ok\": true, \"tea_ready\": false, ...} 仍失败（可能需手动粘贴 Cookie）\n  - {\"ok\": false, \"error\": \"...\"}  异常","operationId":"trigger_tea_api_weread_trigger_tea_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Trigger Tea Api Weread Trigger Tea Post"}}}}}}},"/api/weread/save_cookie":{"post":{"tags":["微信读书登录"],"summary":"保存并验证微信读书 Cookie","description":"校验并保存用户粘贴的 cookie，并立即做内存热更新。\n\n流程（复用 _persist_and_verify）：\n  1. 校验 cookie 非空且包含 wr_skey / wr_vid 基本字段。\n  2. 写入 .env 的 WEREAD_COOKIE 行（替换或追加，保留其它配置）。\n  3. 运行时热更新 weread_client / routes.weread 的全局变量（无需重启即可生效）。\n  4. 用新 cookie 调一次微信读书验证接口，返回验证结果。\n\n返回字段：\n  - success: 是否成功保存（与验证结果无关，保存即成功）\n  - message: 人类可读提示\n  - valid:   验证是否通过（True/False）；写盘失败时为 null\n  - saved_to_env: 是否成功写入 .env（False 表示只读挂载等失败，但内存已热更新）\n  - error:   错误信息（无则 null）","operationId":"save_cookie_api_weread_save_cookie_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveCookieRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Save Cookie Api Weread Save Cookie Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/weread/restart":{"post":{"tags":["微信读书登录"],"summary":"重启服务以加载新 Cookie","description":"触发容器重启以加载新 cookie。\n\n说明：\n  容器内通常无法真正 self-restart（无 docker），此处 best-effort 调用；\n  同时重新从 .env 载入并热更新内存全局，保证即使重启未触发，weread 功能也已可用。\n\n返回字段：\n  - success: 接口处理成功（True）\n  - message: 人类可读提示\n  - restarted: 是否真的触发了容器重启（False 时依赖内存热更新）","operationId":"restart_service_api_weread_restart_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Restart Service Api Weread Restart Post"}}}}}}},"/api/weread/qrcode/start":{"post":{"tags":["微信读书登录"],"summary":"启动微信读书扫码登录会话","description":"启动一次扫码会话：无头浏览器打开 weread → 点击登录 → 取二维码 base64。\n\n返回：\n  - 成功:          {\"qrcode\": \"<base64 data url>\", \"session_id\": \"...\"}\n  - 锁被占(HTTP 409): {\"error\": \"已有进行中的扫码会话\"}\n  - 浏览器/风控失败:   {\"status\": \"error\", \"error\": \"...\"}（引导回手动粘贴）","operationId":"qrcode_start_api_weread_qrcode_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Qrcode Start Api Weread Qrcode Start Post"}}}}}}},"/api/weread/qrcode/status":{"get":{"tags":["微信读书登录"],"summary":"轮询扫码登录状态","description":"轮询当前扫码会话状态机。\n\n返回：\n  - {\"status\": \"idle\"}                  无进行中的会话\n  - {\"status\": \"waiting_scan\"}          二维码已展示，等待用户扫码\n  - {\"status\": \"scanned\"}               已扫码，待手机端确认\n  - {\"status\": \"done\", \"cookie_status\": {...}}   登录成功，Cookie 已落盘热更新\n  - {\"status\": \"expired\"}               超时/失效，需刷新","operationId":"qrcode_status_api_weread_qrcode_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Qrcode Status Api Weread Qrcode Status Get"}}}}}}},"/api/weread/qrcode/cancel":{"post":{"tags":["微信读书登录"],"summary":"取消扫码登录会话","description":"主动取消并清理当前扫码会话，释放锁。\n\n返回：{\"status\": \"idle\", \"message\": \"已取消扫码会话\"}","operationId":"qrcode_cancel_api_weread_qrcode_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Qrcode Cancel Api Weread Qrcode Cancel Post"}}}}}}},"/api/draft/accounts":{"get":{"tags":["文章管理","文章管理"],"summary":"获取公众号账号列表","operationId":"list_accounts_api_draft_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["文章管理","文章管理"],"summary":"新增公众号账号","operationId":"create_account_api_draft_accounts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/accounts/{account_id}":{"put":{"tags":["文章管理","文章管理"],"summary":"更新公众号账号","operationId":"update_account_api_draft_accounts__account_id__put","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["文章管理","文章管理"],"summary":"删除公众号账号","operationId":"delete_account_api_draft_accounts__account_id__delete","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/templates":{"get":{"tags":["文章管理","文章管理"],"summary":"获取模板列表","operationId":"list_templates_api_draft_templates_get","parameters":[{"name":"account_id","in":"query","required":true,"schema":{"type":"integer","description":"公众号ID","title":"Account Id"},"description":"公众号ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["文章管理","文章管理"],"summary":"新增模板","operationId":"create_template_api_draft_templates_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/templates/{template_id}":{"put":{"tags":["文章管理","文章管理"],"summary":"更新模板","operationId":"update_template_api_draft_templates__template_id__put","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["文章管理","文章管理"],"summary":"删除模板","operationId":"delete_template_api_draft_templates__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/articles":{"get":{"tags":["文章管理","文章管理"],"summary":"获取已抓取文章列表","operationId":"list_articles_api_draft_articles_get","parameters":[{"name":"account_id","in":"query","required":true,"schema":{"type":"integer","description":"公众号ID（对应 wechat_accounts.id）","title":"Account Id"},"description":"公众号ID（对应 wechat_accounts.id）"},{"name":"keyword","in":"query","required":false,"schema":{"type":"string","description":"搜索关键词","default":"","title":"Keyword"},"description":"搜索关键词"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/articles/{article_id}/clean":{"post":{"tags":["文章管理","文章管理"],"summary":"清洗文章正文","operationId":"clean_article_api_draft_articles__article_id__clean_post","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/save":{"post":{"tags":["文章管理","文章管理"],"summary":"保存草稿","operationId":"save_draft_api_draft_save_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftSave"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/list":{"get":{"tags":["文章管理","文章管理"],"summary":"草稿列表","operationId":"list_drafts_api_draft_list_get","parameters":[{"name":"account_id","in":"query","required":true,"schema":{"type":"integer","description":"公众号ID","title":"Account Id"},"description":"公众号ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/{draft_id}":{"get":{"tags":["文章管理","文章管理"],"summary":"获取草稿详情","operationId":"get_draft_api_draft__draft_id__get","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["文章管理","文章管理"],"summary":"更新草稿","operationId":"update_draft_api_draft__draft_id__put","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["文章管理","文章管理"],"summary":"删除草稿","operationId":"delete_draft_api_draft__draft_id__delete","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/{draft_id}/preview":{"get":{"tags":["文章管理","文章管理"],"summary":"预览草稿","description":"返回完整 HTML 页面，可直接在浏览器/iframe 中查看效果","operationId":"preview_draft_api_draft__draft_id__preview_get","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/draft/transfer/categories":{"get":{"tags":["资源转存"],"summary":"Transfer Categories","description":"代理论坛 api_categories.php，透传分类列表（供精准模式分类选择器使用）。","operationId":"transfer_categories_api_draft_transfer_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/draft/transfer-article/preview":{"post":{"tags":["资源转存"],"summary":"Transfer Article Preview","description":"预览：解析文章正文，仅抽取资源（不发文），透传 resources 列表。","operationId":"transfer_article_preview_api_draft_transfer_article_preview_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/draft/transfer-article":{"post":{"tags":["资源转存"],"summary":"Transfer Article","description":"把一篇文章（按 id 取正文，或直接传正文）中的网盘资源转存到论坛。\n\nRequest body (JSON):\n    {\n        \"article_id\": int,                 # 可选，优先按 id 取文章正文\n        \"title\": str, \"content\": str,      # 也可直接传正文\n        \"account\": str, \"publish_time\": int, \"source_link\": str,\n        \"resources\": [                     # 可选，精准模式：已抽好的资源列表\n            {\"url\": str, \"category_id\": int, \"title\": str, \"code\": str}\n        ]\n    }\nReturns: api_ok({\"posts\": [...], \"summary\": str})","operationId":"transfer_article_api_draft_transfer_article_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccountCreate":{"properties":{"name":{"type":"string","title":"Name"},"fakeid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fakeid"},"appid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appid"},"app_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Secret"},"weiqin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weiqin Id"}},"type":"object","required":["name"],"title":"AccountCreate"},"AccountInfoResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"AccountInfoResponse","description":"公众号信息响应"},"AccountUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"fakeid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fakeid"},"appid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appid"},"app_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Secret"},"is_active":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Active"},"weiqin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weiqin Id"}},"type":"object","title":"AccountUpdate"},"AddBlacklistRequest":{"properties":{"fakeid":{"type":"string","title":"Fakeid","description":"公众号ID"},"nickname":{"type":"string","title":"Nickname","description":"公众号名称","default":""},"reason":{"type":"string","title":"Reason","description":"加入原因","default":"manual"},"note":{"type":"string","title":"Note","description":"备注","default":""}},"type":"object","required":["fakeid"],"title":"AddBlacklistRequest"},"ArticleData":{"properties":{"title":{"type":"string","title":"Title","description":"文章标题"},"content":{"type":"string","title":"Content","description":"文章 HTML 正文（保留原始排版）"},"plain_content":{"type":"string","title":"Plain Content","description":"纯文本正文（去除所有 HTML 标签，适合直接阅读或 AI 处理）","default":""},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"文章内图片 URL 列表"},"author":{"type":"string","title":"Author","description":"作者","default":""},"publish_time":{"type":"integer","title":"Publish Time","description":"发布时间戳（秒）","default":0},"publish_time_str":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish Time Str","description":"可读发布时间，如 2026-02-24 09:00:00"}},"type":"object","required":["title","content"],"title":"ArticleData","description":"文章数据"},"ArticleRequest":{"properties":{"url":{"type":"string","title":"Url","description":"微信文章链接，如 https://mp.weixin.qq.com/s/xxxxx"}},"type":"object","required":["url"],"title":"ArticleRequest","description":"文章请求"},"ArticleResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"是否成功"},"data":{"anyOf":[{"$ref":"#/components/schemas/ArticleData"},{"type":"null"}],"description":"文章数据，失败时为 null"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"错误信息，成功时为 null"}},"type":"object","required":["success"],"title":"ArticleResponse","description":"文章响应"},"ArticleRetentionRequest":{"properties":{"days":{"type":"integer","title":"Days","description":"保留天数：0=全部（永久），其余见允许集合","default":0}},"type":"object","title":"ArticleRetentionRequest","description":"文章保留天数请求体；days ∈ {0,3,7,14,30,180,365}，0=全部/永久。"},"ArticlesResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"ArticlesResponse","description":"文章列表响应"},"BatchSubscribeRequest":{"properties":{"lines":{"items":{},"type":"array","title":"Lines","description":"公众号名称列表，每行一个"}},"type":"object","title":"BatchSubscribeRequest"},"CleanRequest":{"properties":{"account_id":{"type":"integer","title":"Account Id"}},"type":"object","required":["account_id"],"title":"CleanRequest"},"CreateCategoryRequest":{"properties":{"name":{"type":"string","maxLength":50,"minLength":1,"title":"Name","description":"分类名称"},"description":{"type":"string","maxLength":200,"title":"Description","description":"分类描述","default":""},"color":{"type":"string","title":"Color","description":"颜色: blue, green, red, purple, orange, gray","default":"blue"}},"type":"object","required":["name"],"title":"CreateCategoryRequest"},"DraftSave":{"properties":{"account_id":{"type":"integer","title":"Account Id"},"title":{"type":"string","title":"Title","default":""},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Title"},"cleaned_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cleaned Content"},"header_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Html","default":""},"footer_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Html","default":""},"publish_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish Mode","default":"manual"}},"type":"object","required":["account_id"],"title":"DraftSave"},"DraftUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"header_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Html"},"cleaned_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cleaned Content"},"footer_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Html"},"netdisk_links":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Netdisk Links"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Title"}},"type":"object","title":"DraftUpdate"},"FetchHistoryRequest":{"properties":{"fakeid":{"type":"string","title":"Fakeid","description":"公众号ID"},"count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Count","description":"获取数量，1-100篇","default":1}},"type":"object","required":["fakeid"],"title":"FetchHistoryRequest"},"FetchHistoryResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"fetched_count":{"type":"integer","title":"Fetched Count","default":0},"new_count":{"type":"integer","title":"New Count","default":0}},"type":"object","required":["success","message"],"title":"FetchHistoryResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginRequest":{"properties":{"token":{"type":"string","title":"Token"},"cookie":{"type":"string","title":"Cookie"},"fakeid":{"type":"string","title":"Fakeid"},"nickname":{"type":"string","title":"Nickname"},"expire_time":{"type":"integer","title":"Expire Time"}},"type":"object","required":["token","cookie","fakeid","nickname","expire_time"],"title":"LoginRequest","description":"手动登录请求模型"},"LoginResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"LoginResponse","description":"登录响应模型"},"PollLimitPutRequest":{"properties":{"value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value"},"per_account":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Per Account"}},"type":"object","title":"PollLimitPutRequest","description":"部分更新请求体。value 与 per_account 至少其一，缺失字段不改动。"},"PollScheduleRequest":{"properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","default":"daily"},"hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hour","default":9},"minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minute","default":0},"weekday":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekday","default":0},"interval_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval Hours","default":1},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":false}},"type":"object","title":"PollScheduleRequest","description":"定时轮询规则请求体（字段均可缺省，未传则使用默认/已存值）。"},"PollerStatusResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data","default":{}}},"type":"object","required":["success"],"title":"PollerStatusResponse"},"SaveCookieRequest":{"properties":{"cookie":{"type":"string","title":"Cookie","description":"用户从浏览器复制的完整 Cookie 头值"},"token":{"type":"string","title":"Token","description":"书签脚本/capture 页上传令牌（WEREAD_COOKIE_UPLOAD_TOKEN）；可省略以兼容现有手动页","default":""},"force":{"type":"boolean","title":"Force","description":"强制覆盖（跳过残缺 Cookie 写保护，用于用户主动更新）","default":false}},"type":"object","required":["cookie"],"title":"SaveCookieRequest","description":"保存 cookie 请求体。"},"SearchResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"SearchResponse","description":"搜索响应模型"},"SetCategoryRequest":{"properties":{"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id","description":"分类ID，null表示取消分类"}},"type":"object","title":"SetCategoryRequest"},"StatsResponse":{"properties":{"rate_limit":{"additionalProperties":true,"type":"object","title":"Rate Limit"}},"type":"object","required":["rate_limit"],"title":"StatsResponse","description":"统计响应","example":{"rate_limit":{"active_ips":2,"article_requests":3,"global_limit":10,"global_requests":5}}},"StatusResponse":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated"},"loggedIn":{"type":"boolean","title":"Loggedin"},"account":{"type":"string","title":"Account"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname","default":""},"fakeid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fakeid","default":""},"expireTime":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiretime","default":0},"isExpired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isexpired","default":false},"status":{"type":"string","title":"Status"},"reachable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reachable","default":true},"sessionChecked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sessionchecked","default":false}},"type":"object","required":["authenticated","loggedIn","account","status"],"title":"StatusResponse","description":"状态响应模型"},"SubscribeRequest":{"properties":{"fakeid":{"type":"string","title":"Fakeid","description":"公众号 FakeID"},"nickname":{"type":"string","title":"Nickname","description":"公众号名称","default":""},"alias":{"type":"string","title":"Alias","description":"公众号微信号","default":""},"head_img":{"type":"string","title":"Head Img","description":"头像 URL","default":""}},"type":"object","required":["fakeid"],"title":"SubscribeRequest"},"SubscribeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message","default":""},"weread_subscribed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Weread Subscribed"}},"type":"object","required":["success"],"title":"SubscribeResponse"},"SubscriptionListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{},"type":"array","title":"Data","default":[]}},"type":"object","required":["success"],"title":"SubscriptionListResponse"},"TemplateCreate":{"properties":{"account_id":{"type":"integer","title":"Account Id"},"name":{"type":"string","title":"Name"},"header_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Html","default":""},"footer_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Html","default":""},"is_default":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Default","default":0}},"type":"object","required":["account_id","name"],"title":"TemplateCreate"},"TemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"header_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Html"},"footer_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Html"},"is_default":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Default"}},"type":"object","title":"TemplateUpdate"},"UpdateCategoryRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"}},"type":"object","title":"UpdateCategoryRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}