基于OpenClaw AI Agent构建飞书资讯早报机器人:从原理到实践

发布时间:2026/8/25 1:27:00
基于OpenClaw AI Agent构建飞书资讯早报机器人:从原理到实践 每天早上团队需要一份行业资讯早报但手动收集、整理、排版耗时耗力。如果有一个AI助手能自动抓取、分析、总结并准时推送到飞书群会怎样这正是OpenClaw结合飞书能帮你实现的事情。OpenClaw 并非一个简单的自动化脚本而是一个具备自主学习和执行能力的AI智能体Agent框架。它最大的价值在于你可以通过自然语言“教会”它复杂的任务流程比如“每天早上9点去这几个网站抓取AI和编程领域的热点新闻总结成一份带重点摘要的Markdown报告并发送到指定的飞书群”。本文将带你从零开始实现一个“OpenClaw推送飞书资讯早报”的智能工作流。你将不仅学会如何部署和配置OpenClaw更重要的是理解如何将AI Agent的“规划-执行”能力落地到一个具体的、可复用的企业协作场景中真正解放生产力。1. 核心问题我们到底在解决什么在深入代码之前我们必须先厘清这个项目的核心价值。它解决的远不止“自动发消息”这么简单。传统方式的痛点信息碎片化需要人工打开多个网站、RSS、社群信息源分散。处理成本高需要阅读、筛选、提炼重点并组织成易于阅读的格式。流程僵化简单的RSS机器人只能推送原文链接或标题缺乏深度加工。无法持续学习无法根据团队反馈比如对某类新闻更感兴趣优化后续的内容筛选。OpenClaw 飞书方案的优势任务规划与分解OpenClaw可以将“生成早报”这个复杂目标自动分解为“搜索信息 - 内容提取 - 总结归纳 - 格式排版 - 定时发送”等一系列子任务。多工具协同它可以调用浏览器工具访问网页调用Python工具处理数据调用LLM大语言模型进行总结再调用飞书API发送消息。自然语言交互你可以用对话的方式调整任务比如“明天开始增加对‘开源模型’关键词的监控”。与企业IM无缝集成飞书提供了强大的机器人API和丰富的消息卡片格式让推送结果美观、交互性强。因此本文的目标是构建一个可定制、可进化、真正智能的资讯早报机器人而不仅仅是一个定时爬虫脚本。2. 基础概念与核心组件拆解要实现这个系统我们需要理解几个关键部分是如何协同工作的。2.1 OpenClaw不只是另一个自动化工具OpenClaw是一个开源的AI智能体框架。它的核心思想是让AI大语言模型作为“大脑”去规划和调用各种“工具”Tools来完成复杂任务。大脑LLM负责理解你的目标、规划步骤、做出决策。你可以接入OpenAI GPT、Claude、国产大模型或本地部署的模型。技能Skills这是OpenClaw的核心概念。一个Skill就是一个封装好的能力单元比如“搜索网页”、“读写文件”、“发送HTTP请求”。我们的早报机器人就需要组合多个Skill。记忆Memory让Agent记住之前的对话和任务执行上下文从而实现多轮对话和持续学习。规划器Planner自动将你的自然语言指令分解成可执行的技能调用序列。2.2 飞书开放平台机器人的连接器飞书机器人是我们工作流的“输出终端”。自定义机器人在飞书群中创建一个机器人获取其webhook地址。这是最简单的消息推送方式。权限与API对于更复杂的交互如读取群消息、特定人需要使用飞书开放平台创建应用配置权限获取app_id和app_secret。消息卡片飞书支持丰富的交互式消息卡片Card我们可以用JSON格式构建包含标题、正文、图片、按钮的早报模板让推送内容更直观。2.3 工作流全景图整个系统的数据流如下用户指令“生成今日AI早报” → OpenClaw Agent理解指令制定计划 → 调用【网络搜索Skill】获取原始资讯 → 调用【文本处理/总结Skill】由LLM驱动提炼摘要 → 调用【格式化Skill】生成飞书卡片JSON → 调用【HTTP请求Skill】推送至飞书Webhook → 飞书群收到美观的资讯早报。这个流程可以设置为定时触发实现全自动化。3. 环境准备与安装部署我们将在一个Linux服务器Ubuntu 20.04上完成部署。Windows系统可通过WSL2进行类似操作。3.1 基础环境准备# 1. 更新系统并安装基础依赖 sudo apt update sudo apt upgrade -y sudo apt install -y python3-pip python3-venv git curl # 2. 安装并启动Redis用于OpenClaw的记忆存储 sudo apt install -y redis-server sudo systemctl start redis sudo systemctl enable redis # 3. 验证Python环境 python3 --version # 确保为Python 3.8 pip3 --version3.2 部署OpenClawOpenClaw的安装方式多样这里采用从源码安装便于理解和定制。# 1. 克隆仓库 git clone https://github.com/openclaw-ai/OpenClaw.git cd OpenClaw # 2. 创建并激活虚拟环境强烈推荐避免依赖冲突 python3 -m venv venv source venv/bin/activate # 3. 安装依赖 pip install -r requirements.txt # 4. 安装OpenClaw包本身 pip install -e .重要提示如果遇到网络问题可以使用国内镜像源加速pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple3.3 配置LLM连接以OpenAI为例OpenClaw的核心是LLM。你需要一个LLM的API密钥。这里以OpenAI GPT-4为例。获取OpenAI API Key访问 OpenAI平台 创建。在OpenClaw项目根目录创建或编辑配置文件.env# .env 配置文件 OPENAI_API_KEYsk-your-actual-openai-api-key-here LLM_MODELgpt-4-turbo-preview # 或 gpt-3.5-turbo关于本地模型如果你想使用本地部署的模型如通过Ollama运行的Llama 3、Qwen等需要安装openclaw[local]额外依赖并配置对应的模型端点。这涉及更多步骤本文为简化流程先使用云端API。3.4 在飞书创建机器人打开飞书进入目标群聊。点击群设置 -添加机器人-自定义机器人。设置机器人名称如“资讯小助手”、描述和头像。关键一步勾选“签名校验”或直接复制生成的Webhook地址。这个地址格式类似https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxx安全设置可选如IP白名单测试环境可先跳过。将Webhook地址妥善保存我们稍后会用到。4. 构建核心技能资讯获取与处理OpenClaw的强大在于“技能”组合。我们需要为早报任务创建或使用几个核心技能。4.1 技能一网络资讯抓取SearchWebSkill我们可以利用现成的WebSearchSkill或者自己封装一个更稳定的。这里以使用duckduckgo-search和requests、BeautifulSoup为例创建一个自定义技能。首先安装额外依赖pip install duckduckgo-search requests beautifulsoup4 lxml然后在OpenClaw项目目录下创建我们的技能文件my_skills.py# my_skills.py import requests from bs4 import BeautifulSoup from duckduckgo_search import DDGS from typing import List, Dict import json from openclaw.skills import BaseSkill, register_skill register_skill class TechNewsSearchSkill(BaseSkill): 一个专门抓取科技资讯的技能 name tech_news_search description 搜索指定关键词的近期科技新闻并返回标题、链接和摘要。 def __init__(self): super().__init__() # 可以定义一些默认的新闻源RSS或网站 self.default_sources [ https://news.ycombinator.com/, https://www.infoq.com/, # 技术博客、开源社区等 ] def execute(self, input_data: Dict) - Dict: 执行搜索。 输入: {keywords: 人工智能 开源模型, max_results: 5} 输出: {articles: [{title: ..., url: ..., snippet: ...}, ...]} keywords input_data.get(keywords, AI programming news) max_results input_data.get(max_results, 5) articles [] try: with DDGS() as ddgs: # 使用DuckDuckGo搜索无需API Key results ddgs.text(keywords, regionwt-wt, safesearchModerate, timelimitd, max_resultsmax_results) for r in results: article { title: r.get(title, ), url: r.get(href, ), snippet: r.get(body, )[:200] # 截取摘要 } # 可选对每个URL进行简单抓取获取更详细内容注意频率和网站规则 # full_content self._fetch_article_content(r[href]) # article[content] full_content[:500] articles.append(article) except Exception as e: return {error: f搜索失败: {str(e)}, articles: []} return {articles: articles} def _fetch_article_content(self, url: str) - str: 辅助方法抓取文章正文简化版 try: headers {User-Agent: Mozilla/5.0} resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() soup BeautifulSoup(resp.text, html.parser) # 简单的正文提取实际项目可使用readability-lxml或trafilatura等库 for tag in [article, main, .post-content]: elements soup.select(tag) if elements: return elements[0].get_text(stripTrue, separator ) return soup.get_text(stripTrue, separator )[:1000] except: return # 注意需要将技能所在的路径添加到OpenClaw的技能扫描路径或在启动时加载。4.2 技能二LLM总结与格式化SummarizeSkill我们需要一个技能来调用LLM对抓取到的多篇文章进行总结、去重、提炼重点。# 在 my_skills.py 中继续添加 import openai from openclaw.skills import BaseSkill, register_skill import os register_skill class NewsSummarizeSkill(BaseSkill): 使用LLM对新闻列表进行总结生成早报摘要 name news_summarize description 接收一个文章列表生成一份简洁的每日早报摘要。 def __init__(self): super().__init__() self.client openai.OpenAI(api_keyos.getenv(OPENAI_API_KEY)) self.model os.getenv(LLM_MODEL, gpt-3.5-turbo) def execute(self, input_data: Dict) - Dict: 输入: {articles: [文章列表], focus: AI与编程} 输出: {summary_markdown: ## 今日AI早报\n\n1. ...} articles input_data.get(articles, []) focus input_data.get(focus, 科技资讯) if not articles: return {summary_markdown: ## 今日早报\n\n今日未抓取到相关资讯。} # 构建LLM提示词 articles_text for i, art in enumerate(articles, 1): articles_text f{i}. **{art[title]}**\n 链接{art[url]}\n 摘要{art[snippet]}\n\n prompt f 你是一个专业的科技编辑。请根据以下抓取的新闻列表生成一份面向开发者的“{focus}”每日早报。 要求 1. 用中文输出。 2. 格式为Markdown。 3. 包含一个吸引人的总标题如“AI前沿速递 | 日期”。 4. 将内容分为2-4个类别如“大模型动态”、“开源项目”、“行业洞察”。 5. 每个类别下列出最重要的2-3条新闻每条新闻包含**核心标题**、一句话精炼总结、原文链接。 6. 在最后添加一个“一句话快讯”板块用短句列出其他值得关注的点。 7. 整体风格简洁、专业、有信息量。 新闻列表 {articles_text} try: response self.client.chat.completions.create( modelself.model, messages[ {role: system, content: 你是一个专业的科技资讯编辑。}, {role: user, content: prompt} ], temperature0.7, max_tokens1500 ) summary response.choices[0].message.content return {summary_markdown: summary} except Exception as e: return {error: fLLM总结失败: {str(e)}, summary_markdown: }4.3 技能三飞书消息推送FeishuWebhookSkill这个技能负责将生成的Markdown早报转换为飞书消息卡片并发送。# 在 my_skills.py 中继续添加 import requests import json register_skill class FeishuWebhookSkill(BaseSkill): 通过飞书群机器人的Webhook发送消息卡片 name feishu_webhook_send description 将Markdown内容格式化为飞书卡片并发送到指定的Webhook URL。 def execute(self, input_data: Dict) - Dict: 输入: { webhook_url: https://open.feishu.cn/..., title: AI早报, content_markdown: ## 标题\\n内容..., at_all: false } 输出: {success: true/false, message: ...} webhook_url input_data.get(webhook_url) title input_data.get(title, 每日资讯早报) content_md input_data.get(content_markdown, ) at_all input_data.get(at_all, False) if not webhook_url: return {success: False, message: Webhook URL不能为空} # 构建飞书交互式卡片消息结构 # 飞书卡片支持Markdown但需要放在特定的content字段中。 card_elements [] # 标题部分 header { title: { tag: plain_text, content: title } } # 内容部分将Markdown放入一个div的markdown元素中 content_element { tag: div, text: { tag: lark_md, # 飞书支持的Markdown类型 content: content_md } } card_elements.append(content_element) # 如果需要所有人 if at_all: at_element { tag: div, text: { tag: lark_md, content: at idall/at 大家早上好今日早报已送达 } } card_elements.append(at_element) # 构建完整的卡片JSON card_data { msg_type: interactive, card: { config: { wide_screen_mode: True }, header: header, elements: card_elements } } # 发送请求 headers {Content-Type: application/json} try: response requests.post(webhook_url, datajson.dumps(card_data), headersheaders, timeout10) resp_json response.json() if resp_json.get(code) 0: return {success: True, message: 消息发送成功} else: return {success: False, message: f飞书API返回错误: {resp_json}} except Exception as e: return {success: False, message: f请求发送失败: {str(e)}}5. 组装智能体与编排任务流技能准备好了现在需要创建一个智能体Agent并将这些技能串联起来。5.1 定义智能体与任务在项目根目录创建主运行脚本run_morning_brief.py# run_morning_brief.py import asyncio import os from dotenv import load_dotenv from openclaw.agent import Agent from openclaw.skills.registry import SkillRegistry # 1. 加载环境变量和自定义技能 load_dotenv() # 手动注册我们自定义的技能假设它们在一个模块中 import sys sys.path.append(.) # 将当前目录加入路径以便导入my_skills from my_skills import TechNewsSearchSkill, NewsSummarizeSkill, FeishuWebhookSkill registry SkillRegistry() registry.register(TechNewsSearchSkill()) registry.register(NewsSummarizeSkill()) registry.register(FeishuWebhookSkill()) # 2. 配置智能体 agent Agent( nameMorningBriefBot, skillsregistry, # 指定使用的LLM模型会在.env中读取API_KEY llm_modelos.getenv(LLM_MODEL, gpt-3.5-turbo), memory_enabledTrue # 启用记忆可以让它记住你之前的调整 ) # 3. 定义任务执行函数 async def generate_and_send_brief(): 核心任务流 print([任务开始] 生成并发送每日早报...) # 步骤1搜索新闻 search_input { keywords: 人工智能 机器学习 开源项目 编程语言 更新, max_results: 8 } print(f 执行技能: tech_news_search, 输入: {search_input}) search_result await agent.execute_skill(tech_news_search, search_input) articles search_result.get(articles, []) print(f 搜索到 {len(articles)} 篇文章。) if not articles: print( 未找到文章任务终止。) return # 步骤2总结新闻 summarize_input { articles: articles, focus: AI与软件开发 } print(f 执行技能: news_summarize) summarize_result await agent.execute_skill(news_summarize, summarize_input) markdown_content summarize_result.get(summary_markdown, ) if not markdown_content: print( 总结失败任务终止。) return print( 新闻总结完成。) # 步骤3发送到飞书 # !!! 重要将此处的URL替换为你自己的飞书机器人Webhook !!! FEISHU_WEBHOOK_URL https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxx send_input { webhook_url: FEISHU_WEBHOOK_URL, title: AI与开发晨报, content_markdown: markdown_content, at_all: False # 设置为True会在工作日所有人 } print(f 执行技能: feishu_webhook_send) send_result await agent.execute_skill(feishu_webhook_send, send_input) if send_result.get(success): print([任务成功] 早报已发送至飞书) else: print(f[任务失败] 发送飞书消息时出错: {send_result.get(message)}) # 4. 运行主函数 if __name__ __main__: asyncio.run(generate_and_send_brief())5.2 首次运行测试在运行前请务必检查.env文件中的OPENAI_API_KEY已正确设置。将run_morning_brief.py中的FEISHU_WEBHOOK_URL替换为你的真实Webhook地址。然后在终端运行cd /path/to/your/OpenClaw source venv/bin/activate # 激活虚拟环境 python run_morning_brief.py观察控制台输出。如果一切顺利你应该能在飞书群中收到第一条由AI生成的资讯早报6. 实现自动化定时推送单次运行成功只是第一步。我们需要它每天自动运行。6.1 使用系统Cron JobLinux/Mac最可靠的方式是使用系统的定时任务。首先创建一个可执行的Shell脚本run_brief.sh#!/bin/bash # run_brief.sh # 进入项目目录 cd /home/your_username/OpenClaw # 激活虚拟环境 source venv/bin/activate # 执行Python脚本 python run_morning_brief.py /tmp/morning_brief.log 21 # 记录日志 echo $(date): Morning brief task executed. /tmp/morning_brief_cron.log赋予脚本执行权限chmod x /home/your_username/OpenClaw/run_brief.sh编辑当前用户的crontabcrontab -e添加一行设定每天工作日周一到周五早上9点执行# 分 时 日 月 周 命令 0 9 * * 1-5 /home/your_username/OpenClaw/run_brief.sh保存并退出。Cron会每天自动运行你的脚本。6.2 使用Python Schedule库跨平台如果你希望逻辑全部在Python内控制可以使用schedule库。安装pip install schedule创建一个新的守护进程脚本schedule_brief.py# schedule_brief.py import schedule import time import asyncio import sys import os sys.path.append(.) from run_morning_brief import generate_and_send_brief # 导入之前的任务函数 async def job(): print(f{time.ctime()}: 开始执行定时任务...) await generate_and_send_brief() def run_async_job(): asyncio.run(job()) # 定义定时规则每天9点执行 schedule.every().day.at(09:00).do(run_async_job) # 或者每个工作日9点 # schedule.every().monday.at(09:00).do(run_async_job) # schedule.every().tuesday.at(09:00).do(run_async_job) # ... print(定时任务调度器已启动等待执行...) while True: schedule.run_pending() time.sleep(60) # 每分钟检查一次然后使用nohup或systemd让这个脚本在后台运行。7. 进阶优化与最佳实践一个基础的机器人已经跑通但要投入生产使用还需要考虑以下几点。7.1 技能优化更稳定的信息源使用官方API对于InfoQ、Hacker News等有公开API或RSS的网站优先使用API避免被封IP。设置请求头与延迟在抓取技能中务必设置合理的User-Agent和请求间隔 (time.sleep)。错误重试机制对网络请求添加重试逻辑如使用tenacity库。内容去重利用memory或外部数据库如SQLite记录已发送的文章链接避免重复推送。7.2 飞书消息卡片增强基础的Markdown卡片可能不够美观。飞书卡片支持更复杂的布局、按钮和交互。多栏布局可以将早报的不同板块如“大模型”、“开源”、“工具”放在不同的列中。添加图片可以为每条新闻配图或添加一个固定的早报头图。交互按钮添加“查看详情”、“收藏”、“反馈无用”等按钮并配置交互回掉地址这需要创建飞书应用而非仅用Webhook。使用官方SDK对于复杂交互建议使用飞书官方Python SDK (lark-oapi)它能更好地处理消息、事件和回调。7.3 配置管理与安全性敏感信息分离绝对不要将API Key、Webhook URL硬编码在代码中。使用.env文件或专门的配置管理工具如python-dotenv并确保.env文件被添加到.gitignore。飞书安全设置在生产环境中务必在飞书机器人设置中配置IP白名单只允许你的服务器IP调用Webhook并启用签名校验在代码中验证请求来源。日志记录将运行日志成功、失败、抓取了哪些文章等记录到文件或日志系统如logging模块配置到文件便于排查问题。7.4 扩展性与维护技能市场OpenClaw社区可能有现成的新闻抓取、飞书推送技能可以查找并复用。工作流引擎集成对于极其复杂、多分支的任务流可以考虑将OpenClaw与n8n、Airflow等工作流引擎结合。OpenClaw作为其中一个“AI处理节点”被调用。模型成本控制LLM API调用是主要成本。可以通过以下方式优化对抓取到的文章先进行本地关键词筛选只将最重要的几条送给LLM总结。使用更便宜的模型如gpt-3.5-turbo进行总结效果通常也足够。设置每月使用限额。8. 常见问题与排查指南在部署和运行过程中你可能会遇到以下问题问题现象可能原因排查步骤解决方案运行脚本报错ModuleNotFoundError1. 虚拟环境未激活。2. 依赖未安装完全。3. Python路径问题。1. 执行which python确认在虚拟环境内。2. 检查pip list是否包含openclaw。3. 检查sys.path。1. 执行source venv/bin/activate。2. 在项目根目录重新执行pip install -e .。3. 在脚本开头正确添加路径。飞书机器人未收到消息1. Webhook URL错误。2. 网络不通服务器无法访问外网。3. 飞书机器人被停用或权限不足。4. 消息卡片JSON格式错误。1. 复制Webhook URL到浏览器手动POST一个简单JSON测试。2. 在服务器上curl -v https://open.feishu.cn。3. 检查飞书群机器人列表。4. 查看飞书开发者后台的“事件日志”。1. 重新获取并核对Webhook URL。2. 检查服务器防火墙/安全组设置。3. 在飞书群重新添加机器人。4. 使用飞书提供的 消息卡片调试工具 。LLM调用失败或返回空1. API Key错误或过期。2. 额度用尽或账单问题。3. 请求超时或网络问题。4. Prompt设计问题导致无输出。1. 检查.env文件。2. 登录OpenAI控制台查看用量和账单。3. 在代码中捕获异常并打印。4. 简化Prompt测试。1. 更新正确的API Key。2. 绑定支付方式或切换模型。3. 增加超时时间或设置重试。4. 优化Prompt确保指令清晰。抓取技能返回空列表1. 搜索关键词太冷门。2. 使用的搜索工具被屏蔽或限流。3. 目标网站反爬。1. 打印搜索关键词和原始返回结果。2. 更换搜索源如改用Google Search API需配置。3. 检查请求头添加User-Agent和延迟。1. 使用更通用或热门的关键词组合。2. 考虑使用付费或更稳定的新闻聚合API。3. 遵守robots.txt并考虑使用RSS源替代直接抓取。Cron定时任务不执行1. Cron表达式错误。2. 脚本路径错误或权限不足。3. 环境变量在Cron环境中未加载。4. 脚本输出未重定向错误被忽略。1. 使用crontab -l检查。2. 在Cron命令中使用绝对路径。3. 在Shell脚本开头显式加载环境变量如source /home/user/.profile。4. 检查/tmp/morning_brief.log日志文件。1. 使用在线Cron表达式生成器验证。2. 确保Cron命令中的路径全部为绝对路径。3. 在脚本内通过绝对路径加载.env文件。4. 确保日志文件可写并定期检查。通过以上步骤你已经成功构建了一个基于OpenClaw AI Agent的飞书资讯早报机器人。这个项目的意义在于它提供了一个清晰的范式如何将前沿的AI智能体框架与成熟的企业协作工具结合解决一个具体的、高频的、有价值的实际需求。你可以以此为蓝本扩展出会议纪要生成、项目进度同步、数据报表解读等更多自动化场景。