创作灵感
如果你只想了解具体实现步骤,可以直接跳过这部分背景介绍,直接查看后面的实现环节。
最近尝试使用了 Dify,想探索能否自己搭建一个工具流。虽然效果可能不如专业的订阅工具,但可以作为一次实践和探索。因此,我构建了这个使用 Dify 对话获取新闻的流程,欢迎对 Dify 玩法感兴趣的朋友一起交流。
最初我参考了他人编写的代码,但在运行过程中发现其中存在一些函数语法错误,于是决定重新搭建整个流程。
环境
Dify + Docker + Ollama
Ollama 本地模型并非必需,可以省略大模型解读步骤,直接输出结果,或者替换为线上模型。最后我会提供原始文件,只要 Dify 能够正常运行,流程即可顺利执行。
效果
步骤
- 创建一个新空白应用
- 设置用户输入
点击第一步,编辑字段,选择下拉,用户下拉选项选择哪个平台的新闻 - 新建条件分支
点击用户输入的+号。根据用户的选项做不同处理 添加rss路由
点击条件分支的加号,选择工具,找到rssHub订阅(这个在首页-集成-工具里面安装)
填写顶级域名(到.com),再填地址后面的(/../..),获取消息条数
运行看下能不能请求到数据,返回格式基本长这样(如果不长这样也没关系,先拿数据后面再说)
同理在条件分类的else第二个+添加另一个rss订阅,最好改个名字区分一下,点击编辑框自定义路由,填写新名字
联合早报rss地址#https://plink.anyfeeder.com
/zaobao/realtime/china- 代码执行
目的将请求到的数据通过python或JavaScript解析成markdown格式
添加两个变量,代表接收到的两个rss订阅数据,格式选择json,填写python代码,输出变量名字填写下,不填使用默认也可以,后面基本能分辨
python怎么写,将路由执行后的数据复制出来,到Qwen或其他大模型问答里面,输入:帮我编写python函数,这是一段rss新闻数据示例,要求将这段json数据使用python语法转化为markdown形式输出。
这是一个变量的情况,也就是一个rss数据情况,那多个怎么办,需要做判断,再加上有几个数据例如5个rss数据,那就写:帮我编写python函数,有5个变量传入,每个变量是一段rss新闻数据,要求判断这5个变量是否有值,将有值的数据使用python语法转化为markdown形式输出。
我这写2个rss数据为例,多个你就在输入变量那里添加多个变量,arg1,arg2,agr3...,并且改下python代码<pre>import json from datetime import datetimedef main(arg1=None, arg2=None): # 判断参数1是否有效(不为None) if arg1 is not None: data = arg1 # 参数1无效,判断参数2 elif arg2 is not None: data = arg2 # 都无效,赋值空数组 else: data = []
# 1. 若传入字符串,尝试解析为 JSON if isinstance(data, str): try: data = json.loads(data) except json.JSONDecodeError: raise ValueError("输入字符串不是有效的 JSON") # 2. 兼容字典或列表 if isinstance(data, dict): sections = data.get("json", []) elif isinstance(data, list): sections = data else: raise TypeError("输入必须是字典、列表或 JSON 字符串") markdown_lines = [] markdown_lines.append("# 📰 即时新闻精选\n") markdown_lines.append("> 【免责声明】本平台 / 程序仅通过公开 RSS 订阅协议抓取第三方公开资讯标题、摘要、简介,全文版权归属原文作者与发布平台。\n1.所有内容仅用于个人阅览、信息整理、非商用学习参考;\n2.每条内容均标注来源出处与原文直达链接,不私自篡改、转载全文;\n3.若权利人发现内容不当展示,可联系我方,收到通知后 24 小时内下架对应内容。\n我方不享有任何第三方内容著作权,不承担内容侵权连带责任。\n") markdown_lines.append("---\n") for section in sections: section_title = section.get("title", "新闻汇总") markdown_lines.append(f"## 🔹 {section_title}\n") markdown_lines.append(f"*数据源:{section.get('url', '')}*\n") markdown_lines.append("---\n") entries = section.get("entries", []) for idx, entry in enumerate(entries, 1): title = entry.get("title", "无标题") link = entry.get("link", "#") published = entry.get("published", "") content = entry.get("content", "") try: dt = datetime.strptime(published, "%Y-%m-%d %H:%M:%S") time_str = dt.strftime("%Y年%m月%d日 %H:%M") except: time_str = published markdown_lines.append(f"### {idx}. [{title}]({link})\n") markdown_lines.append(f"📅 **发布时间:** {time_str}\n") if content: clean_content = " ".join(content.split()) summary = clean_content[:200] + "..." if len(clean_content) > 200 else clean_content markdown_lines.append(f"📝 {summary}\n") else: markdown_lines.append("📝 *(无内容摘要)*\n") markdown_lines.append("---\n") markdown_lines.append("\n✨ *以上信息由联合早报 RSS 提供,仅供参考。* ✨") markdown_output = "\n".join(markdown_lines) # 3. 返回字典(根据要求可修改键名) return {"markdown": markdown_output}</code></pre>路由执行的数据格式在这里,交给大模型帮你写python转化markdown代码
- 大模型解读
对数据进行分析,(可以忽略,选择直接回复也可以)
提示词如下(第3步内容):你是结构化新闻信息提取助手 输入素材为《即时新闻》RSS 新闻合集,需要逐条拆解新闻,只需对.markdown每项内容进行解读,解读内容50-80字,并将解读内容添加到每项的键:"解读"中 输出时原markdown格式保留,不要省略每项的内容,不要删减内容 最后统一输出markdown格式;试运行看下推理效果
- 直接回复
最后输出。 - 预览效果
随便输入内容,发送
如果格式是这样就基本可以发布了
有用的话帮我点个赞谢谢
end