关于钉钉机器人同时发送多群踩过的大坑!!

首先说一下需求

          每天定时往钉钉的2个不同的群推送一些类似于秘钥的文字。

声明:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq/XAzBI 参考文档

我用的第二种签名加密方式创建的发送代码如下:

package com.jeecg.dingDing.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jeecg.dingDing.entity.TRobotGroupEntity;
import com.jeecg.dingDing.service.TRobotGroupServiceI;
import com.jeecg.sapjeecg.SapDingDingTask.HttpUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.util.Base64;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jeecgframework.core.annotation.JAuth;
import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.core.enums.Permission;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/query*****")
@JAuth(auth = Permission.SKIP_AUTH)//跳过认证
public class DingGroup {
    @Autowired
    private TRobotGroupServiceI tRobotGroupService;

    @RequestMapping(params = "querySend*****")
    @ResponseBody
    public AjaxJson querySendDingGroup(HttpServletRequest request) {
        SimpleDateFormat format = new SimpleDateFormat("MM月dd日");
        SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd");

        String message = null;
        AjaxJson j = new AjaxJson();
        message = "获取成功";
        String contentMsg = "";
        
        String secret1 = "SEC107ad4f4582cc5e96646d4***";
        String access_token1="153e3394979fc99c63e58ddc61b2439b04cd52a8995f1ca6***";
       
        String secret2 = "SEC178e5b5c8a9533f397f29f10b043e22666ed6c17ae76a1319668***";
        String access_token2="9781852943eef4bd6e7f69dc6aeea03a7c06b84a36155a85a0***";



        TRobotGroupEntity tRobotGroupEntity = tRobotGroupService.findUniqueByProperty(TRobotGroupEntity.class, "dateTime", dateTimeFormat.format(new Date()));
        if (tRobotGroupEntity!=null){
            contentMsg = tRobotGroupEntity.getContent();
            if(StringUtils.isNotBlank(contentMsg)){
                try{

                    //配置签名
                    Long timestamp1 = System.currentTimeMillis();
                    String stringToSign1 = timestamp1 + "\n" + secret1;
                    Mac mac1 = Mac.getInstance("HmacSHA256");
                    mac1.init(new SecretKeySpec(secret1.getBytes("UTF-8"), "HmacSHA256"));
                    byte[] signData1 = mac1.doFinal(stringToSign1.getBytes("UTF-8"));
                    String sign1 = URLEncoder.encode(new String(Base64.encodeBase64(signData1)),"UTF-8");
                    System.out.println(sign1);
                    //钉钉机器人地址(配置机器人的webhook)
                     String dingUrl1 = "https://oapi.dingtalk.com/robot/send?access_token="+access_token1+"&timestamp="+timestamp1+"&sign="+sign1+"";
                    //是否通知所有人
                    boolean isAtAll1 = true;
                    //通知具体人的手机号码列表
                    List<String> mobileList1 = Lists.newArrayList();
                    String  content1= contentMsg+format.format(new Date());
                    String reqStr1 = buildReqStr(content1, isAtAll1, mobileList1);
                    String result1 =  HttpUtils.doPostJson(dingUrl1, reqStr1);
                    System.out.println("result1 == " + result1);//result == {"errcode":0,"errmsg":"ok"}
                    /**
                     * 第二个群
                     */
                    CloseableHttpClient client = HttpClients.createDefault();
                    client.close();
                   // Thread.sleep(11000); // 休眠1秒
                    //配置签名
                    Long timestamp2 = System.currentTimeMillis();
                    String stringToSign2 = timestamp2 + "\n" + secret2;
                    Mac mac2 = Mac.getInstance("HmacSHA256");
                    mac2.init(new SecretKeySpec(secret2.getBytes("UTF-8"), "HmacSHA256"));
                    byte[] signData2 = mac2.doFinal(stringToSign2.getBytes("UTF-8"));
                    String sign2 = URLEncoder.encode(new String(Base64.encodeBase64(signData2)),"UTF-8");
                    System.out.println(sign2);
                    //钉钉机器人地址(配置机器人的webhook)
                     String dingUrl2 = "https://oapi.dingtalk.com/robot/send?access_token="+access_token2+"&timestamp="+timestamp2+"&sign="+sign2+"";
                    //是否通知所有人
                    boolean isAtAll2 = true;
                    //通知具体人的手机号码列表
                    List<String> mobileList2 = Lists.newArrayList();
                    String  content2= contentMsg+format.format(new Date());
                    String reqStr2 = buildReqStr(content2, isAtAll2, mobileList2);
                    String result2 =  HttpUtils.doPostJson(dingUrl2, reqStr2);
                    System.out.println("result2 == " + result2);//result == {"errcode":0,"errmsg":"ok"}

                }catch(Exception e){
                    e.printStackTrace();
                    message = "获取失败";
                    throw new org.jeecgframework.core.common.exception.BusinessException(e.getMessage());
                }
            }
        }else {
            message = "当日未配置发送数据";
        }
        j.setMsg(message);
        return j;
    }
    /**
     * 组装请求报文
     * @param content
     * @return
     */
    private static String buildReqStr(String content, boolean isAtAll, List<String> mobileList) {
        //消息内容
        Map<String, String> contentMap = Maps.newHashMap();
        contentMap.put("content", content);

        //通知人
        Map<String, Object> atMap = Maps.newHashMap();
        //1.是否通知所有人
        atMap.put("isAtAll", isAtAll);
        //2.通知具体人的手机号码列表
        atMap.put("atMobiles", mobileList);

        Map<String, Object> reqMap = Maps.newHashMap();
        reqMap.put("msgtype", "text");//image
        reqMap.put("text", contentMap);
        reqMap.put("at", atMap);

        return JSON.toJSONString(reqMap);
    }
}

返回结果:

      result1 == {"errcode":0,"errmsg":"ok"}
      result2 == {"errcode":0,"errmsg":"ok"}

看结果均返回成功。 boolean isAtAll = true;

结果发现测试的2个群和正式的2个群都是这个结果,但是有一个群就是收不到信息,如果把 是否@所有人设置为false 两个都可以发送。单个测试的时候,一个个也能成功。后来再次单个测试的时候,又没发送过去。

钉钉接口始终返回

      result1 == {"errcode":0,"errmsg":"ok"}
      result2 == {"errcode":0,"errmsg":"ok"}

或者:result2 == {"errcode":40004,"errmsg":"一堆乱码"}

​​​​​网上查询了错误代码 https://blog.csdn.net/weixin_40514790/article/details/104249446 参考错误代码地址

什么鬼看不懂,继续想.....

实在没办法,就换了一种方式

DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?access_token=566cc69da782ec******");
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("text");
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent("测试文本消息");
request.setText(text);
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList("132xxxxxxxx"));
request.setAt(at);
OapiRobotSendResponse response = client.execute(request);

 

结果意外出来了:

后续。。。。。

               我找到管理员把他给弄死了.............

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值