package com.dy.pipIrrGlobal.config; 
 | 
  
 | 
import com.dingtalk.api.DefaultDingTalkClient; 
 | 
import com.dingtalk.api.DingTalkClient; 
 | 
import com.dingtalk.api.request.OapiRobotSendRequest; 
 | 
import com.dingtalk.api.response.OapiRobotSendResponse; 
 | 
import com.taobao.api.ApiException; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.apache.commons.codec.binary.Base64; 
 | 
import org.springframework.core.env.Environment; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
import javax.crypto.Mac; 
 | 
import javax.crypto.spec.SecretKeySpec; 
 | 
import java.io.UnsupportedEncodingException; 
 | 
import java.net.URLEncoder; 
 | 
import java.security.InvalidKeyException; 
 | 
import java.security.NoSuchAlgorithmException; 
 | 
import java.util.Collections; 
 | 
import java.util.HashMap; 
 | 
import java.util.Map; 
 | 
  
 | 
/** 
 | 
 * @author ZhuBaoMin 
 | 
 * @date 2024-07-31 9:20 
 | 
 * @LastEditTime 2024-07-31 9:20 
 | 
 * @Description 钉钉客户端工具类 
 | 
 */ 
 | 
@Slf4j 
 | 
@Component 
 | 
public class DingTalk { 
 | 
    private static final String dingTalkConfigPriFix = "dingtalk"; 
 | 
    private static final Map<String, Option> optionsMap = new HashMap(); 
 | 
  
 | 
    class Option{ 
 | 
        public Boolean enable ; 
 | 
        public String robotUrl ; 
 | 
        public String robotAccessToken ; 
 | 
        public String secret ; 
 | 
        public Boolean atAll ; 
 | 
        public String mobile ; 
 | 
    } 
 | 
    /* 
 | 
    @Value("${dingtalk.robot.url}") 
 | 
    private String URL; 
 | 
  
 | 
    @Value("${dingtalk.robot.access-token}") 
 | 
    private String CUSTOM_ROBOT_TOKEN; 
 | 
  
 | 
    @Value("${dingtalk.robot.secret}") 
 | 
    private String SECRET; 
 | 
  
 | 
    @Value("${dingtalk.at-all}") 
 | 
    private Boolean AT_ALL; 
 | 
  
 | 
    @Value("${dingtalk.mobile}") 
 | 
    private String MOBILE; 
 | 
    */ 
 | 
  
 | 
    private Option getOptions(String orgTag, Environment env){ 
 | 
        Option vo = null ; 
 | 
        try{ 
 | 
            vo = optionsMap.get(orgTag); 
 | 
            if(vo == null){ 
 | 
                vo = new Option(); 
 | 
                String enableStr = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".enable"); 
 | 
                if(enableStr != null && !enableStr.trim().equals("")){ 
 | 
                    vo.enable = Boolean.valueOf(enableStr); 
 | 
                }else{ 
 | 
                    vo.enable = true ; 
 | 
                } 
 | 
                vo.robotUrl = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".robot.url"); 
 | 
                vo.robotAccessToken = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".robot.access-token"); 
 | 
                vo.secret = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".robot.secret"); 
 | 
                String atAllStr = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".at-all"); 
 | 
                if(atAllStr != null && !atAllStr.trim().equals("")){ 
 | 
                    vo.atAll = Boolean.valueOf(atAllStr); 
 | 
                }else{ 
 | 
                    vo.atAll = true ; 
 | 
                } 
 | 
                vo.mobile = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".mobile"); 
 | 
                optionsMap.put(orgTag, vo) ; 
 | 
            } 
 | 
        }catch (Exception e){ 
 | 
            vo = null ; 
 | 
        } 
 | 
        return vo ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 向钉钉群发送消息 
 | 
     * @param orgTag 
 | 
     * @param env 
 | 
     * @param message 
 | 
     */ 
 | 
    public void sendMessage(String orgTag, Environment env, String message) { 
 | 
        if(orgTag == null || orgTag.trim().equals("")){ 
 | 
            log.error("钉钉发送消息异常,机构标签为空"); 
 | 
            return; 
 | 
        } 
 | 
        if(env == null){ 
 | 
            log.error("钉钉发送消息异常,Spring环境为空"); 
 | 
            return; 
 | 
        } 
 | 
        if(message == null || message.trim().equals("")){ 
 | 
            log.error("钉钉发送消息异常,消息为空"); 
 | 
            return; 
 | 
        } 
 | 
        Option vo = this.getOptions(orgTag.trim(), env) ; 
 | 
        if(vo == null){ 
 | 
            log.error("钉钉发送消息异常,钉钉配置错误"); 
 | 
            return; 
 | 
        } 
 | 
        if(vo.enable){ 
 | 
            try { 
 | 
                Long timestamp = System.currentTimeMillis() ; 
 | 
                String stringToSign = timestamp + "\n" + vo.secret; 
 | 
                Mac mac = Mac.getInstance("HmacSHA256"); 
 | 
                mac.init(new SecretKeySpec(vo.secret.getBytes("UTF-8"), "HmacSHA256")); 
 | 
                byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); 
 | 
                String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8"); 
 | 
  
 | 
                //定义文本内容 
 | 
                OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text(); 
 | 
                text.setContent(message); 
 | 
                //定义 @对象 
 | 
                OapiRobotSendRequest.At at = new OapiRobotSendRequest.At(); 
 | 
                if(vo.atAll) { 
 | 
                    at.setIsAtAll(true); 
 | 
                }else { 
 | 
                    at.setAtMobiles(Collections.singletonList(vo.mobile)); 
 | 
                } 
 | 
  
 | 
                OapiRobotSendRequest req = new OapiRobotSendRequest(); 
 | 
                //设置消息类型 
 | 
                req.setMsgtype("text"); 
 | 
                req.setText(text); 
 | 
                req.setAt(at); 
 | 
  
 | 
                //sign字段和timestamp字段必须拼接到请求URL上,否则会出现 310000 的错误信息 
 | 
                DingTalkClient client = new DefaultDingTalkClient( vo.robotUrl + "?sign=" + sign + "×tamp=" + timestamp); 
 | 
                OapiRobotSendResponse rsp = client.execute(req, vo.robotAccessToken); 
 | 
                log.info(rsp.getBody()); 
 | 
            } catch (ApiException e) { 
 | 
                log.error("钉钉发送消息异常", e); 
 | 
                //e.printStackTrace(); 
 | 
            } catch (UnsupportedEncodingException e) { 
 | 
                log.error("钉钉发送消息异常", e); 
 | 
                //e.printStackTrace(); 
 | 
            } catch (NoSuchAlgorithmException e) { 
 | 
                log.error("钉钉发送消息异常", e); 
 | 
                //e.printStackTrace(); 
 | 
            } catch (InvalidKeyException e) { 
 | 
                log.error("钉钉发送消息异常", e); 
 | 
                //e.printStackTrace(); 
 | 
            } catch (Exception e){ 
 | 
                log.error("钉钉发送消息异常", e); 
 | 
                //e.printStackTrace(); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |