0. 前言
Webhook是一种网络回调机制,允许一个应用程序在特定事件发生时通知另一个应用程序。这种通知通常是通过HTTP POST请求发送给预先设定的URL(即Webhook端点)。当事件触发时,如数据库更新、文件上传完成、支付确认等,源系统会向目标URL发送数据。这种方式使得两个系统能够实时交互,而不需要定期轮询。
企业微信、飞书、钉钉等企业级协作工具中的自定义机器人功能,常常使用Webhook作为实现自动消息传递的核心机制。在当今快速发展的数字化时代,自动化和即时通讯成为了提升工作效率的关键因素。企业微信、飞书、钉钉等协作平台凭借其强大的沟通和管理功能,已经成为许多企业和组织日常运营的基石。然而,随着业务需求的日益复杂,仅仅依赖平台的基础功能已无法满足定制化和自动化的高级需求。因此,Webhook在这些平台中扮演了桥梁的角色,使得自定义机器人能够与外部服务进行实时通信,实现更高级的自动化功能。
让我们一起踏上这段旅程,解锁Webhook自定义机器人的无限潜力,让自动化成为推动企业创新和成长的新动力。
1. 企业微信(WeCom)
1.1 在群组中添加自定义机器人
- 首先你得有一个企业微信群。然后才能邀请自定义机器人进群。我这里已经创建好了。
- 点击自定义机器人就可以看到详情:
特别特别要注意:一定要保护好机器人的webhook地址,避免泄漏!不要分享到github、博客等可被公开查阅的地方,否则坏人就可以用你的机器人来发垃圾消息了。
- 可以在终端先试下curl命令,这里直接填入URL即可正常执行!
1.2 测试调用自定义机器人的 webhook 地址,向所在群组发送消息。
官方网址:https://developer.work.weixin.qq.com/document/path/99110
- 仔细查看文档,重点看curl的请求参数命令。
- 代码实现。代码实际上就是在模拟curl命令这个过程,只不过不同的Webhook规范不一样,需要查看官方API文档。
注意:这里在模拟的时候,需要引入两个依赖。这两个Maven依赖项分别用于处理编码解码操作和HTTP请求
</dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.1</version></dependency></dependencies>
importokhttp3.*;importjava.io.IOException;/**
* @author Juechen
* @version : WeComWebhookSender.java
*/publicclassWeComWebhookSender{privatestaticvoidWeCom(String url,String text){OkHttpClient client =newOkHttpClient();String webhookUrl = url;String payload ="{\"msgtype\": \"text\",\"text\": {\"content\": \""+ text +"\"}}";RequestBody requestBody =RequestBody.create(payload,MediaType.parse("application/json; charset=utf-8"));Request request =newRequest.Builder().url(webhookUrl).post(requestBody).addHeader("Content-Type","application/json").build();try(Response response = client.newCall(request).execute()){if(!response.isSuccessful()){thrownewIOException("Unexpected code "+ response);}System.out.println(response.body().string());}catch(IOException e){thrownewRuntimeException(e);}}publicstaticvoidmain(String[] args){String url ="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxx";String text ="企业微信,共创未来!";WeCom(url, text);}}
- 返回企业微信,消息发送成功!
2. 飞书(Lark)
2.1 在群组中添加自定义机器人
- 邀请自定义机器人进群。我这里已经创建好了。
- 获取自定义机器人的 webhook 地址以及加密密钥。详情点击
帮助文档
链接。
请妥善保存好此 webhook 地址,不要公布在 Gitlab、博客等可公开查阅的网站上,避免地址泄露后被恶意调用发送垃圾消息。
2.2 测试调用自定义机器人的 webhook 地址,向所在群组发送消息。
官方网址:https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot
- 仔细查看文档,重点看curl的请求参数命令以及加密密钥的签名算法方法。
- 代码实现。代码实际上就是在模拟curl命令这个过程,只不过不同的Webhook规范不一样,需要查看官方API文档。签名方法直接复制即可!
注意:这里在模拟的时候,需要引入两个依赖。这两个Maven依赖项分别用于处理编码解码操作和HTTP请求
</dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.1</version></dependency></dependencies>
importokhttp3.*;importjavax.crypto.Mac;importjavax.crypto.spec.SecretKeySpec;importjava.io.IOException;importjava.nio.charset.StandardCharsets;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importorg.apache.commons.codec.binary.Base64;/**
* @author Juechen
* @version : LarkWebhookSender.java
*/publicclassLarkWebhookSender{privatestaticfinalStringHMAC_SHA256_ALGORITHM="HmacSHA256";privatestaticvoidLark(String secretKey,String url)throwsNoSuchAlgorithmException,InvalidKeyException{OkHttpClient client =newOkHttpClient();String webhookUrl = url;String secret = secretKey;int timestamp =(int)(System.currentTimeMillis()/1000);String signature =GenSign(secret, timestamp);String payload ="{\"timestamp\": \""+ timestamp +"\",\"sign\": \""+ signature +"\",\"msg_type\":\"text\",\"content\":{\"text\":\"飞书,天下无敌!\"}}";RequestBody body =RequestBody.create(payload,MediaType.parse("application/json; charset=utf-8"));Request request =newRequest.Builder().url(webhookUrl).post(body).addHeader("Content-Type","application/json").build();try(Response response = client.newCall(request).execute()){if(!response.isSuccessful()){thrownewIOException("Unexpected code "+ response);}System.out.println(response.body().string());}catch(IOException e){thrownewRuntimeException(e);}}privatestaticStringGenSign(String secret,int timestamp)throwsNoSuchAlgorithmException,InvalidKeyException{String stringToSign = timestamp +"\n"+ secret;Mac mac =Mac.getInstance(HMAC_SHA256_ALGORITHM);
mac.init(newSecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8),HMAC_SHA256_ALGORITHM));byte[] signData = mac.doFinal(newbyte[]{});returnnewString(Base64.encodeBase64(signData));}publicstaticvoidmain(String[] args)throwsNoSuchAlgorithmException,InvalidKeyException{String webhookUrl ="https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx";String secret ="xxxxxxxx";Lark(secret, webhookUrl);}}
- 返回飞书客户端,消息发送成功!
- 想在终端试下curl命令,为上面代码添加输出
timestamp
和signature
的逻辑即可正常执行!注意拼接方式与钉钉的不同!
3. 钉钉(DingTalk)
3.1 在群组中添加自定义机器人
- 邀请自定义机器人进群。我这里已经创建好了。
- 获取自定义机器人的 webhook 地址以及加密密钥。详情点击
查看文档
链接。
请保管好此 Webhook 地址,不要公布在外部网站上,泄露有安全风险。
3.2 测试调用自定义机器人的 webhook 地址,向所在群组发送消息。
官方文档:
https://open.dingtalk.com/document/orgapp/customize-robot-security-settings
https://open.dingtalk.com/document/orgapp/custom-bot-to-send-group-chat-messages
- 仔细查看文档,重点看curl的请求参数命令以及加密密钥的签名算法方法。
- 代码实现。代码实际上就是在模拟curl命令这个过程,只不过不同的Webhook规范不一样,需要查看官方API文档。这里我们不用官方
alibaba-dingtalk-service-sdk
这个依赖了,用通用的com.squareup.okhttp3
实现即可。
注意:这里在模拟的时候,需要引入两个依赖。这两个Maven依赖项分别用于处理编码解码操作和HTTP请求
</dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.1</version></dependency></dependencies>
importokhttp3.*;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.net.URLEncoder;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importjavax.crypto.Mac;importjavax.crypto.spec.SecretKeySpec;importorg.apache.commons.codec.binary.Base64;/**
* @author Juechen
* @version : DingTalkWebhookSender.java
*/publicclassDingTalkWebhookSender{privatestaticfinalStringHMAC_SHA256_ALGORITHM="HmacSHA256";privatestaticvoidDingTalk(String access_token,String secretKey,String text)throwsNoSuchAlgorithmException,UnsupportedEncodingException,InvalidKeyException{OkHttpClient client =newOkHttpClient();String secret = secretKey;Long timestamp =System.currentTimeMillis();String sign =generateSign(secret, timestamp);String webhookUrl = access_token +"&sign="+ sign +"×tamp="+ timestamp;String payload ="{\"msgtype\": \"text\",\"text\": {\"content\": \""+ text +"\"}}";RequestBody requestBody =RequestBody.create(payload,MediaType.parse("application/json; charset=utf-8"));Request request =newRequest.Builder().url(webhookUrl).post(requestBody).header("Content-Type","application/json").build();try(Response response = client.newCall(request).execute()){if(!response.isSuccessful()){thrownewIOException("Unexpected code "+ response);}System.out.println(response.body().string());}catch(IOException e){thrownewRuntimeException(e);}}privatestaticStringgenerateSign(String secret,Long timestamp)throwsNoSuchAlgorithmException,UnsupportedEncodingException,InvalidKeyException{String stringToSign = timestamp +"\n"+ secret;Mac mac =Mac.getInstance(HMAC_SHA256_ALGORITHM);
mac.init(newSecretKeySpec(secret.getBytes("UTF-8"),"HmacSHA256"));byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));returnURLEncoder.encode(newString(Base64.encodeBase64(signData)),"UTF-8");}publicstaticvoidmain(String[] args)throwsUnsupportedEncodingException,NoSuchAlgorithmException,InvalidKeyException{String secret ="xxxxxxxxx";String access_token ="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx";String text ="钉钉,让进步发生!";DingTalk(access_token, secret, text);}}
- 返回钉钉客户端,消息发送成功!
- 想在终端试下curl命令,为上面代码添加输出
timestamp
和sign
的逻辑即可正常执行!注意拼接方式与飞书的不同!
4.小结
在本文中,我们深入探讨了如何运用Java编程语言和Webhook技术,构建功能强大的自定义机器人,以自动化企业微信、飞书、钉钉等协作平台上的工作流程。这一旅程不仅是技术上的挑战,也是对现代企业自动化需求的深刻理解。本文只是对简单的
TEXT
文本类型进行了编写,你也可以查阅官方文档,添加更多的发送消息类型(Link链接消息、Markdown 类型、图片类型等等)。
总之,Java版Webhook机器人是技术与创意的结晶,它不仅能够简化日常工作,还能够激发新的业务模式和增长点。随着你对这一领域的深入了解和实践,相信你会发掘出更多令人惊喜的应用场景,让自动化的力量成为推动企业前进的强大引擎。
版权归原作者 玦尘❀ 所有, 如有侵权,请联系我们删除。