dify案例分享-Dify+RSS 聚合 8 大平台实时热点,新闻获取效率飙升 300%

1.前言

RSS(Really Simple Syndication)是一种基于XML的网络内容分发格式,主要用于将新闻、博客、论坛等频繁更新的内容以订阅的方式提供给用户。它允许用户通过RSS阅读器(或聚合器)在一个界面中跟踪多个网站的更新,而无需手动访问每个网站。

热点新闻是指在特定时间段内,受到公众广泛关注和讨论的新闻事件或话题。这些新闻通常具有时效性、影响力和传播性,能够引发社会的广泛关注和讨论。热点新闻不仅反映了当前社会的热点问题,也体现了公众的兴趣和关注点。

在当今信息化浪潮席卷的时代,海量媒体资讯如潮水般每日涌来。然而,受制于有限的时间与精力,人们往往更倾向于聚焦两类信息:一类是与自身兴趣深度契合的个性化新闻,另一类则是当下全网热议的焦点事件。在此背景下,能否快速、精准地捕捉实时热点资讯,成为现代人高效获取信息、把握时代脉搏的关键所在。

之前也给大家介绍过dify案例分享-deepseek-V3加持AI资讯每日新闻+语音播报工作流

不过之前的案例是通过爬虫方式实现最新的新闻获取,时效性不够,另外新闻覆盖的内容也不全面。今天给大家介绍使用RSS多平台新闻聚合结合dify实现一个多平台实时获取最新新闻资讯的工作流。

工作流效果如下:

生成的效果如下:

那么这样的工作流是如何制作的呢?话不多说下面给大家手把手搭建这样的工作流。

2.工作流的制作

我们在dify工作台上,新建空白应用

我们先拆解下这个工作流,这个工作流主要是有开始、条件分支、rookie_rss(第三方插件)、代码执行、变量聚合器、系统时间(第三插件)、llm大语言模型、直接回复等。

其中本次工作流用到了一个新的第三方组件,名字叫做rookie_rss。我们首先介绍一下rookie_rss安装使用。

rookie_rss安装

我们在dify的 插件市场中查找名称"rookie_rss"

搜索到这个插件后,点击" 安装" 按钮完成插件的安装。

安装完成后,我们可以在我们已经安装的插件列表中查询到

rookie_rss 授权

插件安装完成后,我们打开rookie_rss 点击""授权" 按钮

这里默认弹出每日热榜的RSS接口,我们点击保存就可以了

保存按钮提交后,我们就可以看到这个组件授权成功。(可以访问上面热榜URL)

接下来我们回到工作流,创建开始节点。

开始

这个开始节点我们这里设置一个type 类型,为了方便用户输入我们这里设置下拉选型。

这里我们提供 掘金、bilibili、ac_fun、微博、今日头条、36kr、虎嗅、hellogithub 热点新闻提供用户选择。

(新浪微博需要登录,这里主要注意,知乎测试返回不了数据,我们直接从工作流中删除)

上面我们就完成了开始节点的配置。

条件分支

这个条件分支也不难, 主要就是根据前面 type类型进行判断。 我们这里也是根据上面掘金、bilibili、ac_fun、微博、今日头条、36kr、虎嗅、hellogithub进行判断,下面的一张图就能看的明白了。

rookie_rss

这个rookie_rss我们需要从工作流画布中添加。

这里我们需要拖拽出多个节点。 这个组件有2个参数,第一个是 平台的名称,组件提供下拉选项提供用户选择。

第二个参数是 获取信息的数量。我这里填写 5条新闻。

rookie_rss 返回的生成数据如下(方便大家理解和调试)

json 复制代码
{
  "text": "",
  "files": [],
  "json": [
    {
      "articles": [
        {
          "author": null,
          "hot_score": 43139928,
          "id": "7512959589315346468",
          "links": {
            "mobile": "https://api.toutiaoapi.com/feoffline/amos_land/new/html/main/index.html?topic_id=7512959589315346468",
            "pc": "https://www.toutiao.com/trending/7512959589315346468/"
          },
          "metadata": {
            "list_type": "热榜",
            "platform": "toutiao",
            "update_time": "2025-06-09T09:40:06.916Z"
          },
          "rank": 1,
          "title": "两办印发重磅民生文件"
        },
        {
          "author": null,
          "hot_score": 39034620,
          "id": "7513402802211717129",
          "links": {
            "mobile": "https://api.toutiaoapi.com/feoffline/amos_land/new/html/main/index.html?topic_id=7513402802211717129",
            "pc": "https://www.toutiao.com/trending/7513402802211717129/"
          },
          "metadata": {
            "list_type": "热榜",
            "platform": "toutiao",
            "update_time": "2025-06-09T09:40:06.916Z"
          },
          "rank": 2,
          "title": "马斯克的"星链"卫星大批坠落"
        }
      ],
      "code": 200,
      "pagination": {
        "returned": 2,
        "total": 2
      },
      "status": "success"
    }
  ]
}

代码执行

这个代码执行也是多个,主要是通过代码的方式处理一下rookie_rss 数据返回。

输入参数 arg1 其中对应的值是一个数组对象

输出变量 result, 返回类型是string

中间处理的代码如下:

ini 复制代码
import json
from datetime import datetime, timezone, timedelta
​
def main(arg1: str) -> dict:
    try:
        # 如果已经是 dict 或 list,直接用,不再 loads
        if isinstance(arg1, (dict, list)):
            parsed_data = arg1
        else:
            parsed_data = json.loads(arg1)
        
        # 后续逻辑保持不变
        if isinstance(parsed_data, dict) and "arg1" in parsed_data:
            data = parsed_data["arg1"]
        else:
            data = parsed_data
        
        articles = []
        if isinstance(data, list):
            for item in data:
                articles.extend(item.get("articles", []))
        elif isinstance(data, dict):
            articles = data.get("articles", [])
            
        table = []
        
        # 添加表头
        table.append(["标题", "热门评分", "新闻链接-手机端", "新闻链接-PC端", "更新时间"])
        
        for item in articles:
            title = item.get('title', '')
            hot_score = item.get('hot_score', '')
            mobile_link = item.get('links', {}).get('mobile', '')
            pc_link = item.get('links', {}).get('pc', '')
            update_time_raw = item.get('metadata', {}).get('update_time', '')
            
            update_time = ''
            if update_time_raw:
                try:
                    # 先尝试按 ISO8601 带毫秒Z格式解析
                    dt_utc = datetime.strptime(update_time_raw, "%Y-%m-%dT%H:%M:%S.%fZ")
                    dt_utc = dt_utc.replace(tzinfo=timezone.utc)
                    # 转换为上海时间(UTC+8)
                    shanghai_tz = timezone(timedelta(hours=8))
                    dt_shanghai = dt_utc.astimezone(shanghai_tz)
                    update_time = dt_shanghai.strftime("%Y-%m-%d %H:%M:%S")
                except Exception:
                    try:
                        # 不带毫秒的ISO8601格式
                        dt_utc = datetime.strptime(update_time_raw, "%Y-%m-%dT%H:%M:%SZ")
                        dt_utc = dt_utc.replace(tzinfo=timezone.utc)
                        shanghai_tz = timezone(timedelta(hours=8))
                        dt_shanghai = dt_utc.astimezone(shanghai_tz)
                        update_time = dt_shanghai.strftime("%Y-%m-%d %H:%M:%S")
                    except Exception:
                        try:
                            # 如果是时间戳(秒级或毫秒级)
                            ts = int(update_time_raw)
                            if len(str(update_time_raw)) == 13:
                                ts = ts / 1000
                            dt = datetime.fromtimestamp(ts, tz=timezone.utc)
                            dt_shanghai = dt.astimezone(timezone(timedelta(hours=8)))
                            update_time = dt_shanghai.strftime("%Y-%m-%d %H:%M:%S")
                        except Exception:
                            # 直接使用原始字符串
                            update_time = str(update_time_raw)
            
            table.append([title, hot_score, mobile_link, pc_link, update_time])
​
        return {
            "result": str(table).replace("'", '"')
        }
    except Exception as e:
        return {
            "result": [["错误", f"{type(e).__name__}: {e}"]]
        }

变量聚合器

变量聚合器的目的主要是把代码处理后的同类型返回结果聚合到一个输出。这里我们定义多个输入变量。这些输入变量都是代码执行对应返回。

这个地方配置需要仔细,否自返回的数据会出现错乱。其他的节点和上面图类似,这里就不做详细展开了。

获取当前时间

这个组件主要目的是在最后直接回复的时候方便输出当前生成的热点新闻执行时间。

时间格式 %Y-%m-%d %H:%M:%S

市区:亚洲/上海

LLM大语言模型

这里我们使用一个文本大语言模型对前面代码处理返回的数组数据进行转换,让返回的数据转出markdown格式的数据。

模型这里我们使用阿里百炼平台提供的deepseek-v3

系统提示词:

bash 复制代码
 请将输出的表格{{#1749458027152.output#}}转换成markdown表格输出

直接回复

直接回复这里我们使用3个参数拼接起来。

第一个是开始节点用户输入的 type .第二个参数 获取当前系统时间。 第三个参数就是LLM大语言模型返回的markdown格式数据

以上我们就完成了工作流的搭建。

3.验证及测试

我们制作好的工作流可以在工作流平台上验证测试一下,点击右上角"预览"按钮。

聊天窗口中随便输入消息触发工作执行。

生成表格后,点击新闻链接 打开对应的新闻详细信息。

体验地址

工作流地址:dify.duckcloud.fun/chat/qW4sBC...备用地址(http://14.103.204.132/chat/qW4sBC02JNmiailX

4.总结

今天主要带大家了解并实现了使用 RSS 多平台新闻聚合结合 Dify 搭建实时获取最新新闻资讯工作流的方案。该工作流的搭建涉及多个关键步骤:开始节点配置、条件分支判断、rookie_rss 插件的安装与使用、代码执行处理数据、变量聚合器聚合结果、获取当前时间、LLM 大语言模型转换数据格式以及直接回复展示最终结果。通过整合这些工作流节点和工具,该方案不仅解决了之前通过爬虫获取新闻时效性不够、内容覆盖不全面的问题,还能够让用户在一个界面中快速、精准地获取多个平台的实时热点新闻资讯。

感兴趣的小伙伴可以按照本文步骤去尝试搭建自己的多平台实时获取最新新闻资讯的工作流。今天的分享就到这里结束了,我们下一篇文章见。

关注「 wwzhouhui」公众号,点赞分享这篇文章,后台私信:"dsl" 领取dsl工作流文件

相关推荐
前端大卫2 小时前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘2 小时前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare2 小时前
浅浅看一下设计模式
前端
Lee川2 小时前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix3 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人3 小时前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl3 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人3 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼3 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端