關於釘釘機器人同時發送多羣踩過的大坑!!

首先說一下需求

          每天定時往釘釘的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);

 

結果意外出來了:

後續。。。。。

               我找到管理員把他給弄死了.............

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章