当前位置:   article > 正文

懒人福音:Java版Webhook机器人,一键开启‘躺赢’模式_java webhook怎么实现

java webhook怎么实现

0. 前言

Webhook是一种网络回调机制,允许一个应用程序在特定事件发生时通知另一个应用程序。这种通知通常是通过HTTP POST请求发送给预先设定的URL(即Webhook端点)。当事件触发时,如数据库更新、文件上传完成、支付确认等,源系统会向目标URL发送数据。这种方式使得两个系统能够实时交互,而不需要定期轮询。

企业微信飞书钉钉等企业级协作工具中的自定义机器人功能,常常使用Webhook作为实现自动消息传递的核心机制。在当今快速发展的数字化时代,自动化和即时通讯成为了提升工作效率的关键因素。企业微信、飞书、钉钉等协作平台凭借其强大的沟通和管理功能,已经成为许多企业和组织日常运营的基石。然而,随着业务需求的日益复杂,仅仅依赖平台的基础功能已无法满足定制化和自动化的高级需求。因此,Webhook在这些平台中扮演了桥梁的角色,使得自定义机器人能够与外部服务进行实时通信,实现更高级的自动化功能。

让我们一起踏上这段旅程,解锁Webhook自定义机器人的无限潜力,让自动化成为推动企业创新和成长的新动力。

1. 企业微信(WeCom)

1.1 在群组中添加自定义机器人

  1. 首先你得有一个企业微信群。然后才能邀请自定义机器人进群。我这里已经创建好了。
    在这里插入图片描述
    在这里插入图片描述
  2. 点击自定义机器人就可以看到详情:
    在这里插入图片描述

特别特别要注意:一定要保护好机器人的webhook地址,避免泄漏!不要分享到github、博客等可被公开查阅的地方,否则坏人就可以用你的机器人来发垃圾消息了。

  1. 可以在终端先试下curl命令,这里直接填入URL即可正常执行!
    在这里插入图片描述

1.2 测试调用自定义机器人的 webhook 地址,向所在群组发送消息。

官方网址:https://developer.work.weixin.qq.com/document/path/99110

  1. 仔细查看文档,重点看curl的请求参数命令。

在这里插入图片描述

  1. 代码实现。代码实际上就是在模拟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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
import okhttp3.*;

import java.io.IOException;

/**
 * @author Juechen
 * @version : WeComWebhookSender.java
 */
public class WeComWebhookSender {

    private static void WeCom(String url, String text) {
        OkHttpClient client = new OkHttpClient();
        String webhookUrl = url;

        String payload = "{\"msgtype\": \"text\",\"text\": {\"content\": \"" + text + "\"}}";

        RequestBody requestBody = RequestBody.create(payload, MediaType.parse("application/json; charset=utf-8"));

        Request request = new Request.Builder()
                .url(webhookUrl)
                .post(requestBody)
                .addHeader("Content-Type", "application/json")
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            System.out.println(response.body().string());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    public static void main(String[] args) {
        String url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxx";
        String text = "企业微信,共创未来!";

        WeCom(url, text);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  1. 返回企业微信,消息发送成功!
    在这里插入图片描述

2. 飞书(Lark)

2.1 在群组中添加自定义机器人

  1. 邀请自定义机器人进群。我这里已经创建好了。
    在这里插入图片描述

  2. 获取自定义机器人的 webhook 地址以及加密密钥。详情点击帮助文档链接。
    在这里插入图片描述

请妥善保存好此 webhook 地址,不要公布在 Gitlab、博客等可公开查阅的网站上,避免地址泄露后被恶意调用发送垃圾消息。

2.2 测试调用自定义机器人的 webhook 地址,向所在群组发送消息。

官方网址:https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot

  1. 仔细查看文档,重点看curl的请求参数命令以及加密密钥的签名算法方法。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 代码实现。代码实际上就是在模拟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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
import okhttp3.*;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Base64;

/**
 * @author Juechen
 * @version : LarkWebhookSender.java
 */
public class LarkWebhookSender {

    private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";

    private static void Lark(String secretKey, String url) throws NoSuchAlgorithmException, InvalidKeyException {
        OkHttpClient client = new OkHttpClient();
        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 = new Request.Builder()
                .url(webhookUrl)
                .post(body)
                .addHeader("Content-Type", "application/json")
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            System.out.println(response.body().string());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static String GenSign(String secret, int timestamp) throws NoSuchAlgorithmException, InvalidKeyException {
        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
        mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), HMAC_SHA256_ALGORITHM));
        byte[] signData = mac.doFinal(new byte[]{});
        return new String(Base64.encodeBase64(signData));
    }


    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
        String webhookUrl = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx";
        String secret = "xxxxxxxx";

        Lark(secret, webhookUrl);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  1. 返回飞书客户端,消息发送成功!
    在这里插入图片描述
  2. 想在终端试下curl命令,为上面代码添加输出timestampsignature的逻辑即可正常执行!注意拼接方式与钉钉的不同!
    在这里插入图片描述

3. 钉钉(DingTalk)

3.1 在群组中添加自定义机器人

  1. 邀请自定义机器人进群。我这里已经创建好了。
    在这里插入图片描述

  2. 获取自定义机器人的 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

  1. 仔细查看文档,重点看curl的请求参数命令以及加密密钥的签名算法方法。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 代码实现。代码实际上就是在模拟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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
import okhttp3.*;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

/**
 * @author Juechen
 * @version : DingTalkWebhookSender.java
 */
public class DingTalkWebhookSender {

    private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";

    private static void DingTalk(String access_token, String secretKey, String text) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        OkHttpClient client = new OkHttpClient();
        String secret = secretKey;
        Long timestamp = System.currentTimeMillis();

        String sign = generateSign(secret, timestamp);

        String webhookUrl = access_token + "&sign=" + sign + "&timestamp=" + timestamp;


        String payload = "{\"msgtype\": \"text\",\"text\": {\"content\": \"" + text + "\"}}";
        RequestBody requestBody = RequestBody.create(payload, MediaType.parse("application/json; charset=utf-8"));

        Request request = new Request.Builder()
                .url(webhookUrl)
                .post(requestBody)
                .header("Content-Type", "application/json")
                .build();


        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            System.out.println(response.body().string());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static String generateSign(String secret, Long timestamp) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        return URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
    }

    public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        String secret = "xxxxxxxxx";
        String access_token = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx";
        String text = "钉钉,让进步发生!";

        DingTalk(access_token, secret, text);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  1. 返回钉钉客户端,消息发送成功!
    在这里插入图片描述
  2. 想在终端试下curl命令,为上面代码添加输出timestampsign的逻辑即可正常执行!注意拼接方式与飞书的不同!
    在这里插入图片描述

4.小结

在本文中,我们深入探讨了如何运用Java编程语言和Webhook技术,构建功能强大的自定义机器人,以自动化企业微信、飞书、钉钉等协作平台上的工作流程。这一旅程不仅是技术上的挑战,也是对现代企业自动化需求的深刻理解。本文只是对简单的TEXT文本类型进行了编写,你也可以查阅官方文档,添加更多的发送消息类型(Link链接消息、Markdown 类型、图片类型等等)。

总之,Java版Webhook机器人是技术与创意的结晶,它不仅能够简化日常工作,还能够激发新的业务模式和增长点。随着你对这一领域的深入了解和实践,相信你会发掘出更多令人惊喜的应用场景,让自动化的力量成为推动企业前进的强大引擎。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/940527
推荐阅读
相关标签
  

闽ICP备14008679号