Java_钉钉发送私聊消息

本文介绍了如何利用钉钉API批量发送单聊消息,包括创建企业内部应用、获取AppKey和AppSecret、创建和开启机器人、引入JAR包以及示例代码,旨在帮助开发者实现高效的消息发送功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

随着公司体量的越来越庞大,很多时候需要用到部门协同,所以钉钉(DingTalk)应运而生。
钉钉(DingTalk)是阿里巴巴集团打造的企业级智能移动办公平台,引领未来新一代工作方式,将陪伴每一个企业成长,是数字经济时代的企业组织协同办公和应用开发平台,是新生产力工具。
有时候钉钉需要通过定时任务去给某一个人发送私聊消息,当然群聊消息也可以,只不过群消息的前提是先建群,然后在群里添加钉钉机器人,并且工作群一旦多了,消息看的也就没那么及时,所以群消息在某一些场景下没那么便捷,或者可以说没有那么高效。

一、文档地址

Api文档地址:批量发送单聊消息

二、使用步骤

1.创建企业内部应用

在这里插入图片描述

2、获取应用AppKey和AppSecret

获取应用AppKey和AppSecret

3.创建机器人

在这里插入图片描述

创建机器人

4.开启机器人

开启机器人

5.发布机器人

发布机器人

6.开启应用权限

开启应用权限

7.引入JAR包

		<!-- 钉钉对接机器人 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dingtalk</artifactId>
            <version>1.5.24</version>
        </dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>2.0.0</version>
        </dependency>

三、示例代码

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalkrobot_1_0.Client;
import com.aliyun.dingtalkrobot_1_0.models.BatchSendOTOHeaders;
import com.aliyun.dingtalkrobot_1_0.models.BatchSendOTORequest;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiV2DepartmentListsubRequest;
import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
import com.smallrig.common.response.ding.DeptInfoResp;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * @author zhushuang
 * @program: nakadai
 * @description: 钉钉发送私聊消息
 * @time 2023/1/13
 */
@Component
@Slf4j
public class DingSendPrivateChatMsgService {


    // 企业凭证,两小时一更新
    private static String enterpriseToken = "";
    // 应用凭证
    private static String appkey = "你的应用AppKey";
    private static String appsecret = "你的应用AppSecret";

    // 获取token,每两小时失效
    public static void getToken() {
        try {
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
            OapiGettokenRequest req = new OapiGettokenRequest();
            req.setAppkey(appkey);
            req.setAppsecret(appsecret);
            req.setHttpMethod("GET");
            OapiGettokenResponse rsp = client.execute(req);
            log.info("token:" + rsp.getBody());
            JSONObject json = JSON.parseObject(rsp.getBody());
            enterpriseToken = json.getString("access_token");
        } catch (ApiException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用 Token 初始化账号Client
     *
     * @return Client
     * @throws Exception
     */
    private static Client createClient() throws Exception {
        Config config = new Config();
        config.protocol = "https";
        config.regionId = "central";
        return new Client(config);
    }

    /**
     * 发送钉钉消息
     *
     * @param dingUserId 钉钉用户id
     * @param content    发送消息内容
     * @return void
     */
    public static void createDingNotify(String dingUserId, String content) throws Exception {
        if (StringUtils.isBlank(enterpriseToken)) {
            getToken();
        }
        Client client = createClient();
        BatchSendOTOHeaders batchSendOTOHeaders = new BatchSendOTOHeaders();
        batchSendOTOHeaders.xAcsDingtalkAccessToken = enterpriseToken;
        BatchSendOTORequest batchSendOTORequest = new BatchSendOTORequest()
                .setRobotCode(appkey)//机器人appkey
                .setUserIds(Arrays.asList(dingUserId))
                .setMsgKey("officialTextMsg")
                .setMsgParam("{ \"content\": \"" + content + "\" }");
        try {
            client.batchSendOTOWithOptions(batchSendOTORequest, batchSendOTOHeaders, new RuntimeOptions());
        } catch (TeaException err) {
            if (!Common.empty(err.code) && !Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error(err.code + ":" + err.message);
                // 企业凭证enterpriseToken不合法导致出错时获取新企业凭证并重试
                if (err.code.equals("InvalidAuthentication")) {
                    getToken();
                    createDingNotify(dingUserId, content);
                }
            }
        } catch (Exception e) {
            TeaException err = new TeaException(e.getMessage(), e);
            if (!Common.empty(err.code) && !Common.empty(err.message)) {
                // err中含有code和message 属性,可帮助开发定位问题
                log.error(err.code + ":" + err.message);
            }

        }
    }

    /**
     * 发送钉钉消息
     *
     * @param phone 用户手机号
     * @return void
     */
    public static String getDingdingUserIdByPhone(String phone) {
        try {
            if (StringUtils.isBlank(enterpriseToken)) {
                getToken();
            }
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");
            OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
            req.setMobile(phone);
            OapiV2UserGetbymobileResponse rsp = client.execute(req, enterpriseToken);
            if (rsp != null) {
                OapiV2UserGetbymobileResponse.UserGetByMobileResponse result = rsp.getResult();
                return result == null ? null : result.getUserid();
            }
        } catch (ApiException e) {
            log.error(e.getErrMsg(), e);
        }
        return null;
    }
}

四、成功示例

在这里插入图片描述
这里不在将调用代码放出来了,毕竟。。。调用大家都会

原创不易,望一键三连 (^ _ ^)

在Python中,要实现向钉钉机器人发送私聊消息,可以通过钉钉提供的Webhook机制来完成。Webhook是一种允许用户将应用事件通知到其他服务器的简单HTTP回调。具体步骤如下: 1. 首先,你需要在钉钉群中添加一个自定义机器人。在群聊界面中点击群设置,然后选择“群机器人”,添加一个机器人并获取它的Webhook URL。 2. 获取Webhook URL之后,你可以使用Python的`requests`库来发送HTTP POST请求到这个URL。发送的内容需要按照钉钉规定的消息格式进行封装,通常是JSON格式的数据。 3. 需要注意的是,钉钉机器人API可能会要求发送消息内容通过特定的签名算法进行验证,以确保消息的安全性。因此,在发送消息之前,你可能需要先计算一个签名,并将其包含在HTTP请求的Header中。 4. 发送消息类型可以是文本、图片、文件等多种格式,具体取决于你的需求和钉钉机器人的支持能力。 以下是一个简单的Python代码示例,展示了如何使用`requests`库发送文本消息钉钉机器人: ```python import requests import hashlib import json import hmac import base64 import time def build_sign(secret, string_to_sign): secret_enc = secret.encode('utf-8') string_to_sign_enc = string_to_sign.encode('utf-8') hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() sign = urllib.parse.quote_plus(base64.b64encode(hmac_code)) return sign def send_dingtalk_message(webhook, msg, secret): timestamp = str(round(time.time() * 1000)) string_to_sign = '{}\n{}'.format(timestamp, secret) sign = build_sign(secret, string_to_sign) url = webhook + '&timestamp={}&sign={}'.format(timestamp, sign) headers = { 'Content-Type': 'application/json; charset=utf-8' } data = { 'msgtype': 'text', 'text': { 'content': msg } } response = requests.post(url, headers=headers, data=json.dumps(data)) return response.json() # 使用示例 webhook = 'https://oapi.dingtalk.com/robot/send?access_token=你的access_token' msg = '这是一条测试消息' secret = '你的机器人安全设置中的secret' result = send_dingtalk_message(webhook, msg, secret) print(result) ``` 在使用上述代码时,请替换`webhook`变量中的`你的access_token`和`secret`变量中的`你的机器人安全设置中的secret`为你实际获取到的信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值