定时AI新闻(二)-AI新闻自动发布

定时AI新闻(二)-AI新闻自动发布
熊猫不是猫定时AI新闻/博客(二)- 实现AI新闻自动发布
背景
续接上一篇博客 定时AI新闻/博客(一)- n8n搭建 ,本篇博客就来实现每日AI新闻(博客)的自动发布。
需求明确
判断今天是不是工作日,如果是工作日,那就从接口获取AI相关的新闻,交给Gemini进行总结汇总,再将内容整理发布到github仓库去,这样子自动触发cloudflare构建部署,博客即可更新。
技术选型
- n8n
- ChinaHolidayAPI - 查询指定日期是否工作日的免费api
- newsapi - 获取新闻
- gnews - 也是获取新闻
- Gemini - 谷歌的大模型,这里用来总结精炼新闻,每天都有一定的免费额度,足够我们实现功能
- Github - 博客代码部署在github上的,发布自然也要经过它,也是由它触发cloudflare的构建部署
前置准备
ChinaHolidayAPI可以直接使用,不用申请参数啥的。
newsapi和gnews都是邮箱注册即可,也有免费的额度使用。
Gemini也是由免费额度的,谷歌账号登录获取一下apikey即可。
这些都是基础操作,这里就不赘述了。
搭建流程
获取是否工作日
添加http请求,ChinaHolidayAPI 的接口不需要验证啥的,也不用带参数,就是获取今天是否是工作日。
添加一个条件判断,通过判断返回内容中的 isHoliday 字段来确定今日是否是工作日。
现在整体的流程如下,下一步就是在 true 分支上继续获取新闻处理:
需要注意的一点是,我们需要做好健壮性的处理,比如这个网络请求报错了怎么办?
在每个n8n的每个流程节点上,都有Settings选项,可以配置该节点的一些特性。
我们可以在On Error选项中,选择 Continue。这样会在该判断报错时,继续执行后续流程。相当于获取是否工作日失败,我都当做今天是工作日来处理。
获取新闻内容
- 请求新闻接口
添加两个http请求节点,分别从newsapi和gnews获取新闻。要从if判断的true结果引出流程。
这两个请求也非常简单,都是GET请求,将你的apikey配置到url中即可。
https://newsapi.org/v2/everything?q=ai&apiKey=xxxx&pageSize=10&page=1 — newspai返回的数据量非常大,100条,设置一下页数和页大小,可以只获取到10条数据。https://gnews.io/api/v4/search?q=ai&lang=en&apikey=xxxx
其中q参数是新闻的类型,我写的是ai,可以根据自己的需要改动即可。
现在手动触发一下工作流,查看两个接口返回的数据格式,方便后续处理。
分别双击运行之后的两个http节点,可以查看接口返回的数据。
- 整理数据
通过观察可以发现(你也可以直接查看它们的文档),两个api的网络请求返回格式几乎一模一样,最终要的就是articles字段,它是一个数组,其中就是所有的新闻详情。
我们需要将两个请求的articles字段进行合并,所以添加一个code节点进行数据合并,但是合并之前,我们要提前取出这两个articles。取出数据使用Edit Field节点。这里要注意是两个Edit Field节点,分别处理两个请求的返回内容。
之后使用code节点,合并两个articles字段,代码如下(不会写可以问ai的):1
2
3
4
5
6
7
8
9
10var result1 = $('Edit Fields').first().json.articles
var result2 = $input.first().json.articles
return [
{
json: {
articles: result2.concat(result1)
}
}
];
整体流程现在如下:
这里提一句:你可能注意到我的截图中,有些节点是紫色的,这是因为,我将该节点的数据(pin)钉住了,pin住的数据会在后续的执行中直接使用,不会进行真的再次请求,这对于我们调试工作流非常有用,特别是需要调用大模型时可以节约费用。
大模型整理新闻内容
搜索节点 AI Agent ,并将Code节点的输出引入到其输入。给其 Chat Model 添加一个模型,我这里使用的是Gemini。
选择你希望使用的模型,我这里使用的是Gemini 2.0 flash,它有免费的额度,足够我使用了。
双击AI Agent节点,进入编辑模式,自定义提示词。
我这里提供一个提示词参考,可以自行编辑修改。
1 | 你是一名AI新闻编辑,负责筛选、翻译和整理最新的AI行业动态,并确保信息清晰、美观地呈现给读者。 |
注意:这里{{ $json.articles.toJsonString() }}必须要转为字符串,就是说必须要加上这个 toJsonString(),因为前面处理出来的articles是个数组,如果直接传入,Gemini并不能拿到新闻内容,所以不能整理出结果。
运行一下,试试Gemini输出的效果,
提交内容到github进行发布
添加一个Github节点,选择 Edit a file 。
编辑github节点,File Path 填写你的博客仓库中提前准备好的AI日报的博客页面文件路径。这里是相对于仓库根目录的相对路径。
File Content 填写你的AI日报内容,我的模板如下:
1 | --- |
我这里做了当日日期的获取 – {{ $item("0").$node["Merge1"].json["formattedDate"] }}{{ $item("1").$node["Merge1"].json["output"] }} - 这里是AI输出的新闻内容,而且是markdown格式,可以直接使用
这两个都需要你替换成你的工作流的节点中的数据引用。根据自己需要修改即可,不要日期也行,而且我在这次示例中并没有实现日期的获取。
至此,就完成了整个工作流,再换个定时触发器,每天定时做更新即可。
总结
这个工作流其实我当初在做的时候也是碰到了很多问题,各种节点使用也不熟悉,翻文档才是王道。有时候,用代码来处理可能更符合程序员的习惯,但是对于其他人来说可能有一些门槛,并不适合。
文章里面有蛮多细节的东西,上一篇博客有讲到,比如添加凭证,添加定时触发,我也就略过没有再去重复了。




























