美文网首页
钉钉发送消息的代码实现

钉钉发送消息的代码实现

作者: 天草二十六_简村人 | 来源:发表于2022-12-16 00:23 被阅读0次

一、说在前面的话

本文的代码,是转自于power-job开源项目。希望可以帮助到对接钉钉的同学。

       <!-- DingTalk SDK. -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>1.0.1</version>
        </dependency>

二、accessToken定时刷新

使用一个定时任务线程池ScheduledExecutorService,每隔6000秒刷新,因为accessToken的过期时间是7200秒。

    public DingTalkUtils(String appKey, String appSecret) {

        this.sendMsgClient = new DefaultDingTalkClient(SEND_URL);
        this.accessTokenClient = new DefaultDingTalkClient(GET_TOKEN_URL);
        this.userIdClient = new DefaultDingTalkClient(GET_USER_ID_URL);

        refreshAccessToken(appKey, appSecret);

        if (StringUtils.isEmpty(accessToken)) {
            throw new PowerJobException("fetch AccessToken failed, please check your appKey & appSecret");
        }

        scheduledPool = Executors.newSingleThreadScheduledExecutor();
        scheduledPool.scheduleAtFixedRate(() -> refreshAccessToken(appKey, appSecret), FLUSH_ACCESS_TOKEN_RATE, FLUSH_ACCESS_TOKEN_RATE, TimeUnit.SECONDS);
    }

获取accessToken

/**
     * 获取 AccessToken,AccessToken 是调用其他接口的基础,有效期 7200 秒,需要不断刷新
     * @param appKey 应用 appKey
     * @param appSecret 应用 appSecret
     */
    private void refreshAccessToken(String appKey, String appSecret) {
        try {
            OapiGettokenRequest req = new OapiGettokenRequest();
            req.setAppkey(appKey);
            req.setAppsecret(appSecret);
            req.setHttpMethod(HttpMethod.GET.name());
            OapiGettokenResponse rsp = accessTokenClient.execute(req);

            if (rsp.isSuccess()) {
                accessToken = rsp.getAccessToken();
            }else {
                log.warn("[DingTalkUtils] flush accessToken failed with req({}),code={},msg={}.", req.getTextParams(), rsp.getErrcode(), rsp.getErrmsg());
            }
        } catch (Exception e) {
            log.warn("[DingTalkUtils] flush accessToken failed.", e);
        }
    }

三、实现Closeable接口

public class DingTalkUtils implements Closeable {

    private final DingTalkClient sendMsgClient;
    private final DingTalkClient accessTokenClient;
    private final DingTalkClient userIdClient;
    private final ScheduledExecutorService scheduledPool;

    private static final long FLUSH_ACCESS_TOKEN_RATE = 6000;
    private static final String GET_TOKEN_URL = "https://oapi.dingtalk.com/gettoken";
    private static final String SEND_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2";
    private static final String GET_USER_ID_URL = "https://oapi.dingtalk.com/user/get_by_mobile";


    @Override
    public void close() throws IOException {
        scheduledPool.shutdownNow();
    }
}

四、根据手机号查询用户ID

    public String fetchUserIdByMobile(String mobile) throws Exception {
        OapiUserGetByMobileRequest request = new OapiUserGetByMobileRequest();
        request.setMobile(mobile);

        OapiUserGetByMobileResponse execute = userIdClient.execute(request, accessToken);
        if (execute.isSuccess()) {
            return execute.getUserid();
        }
        log.info("[DingTalkUtils] fetch userId by mobile({}) failed,reason is {}.", mobile, execute.getErrmsg());
        throw new PowerJobException("fetch userId by phone number failed, reason is " + execute.getErrmsg());
    }

五、发送钉消息

   public void sendMarkdownAsync(String title, List<MarkdownEntity> entities, String userList, Long agentId) throws Exception {
        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
        request.setUseridList(userList);
        request.setAgentId(agentId);
        request.setToAllUser(false);

        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();

        StringBuilder mdBuilder=new StringBuilder();
        mdBuilder.append("## ").append(title).append("\n");
        for (MarkdownEntity entity:entities){
            mdBuilder.append("#### ").append(entity.title).append("\n");
            mdBuilder.append("> ").append(entity.detail).append("\n\n");
        }

        msg.setMsgtype("markdown");
        msg.setMarkdown(new OapiMessageCorpconversationAsyncsendV2Request.Markdown());
        msg.getMarkdown().setTitle(title);
        msg.getMarkdown().setText(mdBuilder.toString());
        request.setMsg(msg);

        sendMsgClient.execute(request, accessToken);
    }

    @AllArgsConstructor
    public static final class MarkdownEntity {
        private String title;
        private String detail;
    }

相关文章

网友评论

      本文标题:钉钉发送消息的代码实现

      本文链接:https://www.haomeiwen.com/subject/tbrdqdtx.html