wechat-fetcher
抓取微信公众号文章并转换为 Markdown 格式。 支持模拟微信 iPhone 客户端请求头绕过反爬,自动重试机制,提取标题/作者/发布时间/正文内容。 支持 CLI 和 Web 界面使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
抓取微信公众号文章并转换为 Markdown 格式。 支持模拟微信 iPhone 客户端请求头绕过反爬,自动重试机制,提取标题/作者/发布时间/正文内容。 支持 CLI 和 Web 界面使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
将 Markdown 内容转换为微信公众号兼容的 HTML 格式。 支持内联 CSS 样式、多种主题(airbnb/apple/binance/claude/coinbase/mastercard/notion/opencode.ai/pinterest/shopify/spacex/stripe/vercel)、智能配图和代码高亮。 同时支持对现有 HTML 进行排版优化(统一样式 + 微信兼容性修复)。 可自动分析内容选择合适的模板和主题,支持 Unsplash API 获取配图。
将 HTML 富文本文章发布到微信公众号草稿箱。 支持多种封面图片获取方式(自动提取/Unsplash 搜索/AI 生成/指定 URL),自动处理封面上传并获取 media_id。
将本地图片上传到 Cloudinary,获取永久 HTTP 链接,用于替换文章中的本地图片引用。 支持单张图片上传、从文章提取图片、目录扫描三种模式,自动替换图片引用。
| name | wechat-fetcher |
| description | 抓取微信公众号文章并转换为 Markdown 格式。 支持模拟微信 iPhone 客户端请求头绕过反爬,自动重试机制,提取标题/作者/发布时间/正文内容。 支持 CLI 和 Web 界面使用。 |
| allowed-tools | ["Read","Write","Edit","Grep","Glob"] |
| metadata | {"trigger":"抓取公众号文章、公众号文章转 Markdown、微信文章下载"} |
抓取微信公众号文章并转换为 Markdown 格式,支持 CLI 和 Web 界面使用。
解决微信公众号文章无法直接访问的问题,通过模拟微信客户端请求头绕过反爬机制,提取文章内容保存为可编辑的 Markdown 格式。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 微信公众号文章 URL (mp.weixin.qq.com) |
| output | string | 否 | 输出目录,默认 ./markdowns |
| html | boolean | 否 | 是否同时保存原始 HTML,默认 false |
{YYYY-MM-DD}_{文章标题}.md当用户请求抓取微信公众号文章时,AI 应执行以下步骤:
确保是 mp.weixin.qq.com 域名,否则返回错误提示。
使用模拟微信 iPhone 客户端的请求头:
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.30
Referer: https://mp.weixin.qq.com/
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
自动跟随 301/302 跳转。
从 HTML 中解析文章信息,按优先级提取:
标题提取(按优先级):
<h1 class="rich_media_title"><h1> 标签<meta property="og:title"><title> 标签内容提取(按优先级):
<div id="js_content"><div class="rich_media_content">作者提取(按优先级):
<a id="js_name"><span class="profile_nickname"><meta name="author">日期提取(按优先级):
<em id="publish_time"><span class="publish_time"><meta name="publish_time">将 HTML 转换为 Markdown 格式:
| HTML 元素 | Markdown 转换 |
|---|---|
<h1> - <h4> | # - #### |
<p> | 段落 + 空行 |
<br> | \n |
<strong>, <b> | **text** |
<em>, <i> | *text* |
<img> |  |
<a> | [text](url) |
<code> | `code` |
<pre> | code block |
<ul>, <li> | - item |
<ol>, <li> | 1. item |
写入指定目录,文件名格式:{YYYY-MM-DD}_{文章标题}.md。
| 错误场景 | 处理方式 |
|---|---|
| URL 格式错误 | 返回错误提示,要求 mp.weixin.qq.com 域名 |
| 文章已删除 | 提示"文章可能已被删除或需要登录" |
| 请求超时 | 自动重试,最多 3 次 |
| 网络错误 | 自动重试,指数退避 |
| 内容提取失败 | 返回具体错误信息 |
# 基本用法
npm run fetch-wechat -- -u "https://mp.weixin.qq.com/s/xxx"
# 指定输出目录
npm run fetch-wechat -- -u "https://mp.weixin.qq.com/s/xxx" -o ./articles
# 同时保存原始 HTML
npm run fetch-wechat -- -u "https://mp.weixin.qq.com/s/xxx" --html
# 启动 Web 服务
npm run web
# 访问 http://localhost:3000/editor
# 点击"抓取公众号文章"按钮,粘贴链接即可
import {
fetchWeChatArticle,
extractArticleTitle,
extractArticleContent,
extractAuthor,
extractPublishDate
} from './utils/fetcher';
// 抓取文章
const html = await fetchWeChatArticle('https://mp.weixin.qq.com/s/xxx');
// 提取信息
const title = extractArticleTitle(html);
const content = extractArticleContent(html);
const author = extractAuthor(html);
const date = extractPublishDate(html);
抓取微信公众号文章。
Request Body:
{
"url": "https://mp.weixin.qq.com/s/xxx",
"save": true
}
Response:
{
"success": true,
"title": "文章标题",
"author": "作者名",
"publishDate": "2024-01-15T00:00:00.000Z",
"content": "# 文章标题\n\nMarkdown 内容...",
"savedFile": "2024-01-15_文章标题.md"
}
src/utils/fetcher.ts - 核心抓取模块src/index.ts - CLI 命令注册src/web/server.ts - Web API 和界面$ npm run fetch-wechat -- -u "https://mp.weixin.qq.com/s/kBI_ArHIVAJCRWR4tgET9g"
正在抓取文章...
URL: https://mp.weixin.qq.com/s/kBI_ArHIVAJCRWR4tgET9g
✅ 抓取成功!
📰 标题: 示例文章标题
✍️ 作者: 公众号名称
📅 日期: 2024/1/15
📝 Markdown 已保存: ./markdowns/2024-01-15_示例文章标题.md
💡 提示: 使用 --html 参数可同时保存原始HTML文件
import { fetchWeChatArticle, extractArticleTitle } from './utils/fetcher';
async function main() {
const url = 'https://mp.weixin.qq.com/s/xxx';
try {
const html = await fetchWeChatArticle(url, {
timeout: 30000,
retries: 3
});
const title = extractArticleTitle(html);
console.log(`文章标题: ${title}`);
} catch (error) {
console.error('抓取失败:', error.message);
}
}
npm run webhttp://localhost:3000/editor{ timeout: 60000 }