1. 项目概述:一个能自动“喂”内容的WordPress机器人
如果你运营着一个资讯类、博客类或者需要持续更新的网站,最头疼的事情之一可能就是“内容从哪里来”。每天手动找新闻、写摘要、配图、发布,这活儿既枯燥又耗时。今天要聊的这个开源项目tankeito/Publish-Mate(在OpenClaw生态里也叫auto-publisher),就是来解决这个痛点的。它本质上是一个自动化内容发布管道,能帮你从全球多个新闻源抓取内容,自动生成带特色图片的文章,并一键发布到你的WordPress网站(或其他支持的自定义CMS)上。
简单来说,你可以把它理解为一个24小时待命的“内容助理”。你只需要配置好新闻源(比如BBC、纽约时报的RSS,或者通过NewsAPI获取特定分类的新闻),设定好每天发布的数量、文章分类和标签,它就能在后台自动运行。对于个人站长、小型媒体团队或者需要维护多个内容频道的运营者来说,这能极大地解放生产力,把精力从重复劳动中转移到内容策划和深度创作上。它的核心价值在于“聚合”与“自动化”,将信息获取、内容加工和发布上线这三个环节串联起来,形成一条流畅的流水线。
2. 核心设计思路与架构解析
2.1 为什么选择“管道式”设计?
这个项目的设计哲学非常清晰:模块化管道。整个流程被拆解为三个核心且独立的模块:fetch_news.py(抓取新闻)、fetch_image.py(获取配图)、publish.py(发布文章)。这种设计的好处显而易见。
首先,高内聚低耦合。每个模块只负责一件事,并且做好。新闻抓取模块不关心图片怎么来,发布模块也不关心新闻内容是如何生成的。这意味着你可以轻易地替换其中任何一个环节。比如,你觉得默认的图片搜索API不够好,完全可以自己写一个模块,接入更强大的图库,而无需改动其他部分的代码。
其次,易于调试和扩展。当流程出错时,你可以清晰地定位问题发生在哪个“管道”阶段。是新闻源失效了?还是图片下载超时?或者是WordPress的API密钥不对?模块化的日志也会按阶段记录,排查起来非常方便。从扩展性上讲,如果你想增加对“Medium”或“Ghost”等平台的支持,理论上只需要实现一个新的发布模块,并修改主流程的调度逻辑即可。
最后,支持“预览”模式。这正是得益于模块化。preview命令实际上就是执行了前两个模块(抓取和生成),但跳过了最终的发布模块,将生成的文章内容和图片链接展示给你看,让你在正式发布前有个最终把关的机会。
2.2 多新闻源适配:从RSS到自定义API
项目支持三种新闻源类型,这覆盖了绝大多数场景,也是其灵活性的体现。
RSS源:这是最通用、最古老也最稳定的方式。几乎所有的新闻网站、博客都提供RSS输出。配置简单,无需API密钥,直接填入URL即可。项目内置了BBC和纽约时报的示例,但你可以添加任何你感兴趣的RSS源,比如科技媒体的、行业博客的。它的工作原理是定期请求这个XML格式的链接,解析出最新的文章条目。
NewsAPI:这是一个聚合了全球上万家新闻源的服务。它的优势在于可以按分类(如商业、科技、娱乐)、按国家/地区进行筛选,获取的内容更加结构化、干净。缺点是免费额度有限,并且需要注册获取API Key。对于需要更精准内容筛选的场景,NewsAPI是更好的选择。
自定义API:这是留给高级用户的“后门”。也许你公司内部有一个内容管理系统,或者你偏爱某个小众但高质量的新闻聚合器,只要它提供了HTTP API接口,你都可以通过配置
field_mapping,将接口返回的JSON字段映射到项目内部需要的title,content,link等字段上。这几乎实现了无限的内容源扩展能力。
注意:在实际使用中,我建议优先使用RSS源,因为它最稳定、无成本。将NewsAPI作为补充,用于获取特定领域的新闻。自定义API则用于整合内部或特殊资源。同时,务必为每个源设置合理的
max_items(如3-5条),避免单次运行抓取过多内容,导致发布节奏失控或API调用超限。
2.3 安全与配置管理策略
这是我非常欣赏这个项目的一点:它对安全性的考虑很到位。所有敏感信息,如WordPress的应用密码、各类API的密钥,都强制通过环境变量(Environment Variables)来管理,而不是写在明文的配置文件config.json里。
为什么这么做?假设你把API密钥直接写在config.json里,然后不小心把这个文件上传到了GitHub等公开仓库,你的密钥就瞬间暴露了,可能导致未经授权的API调用产生高额费用,或者网站被恶意发布内容。通过环境变量,敏感信息只存在于运行这台机器或容器环境中,配置文件里只存放非敏感的站点URL、用户名等。
具体到WordPress,它使用了“应用密码”而非你的登录密码。你可以在Word后台为用户生成一个专属密码,这个密码仅用于API调用。即使这个密码泄露,你也可以随时单独撤销它,而不影响你的主账户密码,安全性更高。
在配置管理上,项目提供了两种方式:交互式的setup.sh向导和手动的config.example.json模板复制修改。对于新手,强烈推荐使用向导,它能一步步引导你完成基本设置。对于老手,直接修改JSON配置文件效率更高。配置文件本身的结构也很清晰,分为了platform(平台设置)、publishing(发布设置)、images(图片设置)、news_sources(新闻源)等大块,一目了然。
3. 从零开始的详细配置与实操指南
3.1 基础环境搭建与项目部署
这个项目运行在OpenClaw框架下,OpenClaw可以理解为一个执行自动化任务(Skill)的机器人平台。因此,第一步是确保你有一个可用的OpenClaw环境。如果你还没有,需要先根据OpenClaw的官方文档进行安装。
部署auto-publisher有两种方式:
方式一:通过OpenClaw Skills命令安装(推荐)这是最快捷的方式,OpenClaw会自动处理依赖和技能注册。
openclaw skills install auto-publisher执行后,技能相关的文件会被下载到~/.openclaw/skills/auto-publisher/目录下。
方式二:手动克隆仓库如果你需要研究代码或进行二次开发,可以选择手动克隆。
git clone https://github.com/tankeito/Publish-Mate.git ~/.openclaw/skills/auto-publisher手动克隆后,可能需要你检查并安装Python依赖(通常项目根目录会有requirements.txt)。
无论哪种方式,安装完成后,你都可以通过openclaw或直接在技能目录下运行相关命令来操作它。
3.2 核心配置项逐项详解
运行bash ~/.openclaw/skills/auto-publisher/setup.sh启动交互式配置向导,或直接编辑config.json。我们来深入看看几个关键配置项:
platform平台配置:
url: 你的WordPress站点地址。务必填写完整地址,包括https://。例如https://www.yourblog.com。程序会自动尝试拼接出REST API端点(通常是/wp-json/wp/v2)。username: 用于发布文章的WordPress用户名。这个用户需要有“作者”或以上权限,才能创建文章。
publishing发布策略配置:
posts_per_day:这是控制发布节奏最重要的参数。它不表示“每24小时发布数”,而是指“每次运行/auto-publisher命令时,最多发布多少篇文章”。如果你通过cron job设置每天运行2次,每次设为3,那么理论上每天最多发布6篇。建议从较小的数字开始,比如2-3,观察内容质量后再调整。language: 内容语言。虽然项目示例是zh,但主要影响的是向Unsplash等图库搜索图片时的关键词语言。新闻内容本身由源站决定。status: 文章状态。publish是直接发布。对于内容质量要求高的场景,可以设置为draft(草稿)或pending(待审核),这样生成的文章会先进入后台,由你人工审核后再发布。categories,tags: 为所有自动发布的文章设置统一的分类和标签。你可以设置多个,例如["科技新闻", "转载"]。这有助于网站的内容管理。
images图片配置:
source: 图片搜索的优先级顺序。它是一个数组,例如[“unsplash”, “pexels”, “rss”]。程序会按顺序尝试,直到成功获取一张图片作为文章特色图像。rss表示回退到新闻原文中自带的图片。download_timeout和upload_timeout: 网络超时设置。如果你的服务器网络环境较差,或者图库API响应慢,可以适当调大这些值(单位:秒),避免因超时导致整个流程失败。
news_sources新闻源配置:这是项目的“心脏”。配置是一个JSON数组,每个元素是一个新闻源对象。你需要根据类型填写不同参数。例如,同时配置一个RSS源和一个NewsAPI源:
"news_sources": [ { "type": "rss", "url": "https://rsshub.app/bbc/news", "name": "BBC News", "max_items": 3 }, { "type": "newsapi", "category": "technology", "country": "us", "api_key_env": "NEWS_API_KEY", "max_items": 2 } ]这里我用了rsshub.app的BBC源作为示例,它是一个强大的RSS生成工具,可以获取很多网站的RSS。max_items要谨慎设置,所有新闻源的max_items加起来最好略大于你设置的posts_per_day,以保证有足够内容可供筛选,又不会请求过多数据。
3.3 环境变量设置(安全关键步骤)
如前所述,所有密码、密钥都通过环境变量设置。有几种方式:
1. 临时设置(当前终端会话有效):
export WP_APP_PASSWORD='xxxx xxxx xxxx xxxx' export NEWS_API_KEY='your_newsapi_key_here'2. 永久设置(推荐):写入OpenClaw配置文件编辑~/.openclaw/openclaw.json,在对应技能配置中添加env字段:
{ "skills": { "entries": { "auto-publisher": { "enabled": true, "env": { "WP_APP_PASSWORD": "xxxx xxxx xxxx xxxx", "NEWS_API_KEY": "your_newsapi_key_here", "UNSPLASH_ACCESS_KEY": "your_unsplash_key_here" } } } } }这样设置后,每次OpenClaw启动该技能时,都会自动注入这些环境变量,最安全方便。
3. 使用.env文件(如果项目支持):有些部署方式支持在项目根目录创建.env文件(但根据项目文档,它更推荐方式2)。务必确保.env文件被加入.gitignore,避免提交。
实操心得:我强烈推荐使用第2种方式(OpenClaw配置)。首先,它和OpenClaw框架深度集成,管理集中。其次,当你需要迁移服务器或重建环境时,只需要备份这一个
openclaw.json文件,所有技能的密钥就都在了。最后,它的优先级明确,避免因系统环境变量冲突导致的问题。
4. 工作流程深度拆解与模块协作
4.1 一次完整的发布生命周期
当你执行/auto-publisher publish命令时,幕后发生了一系列有序的协作:
初始化与加载:主脚本
auto_publish.py启动,加载config.json配置,并读取必要的环境变量。它会检查关键配置(如WordPress URL)是否有效。新闻抓取阶段:
fetch_news.py模块被调用。它遍历config.json中news_sources数组里的每一个源。- 对于RSS源,它使用
feedparser库解析XML,提取标题、原文链接、摘要或全文内容、发布时间。 - 对于NewsAPI源,它构造请求URL,带上API Key,请求JSON数据,并解析返回的文章列表。
- 对于自定义API,它根据配置的URL、请求头和字段映射,获取并转换数据。
- 所有抓取到的文章条目会被收集到一个大列表里。然后,程序会查询本地的“已发布记录”(通常是一个JSON文件或小数据库),根据文章链接或标题进行去重,过滤掉已经发布过的内容。
- 对于RSS源,它使用
内容生成与图片匹配阶段:经过去重和数量筛选(根据
posts_per_day)后,对每一篇待发布的文章:- 内容模板化:程序会读取
templates/目录下的模板文件(如default.md)。模板中通常包含像{{ title }}、{{ content }}、{{ source_link }}这样的占位符。程序会用真实的新闻数据替换这些占位符,生成最终的Markdown或HTML格式的文章正文。你可以修改这些模板来定制文章的样式,比如在开头加上“【转载】”,在结尾加上原文链接和免责声明。 - 图片搜索:
fetch_image.py模块开始工作。它首先尝试用文章的标题或关键词,按照images.source配置的顺序去搜索图片。例如,先调用Unsplash API,如果没找到合适的或API出错,就降级调用Pexels API。如果所有图库都失败,最后尝试从RSS条目自带的媒体信息中提取一张图片。下载的图片会临时保存在本地。
- 内容模板化:程序会读取
发布上传阶段:
publish.py模块接管。- 它首先使用配置的用户名和应用密码,向WordPress的REST API (
/wp-json/wp/v2/posts) 发起认证请求,获取访问令牌。 - 然后,它分两步操作:先上传图片。将临时图片文件通过Media接口上传到WordPress媒体库,成功后WordPress会返回一个图片的ID。再创建文章。构造一个POST请求,包含标题、正文(使用上一步生成的HTML)、分类、标签、状态,以及最关键的特征图片ID,发送到创建文章接口。
- 如果发布成功,程序会将这篇文章的标题、链接和发布时间记录到本地的“历史记录”中,用于未来的去重。
- 它首先使用配置的用户名和应用密码,向WordPress的REST API (
收尾与日志:整个过程的关键步骤和结果(成功或失败)都会被记录到
logs/目录下的文件中。无论成功与否,临时下载的图片文件都会被清理,确保不占用额外磁盘空间。
4.2 图片获取策略与优化
图片是文章的门面,自动获取图片的成败和效果直接影响发布质量。项目提供了多层降级策略,理解这个策略对配置优化很重要。
首选:专业图库API (Unsplash, Pexels, Pixabay)
- 优点:图片质量高、版权清晰(通常是免费商用许可)、与关键词匹配度相对较好。
- 缺点:需要API Key(虽然有免费额度),且搜索结果是“相关”而非“精确”。用新闻标题去搜,可能返回一张意境图而非新闻现场图。
- 技巧:你可以修改
fetch_image.py中的搜索逻辑。默认可能直接用文章标题搜索。更好的做法是,先从新闻内容中提取出几个核心实体名词(如地名、人物、事件),用这些词的组合进行搜索,命中率会更高。这需要一些简单的自然语言处理,但对于技术博客来说,可以作为一个改进点。
次选:RSS源内嵌媒体
- 优点:绝对相关,是新闻原配图片。
- 缺点:不是所有RSS都包含高质量图片链接,有些可能只是小图标或logo。且可能存在版权风险,直接使用需谨慎。
- 实操:在配置RSS源时,可以优先选择那些在
<media:content>或<enclosure>标签中提供大图的源。BBC、Reuters的RSS通常做得不错。
保底:本地默认或纯文字
- 如果以上所有方式都失败,可以配置一个本地默认图片的URL,或者干脆不发特色图片。文章依然可以发布,只是没有头图。
注意事项:关于图片版权,这是自动化内容聚合必须严肃对待的问题。即使使用了Unsplash等免费图库,也最好在文章末尾或图片说明处,按照其要求标注摄影师信息。对于RSS内的图片,最稳妥的方式是只将其用作“参考”,或者发布时注明图片来源并链接回原文,避免直接的版权纠纷。在
config.json中,你可以通过images.attribution_text类似的配置项(如果项目支持)来添加统一的版权说明。
4.3 模板系统的灵活运用
项目自带的templates/default.md可能比较简单。但模板系统是你个性化输出内容的强大工具。你可以创建多个模板,并在配置中指定,甚至可以根据新闻源的不同动态选择模板。
一个增强版的模板可能长这样:
## {{ title }} > 本文内容由自动化程序从 **{{ source_name }}** 采集并整理,仅供参考。 {{ content }} --- **原文链接**: [点击查看]({{ source_link }}) *版权声明:本文转载自外部媒体,所有权利归原作者所有。本站发布此文仅供信息分享,不构成任何投资或行动建议。*在这个模板中,{{ source_name }}对应新闻源配置中的name字段。你还可以在模板中使用简单的条件判断(如果项目使用的模板引擎支持,如Jinja2),来实现更复杂的逻辑,比如当内容过长时自动插入“”标记。
关键点:模板最终生成的内容,会被转换成HTML再发送给WordPress。确保你的Markdown语法是WordPress支持的,或者模板直接使用HTML编写,以获得最精确的格式控制。
5. 高级技巧、常见问题与故障排查
5.1 提升内容相关性与质量的技巧
自动化发布容易导致内容生硬、图片文不对题。以下是几个提升质量的实战技巧:
新闻源精选与清洗:不要贪多。选择3-5个与你网站主题高度相关、内容质量稳定的新闻源。对于RSS源,可以先用阅读器订阅一段时间,观察其更新频率和内容质量。对于NewsAPI,充分利用其
category和q(关键词查询)参数进行过滤。后处理脚本:项目本身可能只提供基础的模板替换。你可以在主流程 (
auto_publish.py) 中,内容生成之后、发布之前,插入一个自己的“后处理”函数。这个函数可以:- 摘要重写:调用一个AI摘要API(如国内大模型的API),将冗长的新闻原文重写成一段简洁流畅的摘要。
- 关键词提取:自动从内容中提取关键词,并将其设置为文章的标签(Tags),而不是使用配置里固定的全局标签。
- 敏感词过滤:根据你的需要,对标题和内容进行简单的关键词过滤。
人工审核流程:将
publishing.status设置为draft。让程序自动生成草稿。然后你每天花10分钟登录WordPress后台,快速浏览一下草稿列表,进行标题微调、图片替换或内容删减,再手动发布。这样实现了“机器采集,人工把关”的半自动化流程,质量和可控性最高。
5.2 部署与自动化调度
项目安装好后,你需要让它定时运行。OpenClaw本身可能提供了调度功能。如果没有,最经典的方式是使用Linux系统的Cron Job。
编辑Crontab:
crontab -e添加定时任务:例如,每天上午9点和下午5点各运行一次。
0 9,17 * * * cd /home/your_user/.openclaw && /usr/bin/openclaw skills run auto-publisher 2>&1 >> /home/your_user/auto_publisher.log0 9,17 * * *表示在每天的第0分钟(整点)的9点和17点执行。cd /home/your_user/.openclaw确保在正确的目录下执行,因为技能路径是相对的。/usr/bin/openclaw是openclaw命令的绝对路径(用which openclaw命令查找)。skills run auto-publisher是运行技能的命令。2>&1 >> /home/your_user/auto_publisher.log将标准输出和错误输出都重定向到一个日志文件,方便后续查看。
使用Systemd Timer(更现代的管理方式):对于Linux系统,可以创建一个systemd service和timer单元文件,实现更可靠的守护进程和定时任务管理,能更好地处理日志、失败重启等。
5.3 常见问题与解决方案速查表
在实际运行中,你可能会遇到以下问题。这里提供一个快速排查指南:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 运行命令无反应或报“技能未找到” | 1. 技能未正确安装。 2. OpenClaw环境变量或路径问题。 | 1. 确认~/.openclaw/skills/auto-publisher/目录存在。2. 尝试在技能目录下直接运行 python scripts/auto_publish.py --preview测试核心功能。3. 检查OpenClaw版本和技能兼容性。 |
| 新闻抓取失败,日志显示连接超时或拒绝 | 1. 新闻源URL错误或失效。 2. 服务器网络无法访问外网。 3. RSS源需要特殊处理(如反爬)。 | 1. 用curl或浏览器手动访问配置的RSS/API URL,测试连通性。2. 检查服务器防火墙和网络设置。 3. 对于某些源,可能需要添加User-Agent请求头,可在自定义API配置中实现。 |
| WordPress发布失败,返回“401未授权” | 1. 应用密码错误或已撤销。 2. WordPress站点URL错误。 3. 用户名错误。 | 1.重点检查:在WordPress后台重新生成应用密码,并更新环境变量WP_APP_PASSWORD。注意密码中的空格要保留。2. 确认站点URL能正常访问,且REST API端点可用(访问 https://yoursite.com/wp-json/看是否有JSON返回)。3. 确认用户名拼写正确,区分大小写。 |
| 发布失败,返回“403禁止访问” | 对应用户权限不足。 | 登录WordPress,确保该用户角色至少是“作者”(Author),拥有发布文章的权限。 |
| 图片上传失败 | 1. 图片URL无法下载。 2. WordPress媒体库上传权限或空间问题。 3. 图片文件太大或格式不受支持。 | 1. 查看日志中图片下载的具体错误信息。 2. 检查WordPress对应用户是否有上传文件权限。 3. 可以在 fetch_image.py中增加图片大小检查和压缩逻辑,或配置images.source优先使用提供标准尺寸的图库API。 |
| 文章重复发布 | 去重功能失效。 | 1. 检查data/目录下的历史记录文件(如published.json)是否存在且可写。2. 去重是基于链接或标题的,如果新闻源提供的链接每次不同(如带时间戳参数),可能导致去重失败。可以考虑基于标题哈希值进行去重。 |
| 内容乱码或格式错乱 | 1. 编码问题。 2. 模板或新闻源内容包含特殊HTML/标记。 | 1. 确保config.json和模板文件保存为UTF-8编码。2. 在 fetch_news.py中,对抓取的内容进行HTML标签清理和编码转换(如使用html2text库将HTML转为干净的Markdown)。3. 检查WordPress的文章编辑器是否支持你发布的格式(古腾堡编辑器对原始HTML支持较好)。 |
一个深度避坑技巧:关于网络问题,尤其是在国内服务器部署时,访问境外新闻源和图库API可能会非常慢甚至超时。除了调整timeout参数,有两个思路:一是使用代理,但这需要你修改Python代码中requests库的会话设置,为其配置代理;二是寻找替代源,例如使用国内媒体的RSS,以及国内可访问的免费图库API(如果项目支持或你自行扩展)。这往往是部署阶段最大的挑战,需要根据实际网络环境进行适配和测试。
这个项目提供了一个非常扎实的自动化内容发布框架。它的价值不在于开箱即用的完美,而在于其清晰的结构和良好的可扩展性,让你能够基于它,打造出一个完全贴合自己网站需求和内容风格的自动化工具。从配置好第一个新闻源,看到第一篇自动发布的文章出现在你的网站上开始,那种效率提升的成就感,就是对这个工具最好的肯定。