【工具与中间件】快速构建飞书群聊机器人

先进团队用飞书,先进飞书群聊有......

0. 前言

科技蓬勃发展的今天,我们可以轻松拥有属于自己/团队的机器人。日常工作与生活中,我们可以创建各种各样的机器人来帮助我们传递信息,甚至可以接入大语言模型或者其它 AI 神经网络,来实现各种各样的回复功能,进一步解放生产力。而作为日常工作中经常使用的飞书,更是提供了可以非常快速入门的自定义机器人来帮助我们做日常管理。

幸运的是,小编本人单位最近就全面采用飞书进行行政管理与团队沟通、任务统筹工作。这也让小编本人有机会接触将后端告警信息接入飞书机器人的业务。本文记录本次根据官方文档实现业务接入机器人的简单入门过程。一来对个人而言作为一次笔记记录,方便日后回顾与拓展;二来希望帮助到有需要的读者快速入门接入飞书机器人。

需求描述
创建飞书机器人,并通过 Webhook 的方式请求飞书,将监控信息接入飞书群聊,及时通知开发团队,提高整体效率。

  • 演示创建机器人的过程;
  • 直接通过 Webhook 的方式请求,其本质是一次 Http 请求,一般情况下为POST 请求;
  • 实现过程以 Java 代码示例;

参考教程
飞书官方文档

1. 无痛入门

我们团队首次使用飞书不到半月。短短几天内我的领导就已经将 Jekins 项目构建监控信息接入了飞书,我也收到了研发改善性需求,遂从入门到简单接入业务开始,从个人版到企业飞书,创建了一个业务监控机器人。

本小节介绍飞书群聊创建机器人,先在个人版做演示。

1.1 飞书创建群聊机器人

截图演示:快速创建群聊机器人,此处以个人版的示例群聊为例。

第1步:目标群聊
1

第2步:点击创建机器人
2

第3步:设置信息
3

第4步:注意保管好Webhook地址
4

至此,基本创建完毕,我们先不勾选安全测试,先调用通过,再通过官方建议设置安全策略。

1.2 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,一样实现请求。再不行,直接抄上文的测试类也是可以的。

测试结果
5

好了,基本测试通过,接下来我们来稍微完善一下。

1.3 设置安全策略

我们回到机器人调用界面,发现安全策略提醒。此处我们选取签名认证的方式来示例。
6

通过官方文档快速实现前面认证
根据官方文档的描述,我们可以写一个同款生成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);
    }

注意,根据官方文档的说明,还要带上时间戳,具体详见上述方法。

测试结果
7

恭喜,已完成入门!接下来是实战了!

2. 实战

本文截取部分已脱敏的个人工作实战代码来示例,演示将 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());
 }

复用我们入门的时候的代码即可,非常好用!

实际效果部分截图
8

3. 总结

3.1 使用体验

本次飞书创建机器人,快速入门调用接口非常方便,飞书文档简单易读,调用起来方便快捷,且兼容性强。不像WeChat机器人,需要另辟蹊径。通过快速构建简单易用的机器人并快速接入我们所需业务,一方面在开发者眼中,可以快速实现基础业务,方便进一步优化以及开发;另一方面在用户体验中,短时间就能实现飞书机器人并及时收到通知,多是一件美事。但对于深度使用飞书的用户与开发者来说,只入门基础调用可能还不够,但快速入门至少是能最快迈出第一步。

但是要注意,由于简单易用的特性,任何人都能快速入门并快速调用你的机器人,飞书群聊机器人的Webhook地址务必要保护好!重要的事情说三遍:务必保护好机器人Webhook地址!务必保护好机器人Webhook地址!务必保护好机器人Webhook地址!

3.2 深入使用建议

飞书机器人可以实现的功能还有很多很多,本文只是将飞书官方文档筛选一遍,只取最快速入门的一部分,结合个人实践代码入门一遍。对于飞书机器人的深度使用,如消息卡片、接入其它第三方工具、机器人交互等,还请继续阅读官方文档。飞书的官方文档简单易懂且详尽,调用方便快捷,相信你可以通过飞书官方文档,构建出更好用,更有价值的机器人!

  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人形机器人常用的通信中间件有很多选择,以下是一些常见的通信中间件: 1. ROS(Robot Operating System):ROS是一个开源的机器人软件平台,提供了一套通信和工具库,用于实现机器人系统中的各个组件之间的通信和协作。ROS支持多种编程语言,并提供了丰富的功能和工具,广泛应用于人形机器人和其他类型的机器人系统。 2. MQTT(Message Queuing Telemetry Transport):MQTT是一种轻量级的消息传输协议,适用于低带宽和不稳定网络环境下的物联网设备之间的通信。MQTT使用发布-订阅模式,可以实现实时、可靠的消息传递。人形机器人可以使用MQTT作为通信中间件来实现与其他设备或系统的数据交换。 3. DDS(Data Distribution Service):DDS是一种面向数据的实时通信协议,用于在分布式系统中高效地传输和共享数据。DDS支持发布-订阅和请求-响应模式,并提供了可靠性、实时性和安全性等特性。人形机器人可以使用DDS作为通信中间件来实现与其他机器人或控制系统的数据交换和协作。 4. ZeroMQ:ZeroMQ是一个简单、高效的消息传输库,提供了多种通信模式和传输协议的支持。ZeroMQ可以在不同的编程语言和平台上使用,适用于构建分布式系统和实现异步通信。人形机器人可以使用ZeroMQ作为通信中间件来实现与其他设备或系统的数据交换。 5. OPC UA(OPC Unified Architecture):OPC UA是一种面向工业自动化领域的通信协议,用于实现不同厂商和设备之间的数据交换和集成。OPC UA提供了可靠、安全的通信机制,并支持多种传输协议。人形机器人可以使用OPC UA作为通信中间件与其他工业设备进行集成和通信。 这些通信中间件都有各自的特点和适用场景,具体选择应根据人形机器人的需求和系统架构来确定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值