在实际业务中经常需要把微信公众号文章转为可复用、可检索、可二次渲染的内容。无论是做知识库归档、离线阅读还是为内部编辑器提供素材手动复制粘贴往往丢失排版和图片效率也很低。微信文章转存 API 提供了一种程序化方案输入文章链接返回 Markdown/纯文本正文、图片资源列表和基础元信息。本文不讨论商业价值只从接口使用角度说明如何正确接入这个能力。适用场景先从使用场景出发判断这个接口是否适合你的项目。内容归档与知识库建设把公众号文章转为 Markdown 后存入 Git 仓库或文档系统保留标题、作者、公众号名、发布时间便于全文检索。离线阅读与转存将正文和图片批量下载到本地生成离线可读的 HTML 或 PDF。内容迁移与数据清洗从公众号迁移到自有平台时需要统一格式或者需要从多篇文章中提取正文做 NLP 预处理。监控与通知定时扫描某个公众号的更新发现新文章后触发后续流程接口返回的publish_time可用于判断文章时效。这些场景的共同点是需要“结构化”而非“截图式”的文章数据。接口直接输出 Markdown 和纯文本省去了自己解析 HTML 的工作。接口能力边界在使用前要明确接口能做什么、不能做什么。根据接口文档输入微信公众号文章链接mp.weixin.qq.com/s/...格式。输出Markdown/纯文本内容、图片资源列表、文章元信息标题、作者、公众号名称、发布时间。额外能力下载正文中的图片资源每个图片对象包含 URL 和大小字节数。不承诺的能力以文档为准不保证所有公众号文章都能成功抓取部分文章可能因访问限制或反爬策略而失败。不提供 PDF 转换、评论抓取或阅读量/点赞量统计响应中read_num、like_num可能为null。调用次数限制、并发限制等无公开承诺只能确认单接口 QPS 为 1/s即每秒最多请求一次。接口的限速是工程设计中必须考虑的因素。如果业务需要批量处理不能直接 for 循环并发请求必须做限流。请求参数与鉴权接口地址POST https://v1.apizero.cn/api/wechat-archive请求体为 JSON 对象字段定义如下参数类型必填说明urlstring是微信公众号文章链接例如https://mp.weixin.qq.com/s/hy31xZK6FH3H51qh1zeSKAformatstring否输出格式markdown/text/both默认按文档实现timeoutnumber否超时秒数示例为20鉴权通过 Header 传递。事实卡中标注的 Header 参数为Authorization而接口文档给出的 curl 示例使用的是X-API-Key。两者在实际调用中可能存在版本差异建议以文档页为准并在代码中做成可配置项方便同时支持两种 header 名。curl 接入示例下面是一个完整的 curl 调用使用接口文档中的鉴权方式curl -sS \ -X POST \ -H X-API-Key: $APIZERO_API_KEY \ -H Content-Type: application/json \ -d {url: https://mp.weixin.qq.com/s/hy31xZK6FH3H51qh1zeSKA, format: both, timeout: 20} \ https://v1.apizero.cn/api/wechat-archive注意$APIZERO_API_KEY需要替换为你自己的密钥。如果你使用的网关版本要求Authorization: Bearer token则把X-API-Key行替换为对应的 header。返回示例成功时{ code: 0, data: { content: { markdown: # 文章标题\n\n正文..., text: 文章标题\n\n正文... }, images: [ { size_bytes: 45000, url: https://mmbiz.qpic.cn/... } ], meta: { account_name: 公众号名, author: 作者名, like_num: null, publish_time: 2026-05-01T10:00:0008:00, read_num: null, title: GitHub史上最快破10万星项目来了 } }, msg: 成功, request_id: req_abc123 }响应字段解读响应最外层是标准信封结构code、msg、request_id和data。其中request_id是请求的唯一标识排查问题时应记录下来。data内部分为三块contentmarkdownMarkdown 格式正文适合直接存储到文档型数据库中。text纯文本正文适合全文索引如 Elasticsearch、SQLite FTS。注意当请求format只指定一种格式时另一个字段可能不存在或为空代码要做好空值处理。images数组每个元素包含url图片的绝对地址通常是mmbiz.qpic.cn域名。size_bytes图片大小字节。可用于下载前判断资源是否过大。这里的图片列表是正文中引用的图片资源需要自己发起下载。下载时建议携带合适的 User-Agent并设置超时和重试机制。meta文章元信息title文章标题。author作者名。account_name公众号名称。publish_time发布时间ISO 8601 格式带时区偏移如08:00。read_num/like_num阅读数和点赞数当前可能为null不能假设一定返回数字。常见错误处理以下错误是接入中较常遇到的处理策略如下1. 401 / 403 鉴权失败检查 API Key 是否正确、是否过期。确认 header 名称是X-API-Key还是Authorization以文档页为准如果两个都可能先用 curl 手动验证。2. 400 参数错误url必须是完整的https://mp.weixin.qq.com/...链接不能只给文章 ID。format取值范围限制在markdown、text、both传其他值应视为参数错误。timeout是数字类型示例中为字符串20只是 JSON 序列化示例实际应传数字20或按文档要求处理。3. 429 限流接口 QPS 为 1/s超过后可能返回限流错误。应对策略同一文章链接避免在短时间内重复调用。批量任务使用队列设置至少 1.2 秒的请求间隔。对限流错误做指数退避重试但不能无休止重试。4. 5xx 或网络超时微信文章抓取依赖目标站点可用性偶尔会有波动。timeout参数控制的是接口内部抓取超时不是 HTTP 客户端超时HTTP 层也应设置自己的超时如 30 秒。对于失败任务建议把request_id记录到日志便于向服务方反馈。工程化注意事项1. 所有配置外部化API Key、接口地址、超时时间、最大重试次数不要硬编码放在环境变量或配置中心。示例import os import requests API_URL os.getenv(WECHAT_ARCHIVE_API_URL, https://v1.apizero.cn/api/wechat-archive) API_KEY os.getenv(WECHAT_ARCHIVE_API_KEY, ) TIMEOUT int(os.getenv(WECHAT_ARCHIVE_TIMEOUT, 30)) def archive_wechat_article(url: str, fmt: str both) - dict: headers {X-API-Key: API_KEY, Content-Type: application/json} payload {url: url, format: fmt, timeout: 20} resp requests.post(API_URL, jsonpayload, headersheaders, timeoutTIMEOUT) resp.raise_for_status() body resp.json() if body.get(code) ! 0: raise RuntimeError(fAPI error: code{body[code]}, msg{body.get(msg)}, request_id{body.get(request_id)}) return body[data]上面是 Python 示例核心是检查code字段而不是仅依赖 HTTP 状态码。2. 正文与图片的落盘策略拿到markdown后直接写入文件时要注意编码统一为 UTF-8。图片建议按文章 ID 分目录存储文件名用图片 URL 的哈希值避免与微信自带的随机名冲突。示例思路import hashlib from pathlib import Path def save_markdown(article_id: str, markdown_text: str) - Path: out_dir Path(articles) / article_id out_dir.mkdir(parentsTrue, exist_okTrue) md_path out_dir / article.md md_path.write_text(markdown_text, encodingutf-8) return md_path def image_filename(image_url: str) - str: return hashlib.sha1(image_url.encode(utf-8)).hexdigest() .jpg3. 去重与幂等相同文章链接可能在业务中被多次提交。建议在数据库中记录urlpublish_time作为唯一键或者使用request_id做错误重试的去重避免重复下载图片和重复入库。4. 元信息的时间处理publish_time是带时区的 ISO 字符串不要直接当本地时间用。使用 JavaOffsetDateTime、Pythondatetime.fromisoformat或 Gotime.RFC3339解析统一转成 UTC 存储。5. 日志与监控记录每次请求的url、request_id、HTTP 状态码、接口返回码、耗时。当code非 0 或images为空时告警条件要与正常文章无图文章区分开避免误报。6. 重试策略对于 HTTP 429、5xx 以及部分网络超时可以采用“最多 3 次、间隔 1s/2s/4s”的退避策略。但对 400 类参数错误不要重试直接记录业务异常。参考文档接口文档https://apizero.cn/aidocs/wechat-archive原始文档https://apizero.cn/aidocs/wechat-archive/raw.md以上接入要点均基于接口事实卡整理具体鉴权方式、限流数值和错误码定义请以最新文档为准。