我不知道cli是什么,更看不懂命令行。
现在公众号每天早上自动跑完选题、写完文章、排好版、推到草稿箱。我起来看一眼,能发就发。
这事挺神奇的,我新注册这个公众号记录我的学习过程,大博主不都说要learn/build in public嘛
一
我也没学Python。
直接装了Claude Code的终端工具,在里面打字:"帮我搭一个公众号自动运营系统,每天自动选题、写文章、排版、推送草稿箱。"(当然过程迭代了好几个版本,前面还要引导它先做好规划!限于篇幅,就此略过⏭️)
它就开始写代码。
一堆.py文件,我不知道干嘛用的,但跑起来之后,八点半开始执行,九点半多,草稿箱里就有一篇文章了。
后来我才慢慢看懂,那个主文件里有一段是流程编排——
steps = [
("08:30", self.step_01_xhs_collection),
("08:35", self.step_02_multi_platform_collection),
("08:50", self.step_03_keyword_analysis),
("09:00", self.step_04_topic_recommendation),
("09:10", self.step_06_tcmchat_verification),
("09:15", self.step_07_content_creation),
("09:20", self.step_08_layer1_audit),
("09:25", self.step_10_layer3_audit),
("09:33", self.step_12_wenyan_layout),
("09:38", self.step_14_push_draft),
]
一行一行地看,大概能猜出来:采集数据、分析关键词、推荐选题、验证食材、生成文章、审核、排版、推送。像看菜谱,虽然不会做,但知道有哪几道菜。老实讲,我到现在也看不懂每个函数的具体实现,但这不影响我用。
骨架搭出来只用了一个下午。后面填血肉花了好久。
二
选题这件事,一开始我靠猜。
觉得"这个话题应该有人看",写了。阅读量个位数。
后来改了思路——与其猜,不如看别人在看什么。
系统每天从四个地方抓数据:小红书热门标签、微信搜一搜联想词、百度热搜榜、还有几个对标公众号的历史标题。攒到本地,跑一遍TF-IDF分析。
TF-IDF我也是现查的。简单理解就是:一个词如果每篇文章都用,它就不值钱;只有少数文章用的词,反而说明这篇文章有特色。
# 4平台数据加权融合
weighted_keywords = {}
for platform, weight in sources.items():
keywords = analyze_tfidf(platform_data[platform])
for kw, score in keywords.items():
weighted_keywords[kw] = weighted_keywords.get(kw, 0) + score * weight
不同平台权重不一样。小红书高一点,贴近普通人真实兴趣。百度低一点,热搜太泛,什么"某明星离婚"也算,跟养生没关系。
跑出来的关键词按热度排个序,取前五个当备选。有次系统排的TOP1是"入秋后喝什么茶润燥",我之前完全没往这个方向想过。写了,阅读量翻了三倍。你猜怎么着,那篇文章现在还是阅读量最高的。
三
写文章是改得最久的一环。
最开始直接让大模型写,出来之后一眼就能看出来——太规整了。开头引入、正文三段、结尾总结,每段字数差不多,连标点符号都用得一丝不苟。
真人不是这样说话的。
我让AI帮忙想办法。它给了一个思路:做模板轮换,再注入说话风格。
模板轮换好理解,不要每次都一个套路。有时候先抛问题,有时候先讲故事,有时候用对比开头。
说话风格这块,我在代码里维护了一组表达习惯,让AI在文章里随机插入。"我跟你说""这事儿吧""说实话"这类。控制在一个合理的频率范围——太少没感觉,太多像复读机。
def inject_style(text: str) -> str:
replacements = {
"我跟你说啊,": "我跟你说,",
"说实话啊,": "**说实话**,",
}
for variant, exact in replacements.items():
text = text.replace(variant, exact)
if current_count < 14:
needed = min(16 - current_count, 6)
还有一个去AI化的审核环节。文章写完先过一遍词库检测,看有没有"第一""第二""总而言之"这种AI高频词。有的话替换掉,再算一遍AI指数,压到1%以下才放行。
改完之后给朋友看,他问"这是你写的?"我说"AI写的,改过"。他说不太像。那就算过了。
四
审核这套东西,我自己都觉得做得有点过分。
三层。
第一层去AI化,我使用了github开源的humanize- Chinese这个工具,在此基础上做了优化。
第二层是专业度验证。食疗养生方向,食材功效、搭配禁忌不能乱写。系统会把文章内容和中医知识库比对,看有没有硬伤。走的是规则引擎,不调大模型,很快。这其中我找了网上公开的资源库,调取了资源库里的专业论文作为专业度验证的知识库。
第三层调一个大模型做五维评分——
| 维度 | 满分 | 及格线 |
|---|---|---|
| 食疗准确性 | 20 | 16 |
| 可读性 | 20 | 15 |
| 风格一致性 | 20 | 16 |
| 实用性 | 20 | 14 |
| 安全性 | 20 | 18 |
80分及格,差一分都不过。
上线之后大概三成文章第一稿就被打回。大多数是功效描述写过了头,或者搭配上有禁忌没标出来。我给规定的是迭代7轮,如果还不过就停下来。
五
文章过了审核,还得好看。
排版用了个叫wenyan的工具,Markdown转成带CSS的HTML,微信草稿箱能直接用。有五种风格轮换,不会每天长得一样。
封面图是豆包的Seedream生成的。提示词中英文混着写效果好,比如"一碗银耳莲子羹,暖色调,food photography, warm lighting"。
推送这一步代码就几行——
# 推送到微信草稿箱
token_url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APP_ID}&secret={APP_SECRET}"
token = requests.get(token_url).json()["access_token"]
draft_data = {
"articles": [{
"title": title[:10],
"content": html_content,
"thumb_media_id": cover_id
}]
}
requests.post(draft_url, json=draft_data)
看起来简单,坑不少。下面说。
六
IP白名单。微信API要求在后台把服务器IP加到白名单,不然直接拒绝。我第一次推报40164错误,搞了一下午才反应过来。后来配环境第一件事就是加白名单。
replace(variant, exact, 1)。这个bug我找了半天。Python的replace第三个参数是最大替换次数,传1就只换第一个。结果口语化表达只被计数了9次,及格线是10次。差一次,整篇文章被打回。把那个1去掉就好了。
封面水印。AI生成的图本身没问题,我在代码里自作聪明加了个右下角水印,黑底白字,丑到不行。找到那几行删掉了。
两个审核打架。规则审核说口头禅不够,让加;LLM审核说堆砌太多,让减。后来定了个区间:规则管下限,LLM管上限,取中间值。
我是用国产大模型来驱动的Claude,写着写着他说各个环节和板块功能全部写好了,一共1500行代码,我是一点也看不懂,结果我换了一个大模型来review,告诉我漏洞百出,很多内容都是硬编码的,实际上没有审核没有评分,我滴妈,竟然骗我,把我气的半死,如果是个人我早大嘴巴上去了,害得我又搞了几个小时才弄好。
到现在一周过去,这个系统已经迭代到V10了,说到底还是学会运用了mvp原则,最初第一版我写了一天,总想着尽善尽美,各个我能想到的都要让他完善(可能你们会笑话我用不了这么长时间,原谅我是中年小白),晚上困的要死,我说先改到这里,明天继续,结果第二天,我打开电脑,发送了“继续”,他说你在说什么,我们刚开始对话,我X他怎么什么都不记得了!
后来,我才知道这叫上下文溢出,我查了一下后台调用的token,那前一天我调用了100000000的token,你没看错,是亿的单位!竟然没写完,关键还失忆了,我差点把电脑砸了🔨
...总之,自己真正用AI才能学习成长,以前我总爱收藏别人的文章,不去练,现在开始,自己也要学会输出,哪怕是错的,哪怕被别人笑话,哪怕写的没价值,谁不是小白一步步成长起来的呢?相信自己也可以⛽️
从不会梯子到看着黑乎乎的命令行工具,从安装编程agent到跑通全流程,花了两个月。以前以为得先学Python学框架学API、提示词等,现在只要会提要求。
啰嗦的太多,已经接近尾声了,这一篇也算上,也是自动化运营系统的功劳,我只完成了最后在草稿箱里润色修改。
如果有对AI感兴趣的朋友,也在研究学习,欢迎交流。也欢迎评论区大佬批评指导🤝口下留情,谢谢🙏
夜雨聆风