{"id":49458204,"url":"https://github.com/tmwgsicp/wechat-download-api","last_synced_at":"2026-05-03T08:04:18.453Z","repository":{"id":340274542,"uuid":"1164859248","full_name":"tmwgsicp/wechat-download-api","owner":"tmwgsicp","description":"一款完全开源的微信公众号文章获取、 RSS 订阅API服务，支持IP代理池反风控。","archived":false,"fork":false,"pushed_at":"2026-04-22T04:08:36.000Z","size":743,"stargazers_count":540,"open_issues_count":0,"forks_count":46,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-22T06:35:44.689Z","etag":null,"topics":["rss","rss-feed","wechat","wechat-article"],"latest_commit_sha":null,"homepage":"https://wechatrss.waytomaster.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tmwgsicp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-23T15:06:21.000Z","updated_at":"2026-04-22T04:08:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tmwgsicp/wechat-download-api","commit_stats":null,"previous_names":["tmwgsicp/wechat-download-api"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/tmwgsicp/wechat-download-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmwgsicp%2Fwechat-download-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmwgsicp%2Fwechat-download-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmwgsicp%2Fwechat-download-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmwgsicp%2Fwechat-download-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmwgsicp","download_url":"https://codeload.github.com/tmwgsicp/wechat-download-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmwgsicp%2Fwechat-download-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32458237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rss","rss-feed","wechat","wechat-article"],"created_at":"2026-04-30T08:01:37.790Z","updated_at":"2026-04-30T08:01:38.832Z","avatar_url":"https://github.com/tmwgsicp.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# WeChat Download API\n\n### 微信公众号文章获取 \u0026 RSS 订阅服务\n\n**完全开源 | 免费部署 | RSS 订阅 | 文章抓取 | 反风控**\n\n[![GitHub stars](https://img.shields.io/github/stars/tmwgsicp/wechat-download-api?style=for-the-badge\u0026logo=github)](https://github.com/tmwgsicp/wechat-download-api/stargazers)\n[![License](https://img.shields.io/badge/License-AGPL%203.0-blue?style=for-the-badge)](LICENSE)\n[![Docker Pulls](https://img.shields.io/docker/pulls/tmwgsicp/wechat-download-api?style=for-the-badge\u0026logo=docker\u0026logoColor=white)](https://hub.docker.com/r/tmwgsicp/wechat-download-api)\n[![Python](https://img.shields.io/badge/Python-3.8+-3776AB?style=for-the-badge\u0026logo=python\u0026logoColor=white)](https://www.python.org/)\n[![FastAPI](https://img.shields.io/badge/FastAPI-0.104+-009688?style=for-the-badge\u0026logo=fastapi\u0026logoColor=white)](https://fastapi.tiangolo.com/)\n\n\u003e **100% 开源，100% 免费。** 代码完全公开，私有化部署无任何限制，不搞\"开源\"之名行收费之实。\n\n\u003c/div\u003e\n\n---\n\n## 功能特性\n\n- **RSS 订阅** — 订阅任意公众号，自动定时拉取新文章（**包含完整文章内容和图片**），生成标准 RSS 2.0 源，接入 FreshRSS / Feedly 等阅读器即可使用\n- **文章内容获取** — 通过 URL 获取文章完整内容（标题、作者、正文 HTML / 纯文本、图片列表）\n- **反风控体系** — Chrome TLS 指纹模拟 + SOCKS5 代理池轮转 + 三层自动限频，有效对抗微信封控\n- **文章列表 \u0026 搜索** — 获取任意公众号历史文章列表，支持分页和关键词搜索\n- **公众号搜索** — 按名称搜索公众号，获取 FakeID\n- **扫码登录** — 微信公众平台扫码登录，凭证自动保存，4 天有效期\n- **图片代理** — 代理微信 CDN 图片，解决防盗链问题\n- **Webhook 通知** — 登录过期提醒（提前24h/6h预警+已过期通知）、触发验证等事件自动推送（支持企业微信机器人）\n- **API 文档** — 自动生成 Swagger UI / ReDoc，在线调试所有接口\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/dashboard.jpg\" width=\"800\" alt=\"管理面板\"\u003e\n  \u003cp\u003e\u003cem\u003e管理面板 — 登录状态、接口文档、在线测试一站式管理\u003c/em\u003e\u003c/p\u003e\n  \u003cbr\u003e\n  \u003cimg src=\"assets/rss.jpg\" width=\"800\" alt=\"RSS 订阅管理\"\u003e\n  \u003cp\u003e\u003cem\u003eRSS 订阅管理 — 搜索公众号一键订阅，复制地址接入 RSS 阅读器\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## Docker 部署 🐳\n\n**最快速的部署方式**，无需配置 Python 环境，一键启动：\n\n```bash\n# 方式一：使用 docker-compose（推荐）\ngit clone https://github.com/tmwgsicp/wechat-download-api.git\ncd wechat-download-api\ncp env.example .env\n# 编辑 .env 设置 SITE_URL 为实际访问地址\ndocker-compose up -d\n\n# 方式二：直接运行\ndocker run -d \\\n  -p 5000:5000 \\\n  -v $(pwd)/data:/app/data \\\n  -v $(pwd)/.env:/app/.env \\\n  --name wechat-api \\\n  tmwgsicp/wechat-download-api:latest\n```\n\n服务启动后访问 `http://localhost:5000/login.html` 扫码登录即可使用。\n\n**支持多架构**：`linux/amd64` / `linux/arm64`（Apple Silicon、树莓派、ARM 服务器）\n\n---\n\n## SaaS 托管版 — 已上线 🚀\n\n**不想折腾部署？30 秒注册即可使用** 👉 **[wechatrss.waytomaster.com](https://wechatrss.waytomaster.com)**\n\n搜索公众号名称，拿到 RSS 链接，丢进你的阅读器——Feedly、Inoreader、NetNewsWire 全部兼容。\n\n| 套餐 | 公众号数量 | 价格 |\n|------|-----------|------|\n| 免费版 | 2 个 | ¥0 |\n| 基础版 | 20 个 | ¥9.9/月 |\n| 专业版 | 50 个 | ¥19.9/月 |\n\n\u003e 免费版够用就一直免费，不够了再升级，没有套路。\n\n---\n\n## 使用前提\n\n\u003e 本工具需要通过微信公众平台后台的登录凭证来调用接口，因此使用前需要：\n\n1. **拥有一个微信公众号**（订阅号、服务号均可）\n2. 部署并启动服务后，访问登录页面用**公众号管理员微信**扫码登录\n3. 登录成功后凭证自动保存到 `.env` 文件，有效期约 **4 天**，过期后需重新扫码\n\n登录后即可通过 API 获取**任意公众号**的公开文章（不限于自己的公众号）。\n\n\u003e **本地电脑可以直接使用！** 不需要公网服务器——在本地启动服务后通过 `localhost` 访问即可完成扫码登录和全部功能。只有当你需要从其他设备（如手机 RSS 阅读器）远程访问时，才需要公网服务器或内网穿透。\n\n---\n\n## 快速开始\n\n### 方式一：Docker 部署（推荐）\n\n```bash\n# 1. 克隆项目\ngit clone https://github.com/tmwgsicp/wechat-download-api.git\ncd wechat-download-api\n\n# 2. 配置环境变量\ncp env.example .env\n# 编辑 .env，设置 SITE_URL 为实际访问地址（如 http://your-domain.com）\n\n# 3. 启动服务\ndocker-compose up -d\n\n# 4. 查看日志\ndocker-compose logs -f\n```\n\n### 方式二：一键脚本部署\n\n**第一步：克隆项目**\n\n```bash\ngit clone https://github.com/tmwgsicp/wechat-download-api.git\ncd wechat-download-api\n```\n\n**第二步：一键启动**\n\n```bash\nbash start.sh  # Linux/macOS\n# 或\nstart.bat      # Windows\n```\n\n脚本会自动完成环境检查、虚拟环境创建、依赖安装和服务启动。\n\n**第三步：扫码登录**\n\n访问 `http://localhost:5000/login.html`，用**公众号管理员微信**扫码登录。\n\n---\n\n## API 使用\n\n### 访问地址\n\n| 地址 | 说明 |\n|------|------|\n| http://localhost:5000 | 管理面板 |\n| http://localhost:5000/login.html | 扫码登录 |\n| http://localhost:5000/api/docs | Swagger API 文档 |\n| http://localhost:5000/api/health | 健康检查 |\n\n---\n\n## 服务器部署\n\n### Linux 生产环境（systemd）\n\n`start.sh` 脚本在 Linux 上以 `sudo` 运行时，会自动注册 systemd 服务并启用开机自启：\n\n```bash\nsudo bash start.sh\n```\n\n之后可通过以下命令管理服务：\n\n```bash\n# 查看运行状态\nbash status.sh\n\n# 停止服务\nbash stop.sh\n\n# 手动操作\nsudo systemctl restart wechat-download-api\nsudo systemctl status wechat-download-api\n```\n\n### 配置反向代理（可选）\n\n如需通过域名或 HTTPS 访问，配置 Nginx 反向代理到 `localhost:5000`：\n\n```nginx\nserver {\n    listen 80;\n    server_name your-domain.com;\n\n    location / {\n        proxy_pass http://127.0.0.1:5000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    }\n}\n```\n\n### 环境变量\n\n复制 `env.example` 为 `.env` 并按需修改：\n\n```bash\ncp env.example .env\n```\n\n主要配置项参见 `env.example` 中的注释说明。\n\n---\n\n## API 接口\n\n### 获取文章内容\n\n`POST /api/article` — 解析微信公众号文章，返回标题、正文、图片等结构化数据\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `url` | string | 是 | 微信文章链接（`https://mp.weixin.qq.com/s/...`） |\n\n请求示例：\n\n```bash\ncurl -X POST http://localhost:5000/api/article \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\": \"https://mp.weixin.qq.com/s/xxxxx\"}'\n```\n\n返回字段：`title` 标题、`content` HTML 正文、`plain_content` 纯文本正文、`author` 作者、`publish_time` 发布时间戳、`images` 图片列表\n\n### 搜索公众号\n\n`GET /api/public/searchbiz` — 按关键词搜索微信公众号，获取 FakeID\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `query` | string | 是 | 搜索关键词（公众号名称） |\n\n请求示例：\n\n```bash\ncurl \"http://localhost:5000/api/public/searchbiz?query=公众号名称\"\n```\n\n返回字段：`list[]` 公众号列表，每项包含 `fakeid`、`nickname`、`alias`、`round_head_img`\n\n### 获取文章列表\n\n`GET /api/public/articles` — 获取指定公众号的文章列表，支持分页\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `fakeid` | string | 是 | 目标公众号的 FakeID（从搜索接口获取） |\n| `begin` | int | 否 | 偏移量，默认 `0` |\n| `count` | int | 否 | 获取数量，默认 `10`，最大 `100` |\n| `keyword` | string | 否 | 在该公众号内搜索关键词 |\n\n请求示例：\n\n```bash\n# 获取前 50 篇\ncurl \"http://localhost:5000/api/public/articles?fakeid=YOUR_FAKEID\u0026begin=0\u0026count=50\"\n\n# 获取第 51-100 篇\ncurl \"http://localhost:5000/api/public/articles?fakeid=YOUR_FAKEID\u0026begin=50\u0026count=50\"\n```\n\n### 搜索公众号文章\n\n`GET /api/public/articles/search` — 在指定公众号内按关键词搜索文章\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `fakeid` | string | 是 | 目标公众号的 FakeID |\n| `query` | string | 是 | 搜索关键词 |\n| `begin` | int | 否 | 偏移量，默认 `0` |\n| `count` | int | 否 | 获取数量，默认 `10`，最大 `100` |\n\n请求示例：\n\n```bash\ncurl \"http://localhost:5000/api/public/articles/search?fakeid=YOUR_FAKEID\u0026query=关键词\"\n```\n\n### RSS 订阅\n\n`GET /api/rss/{fakeid}` — 获取指定公众号的 RSS 2.0 订阅源\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `fakeid` | string（路径） | 是 | 公众号 FakeID |\n| `limit` | int（查询） | 否 | 返回文章数量上限，默认 `20` |\n\n使用方式：\n\n```bash\n# 1. 搜索公众号获取 fakeid\ncurl \"http://localhost:5000/api/public/searchbiz?query=人民日报\"\n# 返回 fakeid: MzA1MjM1ODk2MA==\n\n# 2. 添加订阅\ncurl -X POST http://localhost:5000/api/rss/subscribe \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"fakeid\": \"MzA1MjM1ODk2MA==\", \"nickname\": \"人民日报\"}'\n\n# 3. 手动触发一次轮询（立即拉取文章）\ncurl -X POST http://localhost:5000/api/rss/poll\n\n# 4. 获取 RSS 源（把这个地址添加到 RSS 阅读器）\ncurl \"http://localhost:5000/api/rss/MzA1MjM1ODk2MA==\"\n```\n\n也可以通过管理面板的 **RSS 订阅** 页面可视化管理，搜索公众号一键订阅并复制 RSS 地址。\n\n\u003e **关于 RSS 内容**: RSS 源包含**完整文章内容**（图文混排），您可以直接在 RSS 阅读器中阅读全文。\n\u003e\n\u003e 系统使用 **SOCKS5 代理池 + Chrome TLS 指纹模拟**技术获取文章内容，有效规避微信风控。\n\u003e\n\u003e 扫码登录后，系统会**自动**将微信凭证用于内容获取，无需手动配置。如需禁用完整内容获取（仅保留标题和摘要），可在 `.env` 中设置 `RSS_FETCH_FULL_CONTENT=false`。\n\n#### RSS 订阅管理接口\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| `POST` | `/api/rss/subscribe` | 添加 RSS 订阅 |\n| `DELETE` | `/api/rss/subscribe/{fakeid}` | 取消 RSS 订阅 |\n| `GET` | `/api/rss/subscriptions` | 获取订阅列表 |\n| `POST` | `/api/rss/poll` | 手动触发轮询 |\n| `GET` | `/api/rss/status` | 轮询器状态 |\n\n### 其他接口\n\n| 方法 | 路径 | 说明 |\n|------|------|------|\n| `GET` | `/api/image?url=IMG_URL` | 图片代理（仅限微信 CDN 域名） |\n| `GET` | `/api/health` | 健康检查 |\n| `GET` | `/api/stats` | 限频统计 |\n| `POST` | `/api/login/session/{id}` | 初始化登录会话 |\n| `GET` | `/api/login/getqrcode` | 获取登录二维码 |\n| `GET` | `/api/login/scan` | 检查扫码状态 |\n| `POST` | `/api/login/bizlogin` | 完成登录 |\n| `GET` | `/api/login/info` | 获取登录信息 |\n| `GET` | `/api/admin/status` | 查询登录状态 |\n| `POST` | `/api/admin/logout` | 退出登录 |\n\n完整的接口文档请访问 http://localhost:5000/api/docs\n\n---\n\n## 配置说明\n\n复制 `env.example` 为 `.env`，登录后凭证会自动保存：\n\n```bash\ncp env.example .env\n```\n\n| 配置项 | 说明 | 默认值 |\n|--------|------|--------|\n| `WECHAT_TOKEN` | 微信 Token（登录后自动填充） | - |\n| `WECHAT_COOKIE` | 微信 Cookie（登录后自动填充） | - |\n| `WECHAT_FAKEID` | 公众号 FakeID（登录后自动填充） | - |\n| `WECHAT_EXPIRE_TIME` | 凭证过期时间（登录后自动填充） | - |\n| `WEBHOOK_URL` | Webhook 通知地址（支持企业微信机器人） | 空 |\n| `WEBHOOK_NOTIFICATION_INTERVAL` | 同一事件通知最小间隔（秒） | 300 |\n| `RATE_LIMIT_GLOBAL` | 全局每分钟请求上限 | 10 |\n| `RATE_LIMIT_PER_IP` | 单 IP 每分钟请求上限 | 5 |\n| `RATE_LIMIT_ARTICLE_INTERVAL` | 文章请求最小间隔（秒） | 3 |\n| `RSS_POLL_INTERVAL` | RSS 轮询间隔（秒） | 3600 |\n| `RSS_FETCH_FULL_CONTENT` | RSS 是否获取完整内容（true/false） | true |\n| `PROXY_URLS` | **SOCKS5 代理池地址（强烈建议配置，避免账号风控）** | 空 |\n| `SITE_URL` | **网站访问地址（用于RSS图片代理，必须配置）** | http://localhost:5000 |\n| `PORT` | 服务端口 | 5000 |\n| `HOST` | 监听地址 | 0.0.0.0 |\n| `DEBUG` | 调试模式（开启热重载） | false |\n\n\u003e **⚠️ 重要**: `SITE_URL` 必须配置为实际访问地址（IP或域名），否则RSS图片无法正常显示。例如：\n\u003e - 本地开发: `http://localhost:5000`\n\u003e - 局域网部署: `http://192.168.1.100:5000`\n\u003e - 公网域名: `https://你的域名.com`\n\n### SOCKS5 代理池配置（⚠️ 强烈建议）\n\n**重要提示**: \n- ⚠️ **启用完整内容获取时，强烈建议配置代理池，避免账号被微信风控**\n- ⚠️ **不配置代理直连微信可能导致：频繁验证、账号限制、IP封禁**\n- ✅ **配置2-3个代理IP可有效分散请求，降低风控风险**\n\n**用途**：获取文章完整内容时分散请求 IP，配合 Chrome TLS 指纹模拟，有效规避微信风控。\n\n\u003e 本项目使用 `curl_cffi` 模拟 Chrome TLS 指纹，请求特征与真实浏览器一致，配合代理池效果更佳。\n\n**方案：多台 VPS 自建 SOCKS5 代理**\n\n准备 2-3 台低价 VPS（各大云厂商轻量应用服务器即可，¥20-30/月/台），每台运行一个 SOCKS5 代理服务。推荐 [gost](https://github.com/go-gost/gost)（Go 语言实现，单二进制文件，无依赖）。\n\n**第一步：在每台 VPS 上安装 gost**\n\n```bash\n# 下载最新版（以 Linux amd64 为例，其他架构请去 GitHub Releases 页面选择）\n# 国外服务器直接下载\nwget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz\n\n# 国内服务器使用加速镜像（任选一个可用的）\nwget https://gh-proxy.com/https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz\n# 或\nwget https://ghproxy.cc/https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz\n\n# 解压并移动到系统路径\ntar -xzf gost_3.2.6_linux_amd64.tar.gz\nmv gost /usr/local/bin/\nchmod +x /usr/local/bin/gost\n\n# 验证安装\ngost -V\n```\n\n**第二步：启动 SOCKS5 代理服务**\n\n```bash\n# 带用户名密码认证（推荐，替换 myuser / mypass 和端口）\ngost -L socks5://myuser:mypass@:1080\n\n# 不带认证（仅内网或已配置防火墙时使用）\ngost -L socks5://:1080\n```\n\n**第三步：配置为 systemd 服务（开机自启）**\n\n```bash\ncat \u003e /etc/systemd/system/gost.service \u003c\u003c 'EOF'\n[Unit]\nDescription=GOST Proxy\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/local/bin/gost -L socks5://myuser:mypass@:1080\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsystemctl daemon-reload\nsystemctl enable gost\nsystemctl start gost\n```\n\n**第四步：开放防火墙端口**\n\n```bash\n# 仅允许你的主服务器 IP 连接（替换为实际 IP）\nufw allow from YOUR_MAIN_SERVER_IP to any port 1080\n\n# 或者如果用的是云厂商安全组，在控制台添加入站规则：\n# 端口 1080 / TCP / 来源 IP 限制为你的主服务器\n```\n\n**第五步：在主服务器 `.env` 中配置代理池**\n\n```bash\nPROXY_URLS=socks5://myuser:mypass@vps1-ip:1080,socks5://myuser:mypass@vps2-ip:1080,socks5://myuser:mypass@vps3-ip:1080\n```\n\n配置后重启服务，每次文章请求会轮流使用不同的代理 IP。可以通过 `GET /api/health` 确认代理池状态。留空则直连（默认行为）。\n\n---\n\n## 项目结构\n\n```\n├── app.py                # FastAPI 主应用\n├── requirements.txt      # Python 依赖\n├── env.example           # 环境变量示例\n├── data/                 # 数据目录（运行时自动创建）\n│   └── rss.db            # RSS 订阅 SQLite 数据库\n├── routes/               # API 路由\n│   ├── article.py        # 文章内容获取\n│   ├── articles.py       # 文章列表\n│   ├── rss.py            # RSS 订阅管理与输出\n│   ├── search.py         # 公众号搜索\n│   ├── login.py          # 扫码登录\n│   ├── admin.py          # 管理接口\n│   ├── image.py          # 图片代理\n│   ├── health.py         # 健康检查\n│   └── stats.py          # 统计信息\n├── utils/                # 工具模块\n│   ├── auth_manager.py   # 认证管理\n│   ├── helpers.py        # HTML 解析\n│   ├── http_client.py    # HTTP 客户端（curl_cffi + 代理池）\n│   ├── proxy_pool.py     # 代理池轮转\n│   ├── rate_limiter.py   # 限频器\n│   ├── rss_store.py      # RSS 数据存储（SQLite）\n│   ├── rss_poller.py     # RSS 后台轮询器\n│   ├── login_reminder.py # 登录过期提醒（主动检测）\n│   ├── content_processor.py  # 内容处理与图片代理\n│   ├── image_proxy.py    # 图片URL代理工具\n│   ├── article_fetcher.py    # 批量并发获取文章\n│   └── webhook.py        # Webhook 通知\n└── static/               # 前端页面（含 RSS 管理）\n```\n\n---\n\n## 内容类型与获取策略\n\n本项目支持多种微信公众号内容类型，包括标准富文本、纯图片文章、图文消息、短内容、音频文章等。\n\n详细说明请查看：**[CONTENT_TYPES.md](CONTENT_TYPES.md)**\n\n**文档内容**：\n- 所有支持的内容类型及 `item_show_type` 值\n- 不可用状态识别（删除、违规、隐私、验证页面等）\n- 反爬策略与代理配置\n- 关键函数说明\n- 开发贡献指南\n\n---\n\n## 常见问题\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e提示\"服务器未登录\"\u003c/b\u003e\u003c/summary\u003e\n\n访问 http://localhost:5000/login.html 扫码登录，凭证会自动保存到 `.env`。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e触发微信风控 / 需要验证\u003c/b\u003e\u003c/summary\u003e\n\n1. 在浏览器中打开提示的文章 URL 完成验证\n2. 等待 30 分钟后重试\n3. 降低请求频率（系统已内置自动限频）\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e如何获取公众号的 FakeID\u003c/b\u003e\u003c/summary\u003e\n\n调用搜索接口：`GET /api/public/searchbiz?query=公众号名称`，从返回结果的 `fakeid` 字段获取。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eToken 多久过期？如何提前知道？\u003c/b\u003e\u003c/summary\u003e\n\nCookie 登录有效期约 4 天，系统会：\n1. 前端显示到期时间（`/api/admin/status` 接口返回 `expireTime` 和 `isExpired` 字段）\n2. **后台每 6 小时主动检测**，提前 24h / 6h 通过 Webhook 预警\n3. 过期后立即通过 Webhook 通知\n\n配置 `WEBHOOK_URL`（支持企业微信群机器人）可收到实时提醒，避免因凭证过期导致 RSS 轮询失败或搜索功能不可用。\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e可以同时登录多个公众号吗\u003c/b\u003e\u003c/summary\u003e\n\n当前版本不支持多账号。建议部署多个实例，每个登录不同公众号。\n\u003c/details\u003e\n\n---\n\n## 技术栈\n\n| 层级 | 技术 |\n|------|------|\n| **Web 框架** | FastAPI |\n| **ASGI 服务器** | Uvicorn |\n| **HTTP 客户端** | curl_cffi（Chrome TLS 指纹）/ HTTPX（降级） |\n| **反风控** | TLS 指纹模拟 + SOCKS5/HTTP 代理池轮转 |\n| **RSS 存储** | SQLite（零配置，数据本地化） |\n| **配置管理** | python-dotenv |\n| **运行环境** | Python 3.8+ |\n\n---\n\n## 开源协议\n\n本项目采用 **AGPL 3.0** 协议开源，**所有功能代码完整公开，私有化部署完全免费**。\n\n| 使用场景 | 是否允许 |\n|---------|---------|\n| 个人学习和研究 | 允许，免费使用 |\n| 企业内部使用 | 允许，免费使用 |\n| 私有化部署 | 允许，免费使用 |\n| 修改后对外提供网络服务 | 需开源修改后的代码 |\n\n详见 [LICENSE](LICENSE) 文件。\n\n### 免责声明\n\n- 本软件按\"原样\"提供，不提供任何形式的担保\n- 本项目仅供学习和研究目的，请遵守微信公众平台相关服务条款\n- 使用者对自己的操作承担全部责任\n- 因使用本软件导致的任何损失，开发者不承担责任\n\n---\n\n## 参与贡献\n\n由于个人精力有限，目前**暂不接受 PR**，但非常欢迎：\n\n- **提交 Issue** — 报告 Bug、提出功能建议\n- **Fork 项目** — 自由修改和定制\n- **Star 支持** — 给项目点 Star，让更多人看到\n\n---\n\n## 联系方式\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"assets/qrcode/wechat.jpg\" width=\"200\"\u003e\u003cbr\u003e\n      \u003cb\u003e个人微信\u003c/b\u003e\u003cbr\u003e\n      \u003cem\u003e技术交流 · 商务合作\u003c/em\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"assets/qrcode/sponsor.jpg\" width=\"200\"\u003e\u003cbr\u003e\n      \u003cb\u003e赞赏支持\u003c/b\u003e\u003cbr\u003e\n      \u003cem\u003e开源不易，感谢支持\u003c/em\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n- **GitHub Issues**: [提交问题](https://github.com/tmwgsicp/wechat-download-api/issues)\n- **邮箱**: creator@waytomaster.com\n- **SaaS 托管版**: [wechatrss.waytomaster.com](https://wechatrss.waytomaster.com)\n\n---\n\n## 致谢\n\n- [FastAPI](https://fastapi.tiangolo.com/) — 高性能 Python Web 框架\n- [curl_cffi](https://github.com/lexiforest/curl_cffi) — 支持浏览器 TLS 指纹模拟的 HTTP 客户端\n- [HTTPX](https://www.python-httpx.org/) — 现代化 HTTP 客户端\n- [gost](https://github.com/go-gost/gost) — 轻量级代理工具\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**如果觉得项目有用，请给个 Star 支持一下！**\n\n[![Star History Chart](https://api.star-history.com/svg?repos=tmwgsicp/wechat-download-api\u0026type=Date)](https://star-history.com/#tmwgsicp/wechat-download-api\u0026Date)\n\nMade with ❤️ by [tmwgsicp](https://github.com/tmwgsicp)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmwgsicp%2Fwechat-download-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmwgsicp%2Fwechat-download-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmwgsicp%2Fwechat-download-api/lists"}