作者:杨琪
推荐理由
飞书后台能力是个强大而丰富的资源库,SmartRobot希望可以成为一座桥梁,方便大部分普通用户方便的获取和使用这些能力。
一、关于我
大家好,我是来自字节朝夕光年江南工作室的杨琪。
这篇投稿是为了给大家介绍我们团队开发的飞书机器人指令平台SmartRobot。
SmartRobot平台作为一款方便快捷的触发式指令工具,已经在我们团队内部和兄弟团队稳定使用,提效显著。
二、需求分析
飞书机器人是飞书企业自建应用中的一项能力,用户可以通过和机器人对话,调用自己搭建的后台服务,执行自己的逻辑。
纵然飞书提供了丰富的API供开发者使用,而普通用户在实际使用飞书机器人功能时却有很多不便之处,如编辑一套回复规则、定时使用机器人提醒、使用一套模板快速执行逻辑等。同时很多用户会有更多的定制化需求,希望自己可以快速写一段程序,在和机器人交互时直接执行。
这些需求在当下的飞书环境中并不能很好的支持。
我们希望搭建一个指令平台,提供指令配置功能,方便用户快速配置。同时通过指令,触发用户配置的内容或编写的逻辑。
我们希望平台可以支持多项目,多机器人接入,同时提供严格的权限管控。
基于上述需求,我们决定开发一个飞书机器人指令平台,经过多版本迭代,即现在的SmartRobot平台。
三、方案调研
在开发初期,我们了解过其他团队都是如何解决类似的需求。
针对机器人定时推送消息,一般是团队搭建自己的后台应用,比较快捷的方式是在轻服务(后迁移至Stack)上。在后台应用上自己编写/配置推送内容,定时任务等。
针对回复机器人消息并识别执行指定逻辑,一般也是在飞书企业自建应用后台配置自己的事件订阅地址,在自己的服务里再case by case的编写逻辑。
但上述方案都有显而易见的缺点
- 针对非后台开发者,特别是非技术同学,想快速的配置一段消息规则太难了。只想每天提醒吃饭都还需要让开发同学帮写段逻辑。
- 不同的团队想用自己的机器人,去执行自己的逻辑,这种方案下实在痛苦。
- 管理起来太复杂,全是代码逻辑,而且没有很好的权限控制。
- ...
总之,我们发现针对我们的需求,只有一些很零碎,很“苟且”的方法,还没有一个系统的解决方案。
四、我们的实现
为解决我们的需求,我们自己开发了SmartRobot平台。
从平台开发的视角,我们做了需求收集,整体架构设计,领域模型设计,表设计,各模块解耦开发等,这里不再赘述。这里主要想介绍下涉及到飞书应用的开发过程中的一些思考。
1.申请一个机器人,开通相关权限和事件订阅
对于机器人你有两种选择
1.1 使用官方机器人
SmartRobot平台内置官方机器人供用户使用,搜索【SmartRobot助手】即可见
1.2 使用自建机器人
如果想添加自己的机器人,需要按如下步骤进行申请
1.2.1创建企业自建应用
- 在飞书开放平台【创建企业自建应用】,并【启用机器人】
250px|700px|reset
- 配置消息回调地址
在【机器人】页面中,配置消息卡片的回调地址:【平台提供】
在【事件订阅】页面中,配置事件请求地址:【平台提供】
**注意【Encrypt Key】不要开启,否则会导致平台无法正确解析消息内容
- 事件订阅
在【事件订阅】页面,添加【接收消息】事件,1.0或2.0版本都可以
- 权限开启
在【权限管理】页面,申请如下权限
【接收群聊中@机器人消息事件】(此权限用于触发群中@机器人的指令)
【读取用户发给机器人的单聊消息】(此权限用于触发单聊机器人的指令)
【获取用户邮箱信息】(此权限用于部分指令的构建)
【获取用户 user ID】(此权限用于部分指令的构建)
【以应用的身份发消息】(此权限用于回复和发送指令执行内容)
- 应用发布
在【版本管理与发布】页面,发布你的应用,注意选择用户可见性。发布应用涉及到敏感权限的需要按照平台机器人推送的消息提示完成工单申请。
应用发布完成后可接入SmartRobot。
1.2.2 接入SmartRobot
在机器人管理页面,添加一个机器人,填写AppID和AppSecret,这些信息可以在【凭证和基础信息】页面获取
250px|700px|reset
250px|700px|reset
选择机器人分组,这些分组下可以使用该机器人,如果选择了【公共指令】,则所有分组下都可使用
选择是否AI回复,如果开启AI回复,可与机器人进行AI对话
2.合理的根据飞书消息指令执行流区分各功能模块
上图是飞书消息接收到指令触发的执行过程
- 事件接收器
是平台的事件接收的入口。平台事件接收API配置在飞书应用后台,即可接收订阅的对应事件。事件接收后直接转发事件解释器。
- 事件解释器
事件解释器会针对接收的事件进行过滤,目前按照event_type会处理消息事件和用户进群事件,其他的事件类型会过滤丢弃。上述两类事件会分别标准化输出成消息事件模型和群事件模型。并交流事件处理器处理。同时,事件解释器会根据message_id做消息幂等,防止重复触发。
- 事件处理器
事件处理器分为群事件处理器和消息事件处理器。群事件处理器应用较少,主要用作新人入群欢迎的内置方法里。消息事件处理器会对消息事件进行指令识别和权限识别,定位到具体的指令
- 指令分发器
指令分发器是针对上一步的指令,根据指令类型路由分发给对应的触发器
- 指令触发器
不同的指令类型由不同的指令触发器进行响应触发。而指令的具体执行逻辑就是在各类触发器中执行。这四类指令基本覆盖了大部分飞书机器人指令的应用场景。
3.多使用中间层,避免对飞书接口的重复调用
如我们根据用户邮箱获取用户信息,包括openId,Name,Avartar等。我们知道不同的机器人appId获取到的用户这类信息并不是完全一致的,而这些信息一般也是不会变化的。
我们的使用场景,往往是某个指令的机器人会根据指令逻辑多次重复查询某个用户的信息,故我们会把该机器人第一次获取某个用户的信息保存在缓存中,缓存不销毁,下次该机器人再次查询该用户信息时直接从缓存中读取。
类似的方法也用在根据openId获取用户信息等其他查询接口中。
4.抽象用户需求,制定飞书能力模板
飞书强大的API能力,能帮我们解决工作中的很多问题。如日报/周报定时从模板创建,入群欢迎,周期创建飞书任务等等。这些重复的机械式的任务是时候该交给机器人去做了。
我们会评估用户的需求是否通用,然后做最大程度的抽象,交给用户在平台直接配置即可!
下图是我们目前提供的部分通用能力。
而用户使用这些通用能力时,只需要配置一些参数即可。如
250px|700px|reset
5.让机器人帮我们执行复杂逻辑
有时候我们需要自定义一些指令让机器人帮我们执行,比如询问机器人我的开发单制作进度,让机器人帮我去执行打包等等。
这时候就需要在平台上可以编写自己的逻辑代码。
我们支持使用最多的python语言来编写自定义指令。
6.封装简化常用飞书API,让用户的调用不再复杂
以最常用的发送消息为例,执行一个消息发送需要先获取tenant_access_token,再调用飞书API。为此我们还要先去拿应用的AppSecret等。这些流程相对有一定的理解成本。
SmartRobot为接入的机器人和用户提供简单快捷的open-api,包括发送普通消息和卡片消息等。
250px|700px|reset
五、应用效果
目前已有多个团队和方向在SmartRobot平台创建自己的指令,确实达到了简单快捷提效的预期目标
250px|700px|reset
而日常中,平台接入的机器人是服务大家平时工作的重要助手
六、总结
飞书后台能力是个强大而丰富的资源库,SmartRobot希望可以成为一座桥梁,方便大部分普通用户方便的获取和使用这些能力。