用 N8N + Qwen 打造自己的 AI 新闻聚合器和每日AI科技日报 - 知识铺
本文介绍如何使用 N8N 打造自己的新闻聚合器:
-
• 构建自己的新闻源
-
• 抓取新闻
-
• 按照格式整理新闻
-
• 使用存储
-
• 飞书通知
-
• 企微通知
-
• 其他通知方式
安装运行
安装运行可以参考官方文档或者我之前的文章:
新闻来源
如果我们有经常阅读的网站,如果没有的话我们可以网上搜一下 RSS 新闻来源
,就会有很多文章分享自己常用的新闻网站。
比如:
大家记住 RSS 地址不是来给我们阅读的,打开是一个 XML,比如这样:
我们选取一些自己喜欢的网站即可,整理记录成如下格式:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/gQQO820rz5VCtmdAQaE0SGpZibIfuKhckg2YZfiaicc0Gf5Of25ZlZtfKI9gAgTcQzV6VGdxo50bicIhTV3yJm3vIhQ3qsUGHWUic/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">[</span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"https://www.theverge.com/rss/index.xml"</span></span><span leaf="">,</span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"https://www.wired.com/feed/rss"</span></span><span leaf="">,</span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"https://techcrunch.com/feed/"</span></span><span leaf=""><br></span><span leaf="">]</span></code>
N8n 流程
设置RSS源
首先新建一个空流程, 添加 Edit Fileds
节点用来记录我们的新闻网站来源,
’ fill=’%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E “null”)
添加 `Edit Fileds` 节点
新增一个字段,
-
• 设置名称为
rss
, -
• 选择类型为
Array
, -
• 值填写我们整理的 RSS 地址集合:
[ "https://www.theverge.com/rss/index.xml", "https://www.wired.com/feed/rss", "https://techcrunch.com/feed/"]
效果如下:
新增字段
点击上面的 Test step
按钮,测试当前流程,
测试当前流程
执行成功可以看到右侧执行成功的标志,以及执行结果。
切分数据
关闭弹窗,再次搜索添加一个 Split out
节点:
搜索添加 `Split out` 节点
Split outSplit out 节点是指多个 RSS 站点拆分,每个站点分别执行后面逻辑。
字段填写上一步命名的 rss
,点击测试查看节点执行结果如下:
填写上一步命名的 `rss` 点击测试
读取新闻
搜索添加 RSS Read
节点,
-
• URL 字段类型选择
Expression
-
• 值填写表达式:
{{ $json.rss }}
`RSS Read` 节点
点击测试,等一会就可以看到新闻结果,等待的时间长短和你的网络以及前面配置的 RSS 站点数量有关:
RSS 结果
可以看到右侧有几十条新闻数据。
设置新闻格式
再添加一个 Edit Fields
字段,只处理我们需要的字段:
-
• 标题
title
->{{ $json.title }}
-
• 内容
content
->{{ $json['content:encodedSnippet'] ?? $json.contentSnippet}}
-
• 时间
date
->{{ $json.isoDate}}
-
• 链接
link
->{{ $json.link }}
只处理我们需要的字段
存储
下面我们添加一个节点来把读取到的文章存储到向量数据库里面。
先搜索 Simple Vector Store
,点击然后选择 Add documents to vector store
添加节点:
-
• 修改节点名称为 存储文章
-
•
Memory key
设置为 news_store_key
接下来设置节点参数,点击 Embedding
搜索 Embeddings OpenAI
添加一个嵌入节点,我们使用阿里云的嵌入模型配置:
-
• Credential 选择上次我们创建的
Qwen
-
• Model 使用 Expression 填写
text-embedding-v3
-
• 选项 Option 填写
1024
-
• 选项 Batch size 填写
10
(阿里云的嵌入批大小要小于10)
Embedding 配置
然后文档处选择 Default data loader
:
进行如下配置:
-
• 加载指定数据:Mode 选择
Load Specific Data
-
• 使用 Markdown 格式数据:
Data
填写:<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/gQQO820rz5VCtmdAQaE0SGpZibIfuKhckg2YZfiaicc0Gf5Of25ZlZtfKI9gAgTcQzV6VGdxo50bicIhTV3yJm3vIhQ3qsUGHWUic/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf=""># {{ $json.title }}</span><span leaf=""><br></span><span leaf="">{{ $json.content }}</span></code>
-
• 添加元数据以便于我们检索
-
• title:
{{ $json.title }}
-
• createDate:
{{ $now.toISO() }}
-
• publishDate:
{{ $json.date }}
-
• link:
{{ $json.link }}
数据加载配置
配置切分器
点击切分器配置选择 Recursive Character Text Splitter
,一篇文章进行一次切片。
配置切分参数:
-
• Chunk Size:
3000
设置 3000 个字符一个片段,当然也可以更大。 -
• Chunk Overlap:
0
设置每个片段都不重叠
测试流程
点击测试来测试当前流程,确保流程执行正确。
使用定时任务
现在我们的流程需要手动执行,下面我们把手动触发改成每天定时触发。
搜索添加一个 Schedule Trigger
:
设置每天晚上执行一次(时间也可以选择固定的时间,比如早上7点30分):
替换掉原来的触发节点就可以了:
设置发送流程
我们接下来配置一个发送流程来发送新闻摘要。
搜索添加一个 Schedule Trigger
,来执行每天给我们发送日报。
我们也可以使用一个流程完成所有的任务,新建流程可以实现读取数据频率和发送通知不同的场景。 比如每个小时查询一次,每天发送一次。或者每天发送一次日报,每周发送一次周报。
设置主题
添加一个 Edit Fields
节点来设置我们关心的主题:
-
• Interests:
AI, technology
-
• Number of news items to include:
15
设置 AI 和技术主题,新闻数量设置成15.
添加 Agent
添加一个 AI Agent
节点,命名为新闻阅读 AI。提示词来源设置为 Define below
, 配置用户提示词如下:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/gQQO820rz5VCtmdAQaE0SGpZibIfuKhckg2YZfiaicc0Gf5Of25ZlZtfKI9gAgTcQzV6VGdxo50bicIhTV3yJm3vIhQ3qsUGHWUic/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">总结最近7天发布最相关的科技新闻。今天是 {{ $now }}</span></code>
配置系统提示词如下:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/gQQO820rz5VCtmdAQaE0SGpZibIfuKhckg2YZfiaicc0Gf5Of25ZlZtfKI9gAgTcQzV6VGdxo50bicIhTV3yJm3vIhQ3qsUGHWUic/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">请用清晰、简洁且易于理解的英语撰写,仿佛是在策划每周的科技新闻通讯。</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">优先考虑与以下主题相关的故事:{{ $json.Interests }}。如果这些主题不存在,请选择本周最具影响力、广泛报道和值得注意的科技事件。</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">对于每个新闻项目:</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf="">-</span></span><span leaf=""> 提供简短的信息摘要(最多 1–3 句话)</span><span leaf=""><br></span><span><span leaf="">-</span></span><span leaf=""> 包括文章标题和直接链接到原始来源</span><span leaf=""><br></span><span><span leaf="">-</span></span><span leaf=""> 避免重复故事</span><span leaf=""><br></span><span><span leaf="">-</span></span><span leaf=""> 包含恰好 {{ $json['Number of news items to include'] }} 个独特的新闻项目</span><span leaf=""><br></span><span><span leaf="">-</span></span><span leaf=""> 保持友好而专业的语气,适合广泛的科技爱好者受众。</span></code>
配置效果可以参考下图:
提示词配置
然后配置 Agent 的 模型和工具(存储可以不配合)。
模型选择 千问:
工具选择 Simple Vector Store
,动作选择 Retrieve Documents (As Tool for AI Agent)
:
配置如下:
-
• Memory Key 填写
news_store_key
和我们前面的 key 保证相同。 -
• Limit 设置为
20
。 -
• 勾选 Include Metadata 允许使用元数据。
整体配置如下:
我们测试一下流程,右侧是Markdown格式的文章摘要输出。
英文网站默认也会是英文摘要,如果我们希望使用中文回答的话,可以简单的在系统提示词里面加上中文回答的指令。
飞书通知
我们可以设置定时每天10点飞书给自己推送当天的新闻。
创意一个飞书机器人,选择头像、颜色,并填写名称和描述,
点击下一步需要记录下 Webhook 地址,后面流程节点备用。
在流程图里面添加一个 HTTP 请求节点:
-
• Method 选择
Post
-
• Header 添加
Content-Type
->application/json
-
• Body 设置 JSON ->
{"msg_type":"text","content":{"text":"{{ $json.output }}"}}
https://open.feishu.cn/open-apis/bot/v2/hook/[4]…
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/gQQO820rz5VCtmdAQaE0SGpZibIfuKhckg2YZfiaicc0Gf5Of25ZlZtfKI9gAgTcQzV6VGdxo50bicIhTV3yJm3vIhQ3qsUGHWUic/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">{</span><span><span leaf="">"msg_type"</span></span><span leaf="">:</span><span><span leaf="">"text"</span></span><span leaf="">,</span><span><span leaf="">"content"</span></span><span leaf="">:</span><span leaf="">{</span><span><span leaf="">"text"</span></span><span leaf="">:</span><span><span leaf="">"{{ $json.output.replaceAll('\n','\\n') }}"</span></span><span leaf="">}</span><span leaf="">}</span></code>
消息发送的效果如下:
为了更美观的展示 Markdown 我们可以使用交互卡片来美化样式,
Body 替换成如下内容即可:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/gQQO820rz5VCtmdAQaE0SGpZibIfuKhckg2YZfiaicc0Gf5Of25ZlZtfKI9gAgTcQzV6VGdxo50bicIhTV3yJm3vIhQ3qsUGHWUic/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"msg_type"</span></span><span leaf="">:</span><span><span leaf="">"interactive"</span></span><span leaf="">,</span><span leaf=""><br></span><span><span leaf="">"card"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"schema"</span></span><span leaf="">:</span><span><span leaf="">"2.0"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"config"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"update_multi"</span></span><span leaf="">:</span><span><span><span leaf="">true</span></span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"style"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"text_size"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"normal_v2"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"default"</span></span><span leaf="">:</span><span><span leaf="">"normal"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"pc"</span></span><span leaf="">:</span><span><span leaf="">"normal"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"mobile"</span></span><span leaf="">:</span><span><span leaf="">"heading"</span></span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"body"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"direction"</span></span><span leaf="">:</span><span><span leaf="">"vertical"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"padding"</span></span><span leaf="">:</span><span><span leaf="">"12px 12px 12px 12px"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"elements"</span></span><span leaf="">:</span><span leaf="">[</span><span leaf=""><br></span><span leaf=""> </span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"tag"</span></span><span leaf="">:</span><span><span leaf="">"markdown"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"content"</span></span><span leaf="">:</span><span><span leaf="">"{{ $json.output.replaceAll('\n','\\n') }}"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"text_align"</span></span><span leaf="">:</span><span><span leaf="">"left"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"text_size"</span></span><span leaf="">:</span><span><span leaf="">"normal_v2"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"margin"</span></span><span leaf="">:</span><span><span leaf="">"0px 0px 0px 0px"</span></span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf=""><br></span><span leaf=""> </span><span leaf="">]</span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"header"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"title"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"tag"</span></span><span leaf="">:</span><span><span leaf="">"plain_text"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"content"</span></span><span leaf="">:</span><span><span leaf="">"AI News"</span></span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"subtitle"</span></span><span leaf="">:</span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"tag"</span></span><span leaf="">:</span><span><span leaf="">"plain_text"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"content"</span></span><span leaf="">:</span><span><span leaf="">""</span></span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"template"</span></span><span leaf="">:</span><span><span leaf="">"blue"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"padding"</span></span><span leaf="">:</span><span><span leaf="">"12px 12px 12px 12px"</span></span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf=""><br></span><span leaf="">}</span><span leaf=""><br></span><span leaf="">}</span></code>
企业微信通知
企业微信的通知也类似,创建一个机器人,
请求的 URL 地址改成机器人的地址:
内容使用如下内容:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/gQQO820rz5VCtmdAQaE0SGpZibIfuKhckg2YZfiaicc0Gf5Of25ZlZtfKI9gAgTcQzV6VGdxo50bicIhTV3yJm3vIhQ3qsUGHWUic/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"msgtype"</span></span><span leaf="">:</span><span leaf=""> </span><span><span leaf="">"markdown"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"markdown"</span></span><span leaf="">:</span><span leaf=""> </span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"content"</span></span><span leaf="">:</span><span leaf=""> </span><span><span leaf="">"{{ $json.output.replaceAll('\n','\\n') }}"</span></span><span leaf=""><br></span><span leaf=""> </span><span leaf="">}</span><span leaf=""><br></span><span leaf="">}</span></code>
推送效果如下:
’ fill=’%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E “null”)
企业微信的消息推送有长度限制,过长的消息会推送失败,我们可以通过 substring
来截取,比如 {{ $json.output.replaceAll('\n','\\n').substring(500) }}
其他通知方式
除了企微、飞书 IM 通知,我们还有很多别的方式保存新闻和通知方式。
使用 Convert to file
保存为文件:
’ fill=’%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E “null”)
使用各种邮件工具发送邮件给自己:
’ fill=’%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E “null”)
保存到 Notion 上:
’ fill=’%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E “null”)
保存到数据库:
’ fill=’%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E “null”)
社区节点
如果内置节点里面没有你希望的,先不着急自己做,n8n 还有大量的社区插件可用。
比如:https://github.com/restyler/awesome-n8n[6] 项目上就列出了近百个流行的插件节点:
’ fill=’%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E “null”)
引用链接
[1]
RSS Source: https://rss-source.com/programming
[2]
Github top-rss-list: https://github.com/weekend-project-space/top-rss-list
[3]
知乎网友推荐: https://www.zhihu.com/question/19580096
[4]
: https://open.feishu.cn/open-apis/bot/v2/hook/
[5]
: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=
[6]
: https://github.com/restyler/awesome-n8n
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/ai/post/202510/%E7%94%A8-N8N-+-Qwen-%E6%89%93%E9%80%A0%E8%87%AA%E5%B7%B1%E7%9A%84-AI-%E6%96%B0%E9%97%BB%E8%81%9A%E5%90%88%E5%99%A8%E5%92%8C%E6%AF%8F%E6%97%A5AI%E7%A7%91%E6%8A%80%E6%97%A5%E6%8A%A5/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com