那天晚上我盯着屏幕,手里是一篇刚发完的公众号文章,3000 多字,配了 6 张图。我想把它发到小红书。

小红书的规矩是 3:4 竖图,一组轮播图,每张 1242×1656。我的文章有标题、有段落、有配图、有引用块——这些东西要一页一页切开,排进竖图里,文字不能被裁,图片不能丢,翻页的地方不能把一句话劈成两半。
我先试了几个现成的工具。
有的只能做金句卡片——一张图配一句大字,不是我要的。我要的是一篇完整的文章被切成多页,读者翻过去像在读一篇被分页的长文,不是在刷一组海报。
有的能把文字排进图里,但排版很粗糙。文字和图片的间距不对,留白的位置不对,看起来像 Word 文档截图。
我不是设计师。我没法打开 Figma 一页一页手动排。就算能排,一篇 3000 字的文章切成十几页,每页调字号、调间距、调图片位置——我试了一次,花了快一个小时,排完觉得还是不好看。
然后我想:要不自己做一个?
1
我要的东西用一句话就能说清楚:
丢一篇文章进去,自动给我切成一组小红书竖图。原文一字不改,图片原样保留,排版干净能读。
不是 AI 生图,不是重写文章,不是金句海报。就是把"在手机上看一篇长文"的体验,搬到小红书的轮播图里。
想清楚这一点之后,我打开 Claude Code,开始跟 AI 说我想要什么。
2
第一个能跑的版本大概花了一个多小时。
我给它一篇公众号的 HTML,它确实切成了十几页竖图。文字有了,排版的骨架也有了。
但图片全没了。
十几页纯文字,白底黑字,像一份打印出来的会议纪要。

问题出在公众号的图片加载方式上。公众号为了省流量,用了一种叫"懒加载"的技术——图片标签里写的不是真实地址,而是一个 1 像素的占位图。真实地址藏在另一个属性里。
我的工具老老实实读了图片标签,看到 1 像素,以为是广告追踪用的小点,直接过滤掉了。
所有图片,一张不剩。
3
修完图片识别的逻辑之后,我再跑一次。
22 张图片全部出现了。
但新问题来了:有些页面的文字只占了上半部分,下面一大片空白。不是故意留白,是切页的时候算错了位置,文字被推到了下一页,当前页就剩半页空。
这个问题折腾了一阵。一开始我以为是字数估算不准,后来发现根本原因是——文字在不同字号、不同行高下占的真实像素是不一样的,靠估算永远有误差。
最后的解决办法是用真浏览器去量。让 Playwright 把每一段文字、每一张图片都渲染出来,量出真实的像素高度,再根据真实高度决定哪些内容放在同一页。
慢了大概 5 秒。但切出来的页面,文字和图片的位置终于对了。
4
公众号文章都有一张封面图——就是你在微信聊天里转发时看到的那张图。
我一开始想:小红书第一页应该有个封面,用公众号的封面图多好。
于是做了一版:第一页是封面图 + 大标题 + 摘要,正文从第二页开始。
跑出来一看,不对。
封面图占了半页,下面的摘要只有两三行,剩下一大片空白。看起来像一个 PPT 的标题页,不像一篇文章的开头。

我跟 AI 说:首页排版下半部分是空白的,体感不好,还不如不要封面图。
删了。
后来又想到一个折中方案:如果公众号有封面图,而且正文里没有用过这张图,就把它当作一张普通配图,放到第一页最上方。不独占一页,不加特殊排版,就是一张图。
这样第一页有点视觉入口,但不破坏文章的阅读节奏。
技术上能做,不代表产品上应该做。
这是整个过程里我最深的一个体会。AI 可以帮我把任何功能实现出来,但"这个功能要不要"是我自己的判断。
5
测试另一篇公众号文章的时候,我发现第二页中间有个奇怪的红点。
就一个点,但它占了一大块空白区域,看起来很突兀。
查了一下,是公众号底部的互动引导——"觉得好看,请点这里 ↓↓↓"。那个红点是一张 GIF 动图,被当成正文图片塞进了小红书图里。
我当时的反应不是"把这个红点过滤掉就行了"。
我问 AI:这种相关的一系列问题,我们会进行处理吗?不单单是这一个点的问题。
这句话把一个 bug 变成了一个系统。
我们梳理了公众号底部常见的噪音类型:
互动引导:"觉得好看""点个在看""点赞""分享"
署名信息:"来源""本期编辑""责编""校对"
关注引导:"扫码关注""长按识别""点击下方名片"
推荐阅读:"推荐阅读""往期回顾""你可能还喜欢"
装饰图片:点赞引导 GIF、二维码附近的小图、分割线
全部过滤掉。
而且每一条被过滤的内容都会被记录下来——是被哪条规则删的、原文是什么、是文字还是图片。不是黑箱操作,是可以回头查的。
6
到这一步,工具已经能吃 Markdown 和 HTML 文件了。但真实使用场景是什么?
我发完一篇公众号,想顺手发小红书。这时候我手里有什么?一条公众号链接。
我不会去后台下载 HTML,不会去整理图片文件夹,不会去导出 Markdown。我就想把链接丢进去,剩下的事工具自己搞定。
AI 跟我说:这个能做,给我一个 URL,我用浏览器打开页面,抓正文、下图片、自动切页。
试了一下,文字抓到了,但图片又没了。
又是公众号的懒加载——浏览器打开页面的时候,图片还没加载出来,抓到的全是占位图。
调了几轮之后,让浏览器等页面加载完再抓,同时识别公众号图片的真实地址,把远程图片全部下载到本地缓存。
再跑一次,内容和图片都有了。
输入
公众号链接
→
yuelu-xhs
→
输出
小红书图文
自动抓取正文 · 自动下载图片 · 自动切页排版 · 自动过滤噪音
一条公众号链接,进去就出一组小红书图文。不需要下载文件,不需要整理素材,不需要任何中间步骤。
这是我觉得整个工具最值钱的功能。我试过的其他工具都没有做到这一点——要么需要你先导出文件,要么只能处理纯文字。而 yuelu-xhs 是直接给链接就行。
7
跑测试的时候偶尔会遇到公众号链接超时。同一条链接,第一次打不开,第二次又好了。
不是代码的问题,是微信服务器偶尔波动。
加了自动重试:最多试 3 次,每次失败关掉浏览器重新开。第 3 次还失败才报错。
这个功能平时没用。但在真实使用的时候,它会默默帮你兜住那些偶发的网络问题。
8
从"我不想手动切图"到"一个能跑的工具",和 AI 一起大概花了 5 小时。

现在它能做的事:
丢一个 Markdown 文件,自动切成小红书竖图
丢一个公众号 HTML,自动提取内容和图片,切成竖图
丢一个公众号链接,自动打开页面、抓取正文、下载图片、切成竖图
图片放不下的整张推到下一页,不裁切
公众号底部的噪音自动过滤
图片下载失败会有占位提示,不会悄悄丢图
每页底部只有"月鹿造物"和页码。不放小红书号——因为小红书 App 自带账号水印,加了就重了。
我把它开源了,叫 yuelu-xhs。
如果你也在运营公众号 + 小红书,每次发完公众号还要手动切图发小红书,可以试试。
GitHub 地址:https://github.com/lunaark/yuelu-xhs
安装两步:
git clone https://github.com/lunaark/yuelu-xhs.git ~/.claude/skills/yuelu-xhs
npm install -g playwright && npx playwright install chromium
用法:
把 xxx.md 排成小红书图文
把 https://mp.weixin.qq.com/s/xxx 排成小红书图文
它不只是 Claude Code 的 Skill——Cursor、Windsurf、Trae、Codex,几乎所有 AI 编程工具都能用。装好之后用自然语言说就行。
现在每次公众号发完,我打一行字,等 5 秒,十几张图就躺在文件夹里了。打开小红书,上传,发布,不到一分钟。
写这篇文章的时候我回想了一下,之前手动切图那一个小时到底在干嘛。
大概是在说服自己"也没那么麻烦"吧。