赞
踩
科技蓬勃发展的今天,我们可以轻松拥有属于自己/团队的机器人。日常工作与生活中,我们可以创建各种各样的机器人来帮助我们传递信息,甚至可以接入大语言模型或者其它 AI 神经网络,来实现各种各样的回复功能,进一步解放生产力。而作为日常工作中经常使用的飞书,更是提供了可以非常快速入门的自定义机器人来帮助我们做日常管理。
幸运的是,小编本人单位最近就全面采用飞书进行行政管理与团队沟通、任务统筹工作。这也让小编本人有机会接触将后端告警信息接入飞书机器人的业务。本文记录本次根据官方文档实现业务接入机器人的简单入门过程。一来对个人而言作为一次笔记记录,方便日后回顾与拓展;二来希望帮助到有需要的读者快速入门接入飞书机器人。
需求描述
创建飞书机器人,并通过 Webhook 的方式请求飞书,将监控信息接入飞书群聊,及时通知开发团队,提高整体效率。
参考教程
飞书官方文档
我们团队首次使用飞书不到半月。短短几天内我的领导就已经将 Jekins 项目构建监控信息接入了飞书,我也收到了研发改善性需求,遂从入门到简单接入业务开始,从个人版到企业飞书,创建了一个业务监控机器人。
本小节介绍飞书群聊创建机器人,先在个人版做演示。
截图演示:快速创建群聊机器人,此处以个人版的示例群聊为例。
第1步:目标群聊
第2步:点击创建机器人
第3步:设置信息
第4步:注意保管好Webhook地址
至此,基本创建完毕,我们先不勾选安全测试,先调用通过,再通过官方建议设置安全策略。
Webhook 调用 的本质是 Http 请求。以下以 Java 为例。
创建一个测试类,再发送 Http 请求
测试类
@Test void firstRobotTest() throws IOException, NoSuchAlgorithmException, InvalidKeyException { String webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/[secert]"; // 定义 webhook 的 URL 地址 URL url = new URL(webhook); // 创建一个 HTTP POST 请求 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // 设置请求头 connection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 设置请求体 // 创建一个 JSON 对象 JSONObject jsonObject = new JSONObject(); jsonObject.put("msg_type", "text"); jsonObject.put("content", "{ \"text\": \"Hello, I'm a new robot from Sharry! Nice to meet U guys\" }"); // 将 JSON 对象转换为字符串 String payload = JSON.toJSONString(jsonObject); connection.getOutputStream().write(payload.getBytes()); // 获取响应状态码 int statusCode = connection.getResponseCode(); System.out.println("HTTP status code: " + statusCode); }
说明:这里涉及两个小核心,一个是需要我们保管好的Webhook地址,因此示例代码的实际webhook用[secert]
代替,另一个就是如何发送 Http 请求。一般来说,发送 Http 请求是我们程序猿的基本功,但又不巧的是,日常工作中直接手写发送Http请求或许也不是十分频繁,框架帮我们做了嘛。而好消息是,飞书机器人入门真的好简单,当我们忘了这部分知识时,我们甚至可以通过官方文档的说明+度娘或GPT,一样实现请求。再不行,直接抄上文的测试类也是可以的。
测试结果
好了,基本测试通过,接下来我们来稍微完善一下。
我们回到机器人调用界面,发现安全策略提醒。此处我们选取签名认证的方式来示例。
通过官方文档快速实现前面认证
根据官方文档的描述,我们可以写一个同款生成Sign信息方法,也可以直接复用官方文档的示例,以下是复制官方文档的生成Sign方法:
private static String GenSign(String secret, int timestamp) throws NoSuchAlgorithmException, InvalidKeyException {
//把timestamp+"\n"+密钥当做签名字符串
String stringToSign = timestamp + "\n" + secret;
//使用HmacSHA256算法计算签名
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] signData = mac.doFinal(new byte[]{});
return new String(Base64.encodeBase64(signData));
}
组装请求体
@Test void firstRobotTest() throws IOException, NoSuchAlgorithmException, InvalidKeyException { String webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/[secert]"; // 定义 webhook 的 URL 地址 URL url = new URL(webhook); // 创建一个 HTTP POST 请求 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // 设置请求头 connection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 设置请求体 // 创建一个 JSON 对象 JSONObject jsonObject = new JSONObject(); jsonObject.put("msg_type", "text"); jsonObject.put("content", "{ \"text\": \"Hello, I'm a new robot from Sharry! With sign this time\" }"); // 签名信息 int timestamp = (int) (System.currentTimeMillis() / 1000); String sign = GenSign(SECRET, timestamp); jsonObject.put("timestamp", timestamp); jsonObject.put("sign", sign); // 将 JSON 对象转换为字符串 String payload = JSON.toJSONString(jsonObject); connection.getOutputStream().write(payload.getBytes()); // 获取响应状态码 int statusCode = connection.getResponseCode(); System.out.println("HTTP status code: " + statusCode); }
注意,根据官方文档的说明,还要带上时间戳,具体详见上述方法。
测试结果
恭喜,已完成入门!接下来是实战了!
本文截取部分已脱敏的个人工作实战代码来示例,演示将 Sping filter chains 的一个监控信息先组装一下通知信息Json,再通过 Webhook 的调用方式及时通知到飞书群。
有了上述基础,直接上代码示例,应该很好理解。注意,文中涉及的 Filter 与 Druid 等 的其它配置,请读者参考其它文档。
Spring Filter 调用Webhook 实现监控信息发到飞书群
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // Filter逻辑处理方法 HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; long startTime = System.nanoTime(); filterChain.doFilter(servletRequest, servletResponse); long endTime = System.nanoTime(); long executeTime = endTime - startTime; if (executeTime >= THRESHOLD_NANO) { // 获取请求路径 String url = httpServletRequest.getRequestURI(); String tips = "详细信息请查阅Druid监控及日志"; // 定义 webhook 的 URL 地址 URL targetUrl = new URL(webhook); // 创建一个 HTTP POST 请求 HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // 设置请求头 connection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 设置请求体 // 创建一个 JSON 对象 HashMap<String,String> contentMap = new HashMap<>(2); String message = "慢SQL或业务整体缓慢 警告: 执行时间" + executeTime / 1000 / 1000 + " ms, 接口路径" + url + "\n" +tips; contentMap.put("text", message); JSONObject jsonObject = new JSONObject(); jsonObject.put("msg_type", "text"); jsonObject.put("content", contentMap); // 签名信息 int timestamp = (int) (System.currentTimeMillis() / 1000); String sign = null; try { sign = GenSign(SECRET, timestamp); } catch (NoSuchAlgorithmException | InvalidKeyException e) { throw new RuntimeException(e); } jsonObject.put("timestamp", timestamp); jsonObject.put("sign", sign); // 将 JSON 对象转换为字符串 String payload = JSON.toJSONString(jsonObject); connection.getOutputStream().write(payload.getBytes()); }
复用我们入门的时候的代码即可,非常好用!
实际效果部分截图
本次飞书创建机器人,快速入门调用接口非常方便,飞书文档简单易读,调用起来方便快捷,且兼容性强。不像WeChat机器人,需要另辟蹊径。通过快速构建简单易用的机器人并快速接入我们所需业务,一方面在开发者眼中,可以快速实现基础业务,方便进一步优化以及开发;另一方面在用户体验中,短时间就能实现飞书机器人并及时收到通知,多是一件美事。但对于深度使用飞书的用户与开发者来说,只入门基础调用可能还不够,但快速入门至少是能最快迈出第一步。
但是要注意,由于简单易用的特性,任何人都能快速入门并快速调用你的机器人,飞书群聊机器人的Webhook地址务必要保护好!重要的事情说三遍:务必保护好机器人Webhook地址!务必保护好机器人Webhook地址!务必保护好机器人Webhook地址!
飞书机器人可以实现的功能还有很多很多,本文只是将飞书官方文档筛选一遍,只取最快速入门的一部分,结合个人实践代码入门一遍。对于飞书机器人的深度使用,如消息卡片、接入其它第三方工具、机器人交互等,还请继续阅读官方文档。飞书的官方文档简单易懂且详尽,调用方便快捷,相信你可以通过飞书官方文档,构建出更好用,更有价值的机器人!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。