ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用WorkBuddy把AI Agent接入飞书钉钉:日报助手实战指南

用WorkBuddy把AI Agent接入飞书钉钉:日报助手实战指南 如果你所在的团队每天都要在飞书或钉钉群里处理各种数据表格、项目进度和日报周报大概率产生过一个念头能不能让AI自己把这些活干了自动整理成消息发到群里我最近就在折腾这个事把团队的日常信息流接进了WorkBuddy开放平台搭了一套能读飞书多维表格、能往钉钉群推消息卡的AI Agent。这篇不聊概念和PPT直接讲怎么把一个真正能用的AI机器人接进你公司现有的IM工作流包括凭证怎么配、回调怎么验、表格怎么发、坑在哪几个地方。如果你是第一次做这类集成把这篇当一份手把手的排雷笔记看就行。1. 为什么需要WorkBuddy这类开放平台1.1 企业IM接入AI的三道坎把AI接到飞书或钉钉听起来不就是调个API发消息吗实际动手会发现远没那么简单。我拆成三块说。第一块是身份与权限。飞书有飞书的App ID、App Secret、事件订阅验签机制钉钉有钉钉的AppKey、AppSecret、机器人安全设置。两边都要求你在自己的开放平台后台创建自建应用然后把一堆scope权限勾上、发布版本、再配置事件回调。光是把这些凭证搞清楚、搞清楚哪个token用在哪一步就能耗掉一晚上。第二块是消息格式差异。同样是往群里发一条消息飞书支持纯文本、富文本post、消息卡片interactive还可以发文件、图片、多维表格链接钉钉则分为普通text、markdown、ActionCard、FeedCard。两边对消息体大小的限制、字段结构、加密方式都不一样。同一个AI结果你得写两套发送逻辑。第三块是长连接和回调。飞书要求你把事件回调地址暴露到公网并且要处理URL验证、加密Key解密、事件重试。钉钉虽然可以用自定义Webhook省去回调但如果想让机器人听懂群里说了什么再自动回复还得走Stream模式或者另配消息回调。一个不留神回调地址验证不通过机器人就变成哑巴。这三道坎单独看都不算难叠在一起就非常磨人。尤其当你想把AI真正的能力读表格、查数据、生成摘要、调别的API接进去时还需要一个能编排这些动作的壳子WorkBuddy这类开放平台解决的就是这个问题。1.2 WorkBuddy的定位AI编排层加IM适配层我理解WorkBuddy做的事情可以分成两层看。上层是AI Agent的编排层。你可以在里面创建一个Agent给它配置大模型我这边用的是DeepSeek的开放平台接口给它定义一组技能比如读取多维表格生成日报摘要查询任务状态再把这些技能按照业务逻辑串起来。下层是IM连接器层。WorkBuddy把飞书、钉钉的认证、消息发送、事件订阅这些脏活封装成统一的连接器你在配置界面填一次凭证之后发消息就是选一个群、填一段内容的事。这么做最直观的好处是解耦。以后你换模型、改提示词、增加一个技能都不用改动IM侧的机器人配置。反过来你哪天想从飞书切到钉钉或者两套一起跑也不用重写AI逻辑就是在WorkBuddy里多配一个连接器的事。我还想提醒一点这类平台的价值不在于一个Agent能聊天而在于技能编排的稳定性。我自己踩过的坑是Agent一旦技能链变长某个环节超时会拖垮整条链路。所以选型时优先看它有没有超时设置、重试机制、日志面板这三样东西。WorkBuddy在技能节点上支持配置超时和失败重试调试时还能看每一节点的输入输出这比黑盒调用强太多。2. 接入前的架构准备与关键参数2.1 飞书侧创建自建应用并开启机器人在WorkBuddy里接入飞书之前得先把飞书开放平台侧的东西准备好。登录飞书开放平台后台选择企业自建应用创建一个新应用名字随意比如AI日报助手。创建完先别急着写代码把下面几个凭证抄下来参数说明获取位置App ID形如cli_开头的字符串应用凭证页App Secret应用密钥调用接口时换取tenant_access_token用应用凭证页Verification Token事件订阅的校验令牌事件订阅页Encrypt Key回调数据加密密钥开启加密后推送内容需要AES解密事件订阅页接下来在添加应用能力里开启机器人能力并给应用添加必要的权限范围。我这里列几个最容易用到的读取群组信息、发送消息、读取多维表格、上传文件。权限勾选后要创建版本并发布发布后应用才真正可用不然机器人发消息会静默失败。事件订阅这一步是很多新手卡住的地方。需要在事件订阅页配置一个回调地址并添加事件比如接收消息事件im.message.receive_v1。WorkBuddy在连接器配置里会生成一个回调地址你直接填进飞书后台然后把Verification Token和Encrypt Key也填回WorkBuddy让两边能够互相验签。飞书会先发一个URL验证请求只有正确返回了{challenge: xxx}才算通过。2.2 钉钉侧企业内部应用与机器人钉钉侧的准备去钉钉开放平台后台创建企业内部应用。创建后同样要拿到一组凭证AppKey、AppSecret。这里我提醒一下钉钉的AppSecret权限很大别随便存到前端代码里一定要放服务端环境变量。企业内部应用创建好之后要给应用添加机器人能力。钉钉机器人的消息接收方式有两种选择一种是Stream模式。用钉钉官方SDK建立长连接机器人实时接收群消息不需要公网回调地址。适合不想折腾公网暴露、又想实现群里机器人自动回复的场景。代价是你得有一个常驻进程一直跑着WorkBuddy部署在有公网访问能力的服务器上时这个模式很省心。另一种是HTTP Webhook模式。机器人会获得一个Webhook地址形如https://oapi.dingtalk.com/robot/send?access_tokenxxx。这种模式适合单向推送比如定时把日报推送到群。如果要接收群消息就需要在后台配置消息回调地址要处理回调验证和加签相对繁琐。两种模式我后来是配合用的日常定时推送走Webhook群里自动问答走Stream。同学们如果只是想先跑通建议从Webhook推送开始最快5分钟就能见到效果。2.3 WorkBuddy侧初始化与连接器配置WorkBuddy本身的部署不复杂。我是在一台Linux服务器上用Docker跑的一个容器就把服务端跑起来了。大致步骤是先拉镜像启动时挂载数据目录再把管理后台端口映射出来第一次打开管理后台时初始化管理员账号。# 参考步骤以Docker方式部署WorkBuddy服务端 docker run -d --name workbuddy \ -p 8080:8080 \ -e WB_DATA_DIR/data \ -v ./workbuddy_data:/data \ workbuddy/agent-platform:latest注意以上命令是参考形式具体镜像名和端口号以你拿到的官方安装文档为准。关键是理解思路服务端要能访问外网用来调用大模型API和IM开放平台的接口。部署完成后在WorkBuddy的连接器页面分别添加飞书连接器和钉钉连接器把前面抄下来的凭证一项一项填进去。填完后建议先点一下测试连接飞书会请求一次tenant_access_token并返回成功钉钉会请求一次access_token两边通了再继续往下建Agent。这一步别跳过我见过太多人配完Agent才发现凭证填错了排查半天。3. 实操15分钟搭一个AI日报助手3.1 先想清楚Agent的技能链我用一个最典型的场景来演示完整流程让AI每天下午定时把飞书多维表格里的任务汇总成日报生成摘要后同时发到飞书群和钉钉群。这个Agent的技能链拆开来看就四段连接多维表格查询当天需要处理的任务记录。把查到的记录交给大模型让它按已完成、进行中、待处理、风险四类做汇总。按目标IM平台组装消息格式飞书用interactive卡片钉钉用markdown。分别调用飞书连接器和钉钉连接器把消息推送到指定群。先想清楚链路再动手配置能少走很多弯路。WorkBuddy里每个技能节点都有输入和输出上游节点输出的JSON是下游节点的输入。我把这个数据流设计成一个固定结构{ date: 2025-01-07, task_count: 12, done: 5, doing: 4, pending: 2, blocked: 1, summary: 今日整体进度正常前端需求已完成交付后端接口联调存在一个阻塞项, risk_task: 支付回调服务偶发超时需要关注 }这样设计的好处是无论后面要推送到飞书、钉钉还是将来的企业微信同一个数据源模型就能适配不需要为每个平台单独写摘要逻辑。3.2 在WorkBuddy里一步步搭起来第一步新建Agent名字叫日报小助手。我会先把它的系统提示词写清楚告诉大模型你是一个日报整理助手只基于输入的任务数据做汇总不要编造数据输出用中文分类要明确。第二步添加读取多维表格技能。这里需要先拿到多维表格的app_token和table_id。打开飞书多维表格的链接长得类似https://xxx.feishu.cn/base/xxxxxxxx?tabletblaXXXXXXXX链接里/base/后面那一段就是app_tokentable参数后面那一段就是table_id。把它们填进技能参数里同时用环境变量把多维表格ID和WorkBuddy侧的飞书连接器关联起来。第三步添加生成日报摘要技能。这里的大模型我选了DeepSeek理由很简单费用低、中文摘要效果好、API格式兼容OpenAI生态。提示词模板大致是你是一个项目日报助手。基于以下任务列表数据生成一份简洁的中文日报。 要求按已完成/进行中/待处理/阻塞分四类指出最有风险的一条任务总字数不超过200字。 数据如下 {records}第四步添加推送飞书群消息和推送钉钉群消息两个技能。飞书侧选择连接器后填入群IDchat_id在飞书群设置里可以看到消息类型选interactive卡片把摘要数据和风险任务映射到卡片字段。钉钉侧选择Webhook推送填入已经创建的群Webhook地址消息类型选markdown。第五步设置定时触发。WorkBuddy提供了按cron表达式定时执行的能力。我设的是工作日17:50触发表达式为50 17 * * 1-5。设完之后在后台手动触发一次测试跑一遍完整链路确认两个群都能收到消息。3.3 表格怎么发出去这个点是搜索结果里很多人问的飞书机器人怎么发送表格。我实测过三种方式适用场景不太一样。第一种是发文件消息。把多维表格数据导出成CSV先调用文件上传接口拿到file_key再以file消息类型推送。飞书文件类接口一般限制文件大小在几十MB以内超大的要么压缩拆分要么走对象存储生成链接。CSV文件的优点是你不用做格式转换直接把数据库查询结果转成CSV就行对方在聊天窗口点开就能用Excel看。缺点是反馈没有卡片直观。第二种是发富文本卡片。飞书的interactive消息卡片支持字段表格化展示钉钉的markdown消息也支持简单表格语法。这种适合日报这种数据量不大、但要看结构的场景。卡片里我可以把已完成/进行中/阻塞分别用不同颜色标识群成员一眼扫过去就能掌握重点。第三种是发多维表格链接。飞书消息里直接发分享链接消息卡片会自动带出多维表格的标题和概要。这种方式最省事适合数据你自己去表里看的场景。但也最被动没有把关键信息提炼出来AI的增值作用就弱化了。我自己的选择是组合使用日报正文用卡片同时附带CSV文件供需要详细数据的人下载。整个流程在WorkBuddy里就是生成CSV和发送文件两个节点前者用代码块支持Python脚本调用多维表格API后者用文件消息发送不复杂。4. 常见问题与排查技巧实录4.1 飞书机器人发不出消息问题出在哪我在飞书上踩得最多的一个坑是接口调用返回成功群里就是收不到消息。后来定位到两种情况。第一种情况是应用没有发布。自建应用改完权限后必须创建版本并发布发布通过后新的权限才生效。没发布的情况下即使调试环境里的token能拿到im/v1/messages接口也会返回no permission或干脆静默失败。排查方法很简单在飞书开放平台后台看应用版本状态确保是已发布。第二种情况是机器人没有进群。应用机器人要先被添加到目标群聊里才能发消息。很多人配好了技能却忘了在群里添加这个机器人。手动把机器人拉进群之后再触发一次测试流程就好了。还有一类没有CLI权限的问题也常被问到。如果你是在命令行环境里用CLI工具去操作飞书应用、发消息频繁会遇到权限不足的报错。这多半是因为CLI当前的token是你的个人token不是应用token。正确的做法是在WorkBuddy或自己的脚本里用应用的tenant_access_token不是个人身份的user_access_token。个人token能做的操作和应用token不完全一样我们现在接入机器人一律走应用token彻底绕开了身份权限不一致的坑。4.2 钉钉Webhook消息为什么会丢失钉钉自定义Webhook有个容易忽视的地方后台创建机器人的时候会让你选安全设置有自定义关键词加签IP白名单三种方式。如果只选了自定义关键词那你推送的text内容里必须包含这个关键词否则钉钉会直接丢弃消息而且不返回错误。我用加签方式比较多。加签的逻辑很简单把当前时间戳、密钥拼成一个字符串用HMAC-SHA256算法生成签名放到Webhook URL后面。这里给一个可以直接用的签名计算片段import time import hmac import hashlib import base64 secret SEC你的加签密钥 timestamp str(round(time.time() * 1000)) string_to_sign {}\n{}.format(timestamp, secret) hmac_code hmac.new( string_to_sign.encode(utf-8), digestmodhashlib.sha256 ).digest() sign base64.b64encode(hmac_code).decode(utf-8) # 最终请求URL是在webhook地址后面拼上 timestamp{timestamp}sign{sign}另一个高频问题是消息体过大。搜索词里钉钉webhook文件大小问的人很多我实测的经验是webhook适合推送短文本和Markdown不适合在JSON里塞大段base64内容。如果你要推送的内容比较大比如超过几千字的周报或者数据量很大的表格不要试图硬塞进消息体。正确做法是先传到对象存储或文件服务再把下载链接放进消息里。钉钉我们能选择用文件类型消息但文件上传接口对格式和大小也有约束大文件还是优先走云存储链接的方式稳定性高很多。4.3 资源占用与本地调试技巧搜索词里反复出现钉钉内存占用高这个现象我在开发期感受非常深。如果电脑上同时开着钉钉客户端、IDE、WorkBuddy的数据服务内存很容易告急。开发调试的时候建议能不开客户端就不开。用Stream模式跑机器人消息收发都在你的服务进程里跟客户端无关你甚至可以用钉钉Web版做验证能明显降低本地资源压力。另外本地调试IM回调时没有公网IP很麻烦。搜索词里提到钉钉内部隧道技术其实就是用内网穿透工具把本地端口暴露出来让钉钉或飞书的回调能打到你开发机上。这类工具很多原理都一样本地起一个隧道进程得到一个公网临时域名把回调地址填成这个域名。我可以给你几条经验隧道域名会变每次变化都要去IM后台更新回调地址所以尽量把回调地址提取成环境变量。回调地址暴露出来有风险配合IP白名单或验签使用别裸奔。生产环境不要依赖隧道用服务器正式部署加HTTPS。4.4 密钥安全与稳定运行最后说几个安全细节都是实际生产里必须注意的。把密钥放在代码里是绝对的大忌。WorkBuddy有环境变量机制飞书App Secret、钉钉AppSecret、大模型API Key全部放在环境变量或者平台的密钥存储里不要出现在Git提交记录中。我见过有人把钉钉Secret直接写进前端页面结果一查就能搜到改一次密钥还牵连一堆服务。正确姿势是一次配好定期轮换。事件订阅方面飞书开了Encrypt Key之后回调推送的数据是AES加密的。很多人在这个环节测试失败是因为只填了Verification Token没填Encrypt Key或者解密用的Key不对。WorkBuddy侧填了加解密配置后自动处理解密逻辑你要做的就是把Encrypt Key也完整的粘进去。消息推送的可靠性也要考虑。尤其是定时任务场景一旦某个节点失败你会面临重试导致重复消息或不重试导致漏消息的两难。我的习惯是在消息内容里带上业务日期或任务批次号这样即使同一天触发多次群里看得到重复内容也可以根据批次号判断是否该去重。另外在WorkBuddy里把关键节点的日志打开某次推送失败后先看日志定位到具体技能节点而不是整个Agent重跑。写在最后的一点体会这套接入方案目前最常跑的流程是每天下午17点50分WorkBuddy自动从飞书多维表格拉取当日任务让DeepSeek生成一段日报摘要然后分别组装成飞书卡和钉钉Markdown推送到对应群。团队里不再有人手动去问今天进度怎么样了想知道情况的看一眼群消息就行。我踩过的最深的坑就是一开始把飞书和钉钉的差异化逻辑全部堆在Agent提示词里后来发现思路应该反过来——提示词只负责提炼内容平台差异全部交给连接器处理。如果你准备开始搭这类AI接入IM的场景建议你先从一个最简的定时推送日报起步跑通后再逐步加双向问答、操作数据库、生成报表这些高阶技能。这一套链路打通后的可扩展性远比它第一眼看上去的价值更高。
返回列表