使用n8n+飞书搭建自动推送新闻机器人

发布时间:2026/6/8 3:06:31

使用n8n+飞书搭建自动推送新闻机器人 运行效果点击查看原文可以跳转到新闻的36氪链接。n8n工作流主要功能实现从36氪上爬取新闻并筛选和AI相关的AI类新闻最终将新闻的结果推送到手机端。工作流搭建与配置定时器设置成定时触发流程可以选择按日/分钟/月/周等等选择范围还是很广的。我设置成了按天每天触发一次时间为上午10点。Http请求节点后面用http请求节点主要是为了抓取36氪的新闻。RSS是一个能让你在一个地方订阅各种感兴趣网站的工具这里网址需要填36氪新闻的RSS订阅网址也就是https://36kr.com/feed节点配置信息如下只需要将method设置为get然后网址url设置成36氪新闻的RSS订阅地址就行啦。可以点击Execute Step去测试一下结果为AI类新闻筛选由于返回的数据有很多篇新闻所以后面加了一个Code节点来从中筛选数据。这里采用关键词匹配也就是如果返回的结果中在title标题、content内容中如果包含AI, 人工智能, 大模型, LLM, GPT, Claude, Gemini,通义千问, 文心一言, 豆包, 讯飞星火, AI Agent,机器学习, 深度学习, 神经网络, NLP, CV, AIGC等词汇就认为是AI类新闻。这些关键词可以根据个人需求再做一些增补。或者再增加一些语义相关的匹配去检索和AI相关的新闻例如词向量的余弦相似度等。代码选择使用JavaScript语言对应的代码如下try { const rssData $input.item.json.data || $input.item.json; if (!rssData) { console.log(RSS数据为空); return []; } function parseAndFilterRSS(xmlString) { const items []; // 提取所有item const itemMatches xmlString.match(/item[^]*[\s\S]*?\/item/gi); if (!itemMatches) { console.log(未找到RSS item); return items; } const aiKeywords [ AI, 人工智能, 大模型, LLM, GPT, Claude, Gemini, 通义千问, 文心一言, 豆包, 讯飞星火, AI Agent, 机器学习, 深度学习, 神经网络, NLP, CV, AIGC ]; const lowerKeywords aiKeywords.map(k k.toLowerCase()); for (const itemXml of itemMatches) { const title (itemXml.match(/title[^]*([\s\S]*?)\/title/) || [])[1] || ; const link (itemXml.match(/link[^]*([\s\S]*?)\/link/) || [])[1] || ; const contentSnippet (itemXml.match(/description[^]*([\s\S]*?)\/description/) || [])[1] || ; const pubDate (itemXml.match(/pubDate[^]*([\s\S]*?)\/pubDate/) || [])[1] || ; const fullText (title contentSnippet).toLowerCase(); const isAiRelated lowerKeywords.some(keyword fullText.includes(keyword)); if (isAiRelated) { items.push({ title: title.trim(), link: link.trim(), contentSnippet: contentSnippet.trim(), pubDate: pubDate.trim() }); } } return items; } const result parseAndFilterRSS(rssData); console.log(AI相关新闻数量, result.length); return result; } catch (e) { console.error(RSS解析/过滤出错, e.message); return []; }配置执行结果如下数据清洗节点因为后面在飞书上想要实现推送并且用户可以点击推送的链接跳转到对应的36氪新闻网址上。而我之前在实现的时候如果不加数据清洗节点则遇到两个问题1飞书的推送有数量限制当短时间一次性推送数量过多时会出现警告语限制。2原来抓取的新闻数据中link链接是类似于![CDATA[https://36kr.com/p/3840996342073604?frss]]这样的数据需要再从中做一下处理才能解析出网页。所以为了解决这两个问题我又加了一个数据清洗节点选择的是code节点然后用JavaScript代码对应代码如下// 拿到输入的所有数据 const items $input.all(); // 定义清洗CDATA的函数修复版 const cleanCdata (str) { if (!str) return ; // 去掉 ![CDATA[ 和 ]] 标签保留内容 return str.replace(/!\[CDATA\[/g, ).replace(/]]/g, ).trim(); }; // 对每一条数据进行清洗 const processed items.map(item { const title cleanCdata(item.json.title); const link cleanCdata(item.json.link); const pubDate item.json.pubDate || 未知时间; return { title, link, pubDate }; }); // 输出前5条 return processed.slice(0, 5);代码对每一条数据进行清洗并且限制输出前5条。执行结果为飞书推送使用webhook来实现飞书的推送。获取webhook的步骤为创建飞书群组2、配置机器人3、获取webhook地址经过上面步骤就可以获得飞书的webhook地址啦。然后在n8n的工作流中加入http request节点。对应配置如下最后这一步body主要是为了设置在飞书群组里面推送的内容样式。例如下面的样式一样式二不同的推送样式主要是在body里面通过JSON代码来修改。分享下我的代码为{ msg_type: interactive, card: { config: { wide_screen_mode: true }, header: { title: { tag: plain_text, content: RSS新闻推送 }, subtitle: { tag: plain_text, content: 最新资讯更新 } }, elements: [ { tag: div, text: { tag: lark_md, content: **{{ ($json.title || 无标题).replace(/!\\[CDATA\\[|\\]\\]/g, ).trim() }}** } }, { tag: div, text: { tag: lark_md, content: 发布时间{{ $json.pubDate || 未知时间 }}\n 来源RSS订阅\n\n [点击查看原文]({{ ($json.link || https://36kr.com).replace(/!\\[CDATA\\[|\\]\\]/g, ).trim() }}) } }, { tag: button, text: { tag: plain_text, content: 打开原文链接 }, type: primary, url: {{ ($json.link || https://36kr.com).replace(/!\\[CDATA\\[|\\]\\]/g, ).trim() }} } ] } }最终点击execute 就可以执行整个工作流啦

相关新闻