钉钉报警接入代码
@Service @Slf4j public class DingTalkUtil { @Value("${dingTalk.robot.url}") private String robotUrl; @Value("${dingTalk.robot.me}") private String me; // 钉钉密钥 @Value("${dingTalk.robot.secret}") private String secret; @Value("${dingTalk.enabled}") private Boolean enabled; private OkHttpClient okHttpClient; private static final ObjectMapper objectMapper = new ObjectMapper(); private static final MediaType jsonMediaType = MediaType.parse("application/json"); @PostConstruct public void init() { ExecutorService executorService = new ThreadPoolExecutor( 1, 5, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(100), ThreadFactoryBuilder.create().setNamePrefix("dingTalk-").build(), new ThreadPoolExecutor.CallerRunsPolicy() ); Dispatcher dispatcher = new Dispatcher(executorService); dispatcher.setMaxRequests(5); dispatcher.setMaxRequestsPerHost(5); okHttpClient = new OkHttpClient.Builder() .readTimeout(Duration.ofSeconds(1)) .connectTimeout(Duration.ofSeconds(1)) .callTimeout(Duration.ofSeconds(1)) .writeTimeout(Duration.ofSeconds(1)) .dispatcher(dispatcher) .build(); } /** * 异步发送钉钉机器人文本消息. */ public void sendTextMessage(String content) { doSendTextMessage(content, textMessage -> { }); } /** * 异步发送文本消息并@自己. */ public void sendTextMessageWithAtMe(String content) { doSendTextMessage(content, textMessage -> textMessage.getAt().getAtMobiles().add(me)); } /** * 异步发送文本消息并@所有人. */ public void sendTextMessageWithAtAll(String content) { doSendTextMessage(content, textMessage -> textMessage.getAt().setAtAll(true)); } private void doSendTextMessage(String content, Consumer messageConfigurator) { if (!enabled) { return; } if (StringUtils.isBlank(content)) { throw new IllegalArgumentException("文本消息内容不能为空"); } TextMessage textMessage = new TextMessage(); textMessage.setText(new TextMessage.Content(content)); messageConfigurator.accept(textMessage); long timestamp = System.currentTimeMillis(); String sign = sign(timestamp); try { Request request = new Request.Builder() .url((robotUrl + " tamp=" + timestamp + "&sign=" + sign)) .post(RequestBody.create(objectMapper.writeValueAsString(textMessage), jsonMediaType)) .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { log.error("发送钉钉消息失败, 请求: {}.", call, e); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) { ResponseBody responseBody = response.body(); log.debug("钉钉发送成功, call: {}, resp: {}.", call.request().body(), responseBody); if (responseBody != null) responseBody.close(); } }); } catch (JsonProcessingException e) { throw ExceptionUtil.wrapRuntime(e); } } private String sign(long timestamp) { final String seed = (timestamp + " " + secret); try { Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); byte[] result = mac.doFinal(seed.getBytes(StandardCharsets.UTF_8)); return URLEncoder.encode(Base64.getEncoder().encodeToString(result), StandardCharsets.UTF_8.displayName()); } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) { throw ExceptionUtil.wrapRuntime(e); } } @Getter private static class TextMessage { private final String msgtype = "text"; @Setter private Content text; private final At at = new At(); @Data @AllArgsConstructor private static class Content { private String content; } private static class At { @Setter private boolean isAtAll = false; @Getter private final List atMobiles = new LinkedList<>(); // 不能删除,否则会导致生成的json字段名是atAll, 导致@所有人不生效 public boolean getIsAtAll() { return isAtAll; } } } }
曝小米12系列升级50MP三主摄12月发布据此前消息,小米下一部年度旗舰小米12系列将会比以往来的更早一些,可能会在12月中旬就正式登场,近期关于该机的相关爆料也层出不穷。知名爆料博主数码闲聊站最新发文称明年有两台影像旗舰
中国移动的流量资费是不是太贵了?感谢邀请,我来给大家解答这个问题!中国移动在有段时间内确实推出过1元1G的流量套餐,但是没多久就取消了这个套餐,平心而论,这个套餐的推出还是满足了部分客户的实际需求的,但是对于大流
为什么各家黄金首饰店都是一口价?因为利润,一口价的黄金首饰按克换算大约是700左右一克,按克的黄金加上工费最贵也就400多,当然还有款式设计等等因素。一口价的黄金首饰主要是3D硬金,3D硬金属于最近几年兴起的一种
做滴滴司机,你的生活发生了咋样的改变?发生啥改变了!明天早起顶着星星出车,顶着月亮收车,一天到晚累的半死,到月底算账没啥结余,一天到晚还得受不讲理乘客的气,还得受滴滴公司的耍弄,接单地点接单吧交警罚款扣分,不接吧滴滴罚
性价比之巅,HIFIMAN发布首款颈挂式运动蓝牙耳机,BW400体验如今无线耳机遍地开花,各式各样的大品牌小品牌耳机厂商纷纷进军,让无线耳机市场非常饱和。市面上市面上形状各异价位不同的无线耳机,不断地冲击着我们的视觉神经,让我们眼花缭乱,无从下手。
告诉大家防断音,防啸叫的会议麦克风无线什么品牌好用会议室的那套无线麦克风真的是发威了。最近不是萧叫就是没声音出来。后来老板受不了了,他就叫我买一套会议麦克风无线的回来。我去网上找了好久,都不知道去买哪个品牌比较好。后来我就去隔壁公
微信和支付宝都有理财产品,你更相信谁?为什么?微信和支付宝的理财产品我都用过,对这些产品还算比较了解。其实这些理财产品都不是他们自己的,不过是通过他们的平台代理销售,因此安全性主要在于发行产品的公司,可以说和支付宝微信几乎没有
处理器常用的倆大品牌目前消费市场上有两个CPU品牌,英特尔和AMD。由于历史原因,英特尔目前市场占有率比较高,过去很长一段时间,英特尔一直是绝对霸主,代表着最先进的生产力。还有一种调侃i3无声胜有声,
谁能通俗的说一下华为是不是真正的国产手机,其他品牌都不是国产?只能说是国产化率最高的品牌吧!你中有我,我中有你。世上事只有相对,没有绝对。所以华为手机是不是真正的国货,就要从哪个角度看了!即既是,也不是。感谢您的阅读。谁能通俗的说一下华为是不
没有核心芯片的华为你还会喜欢与支持吗?依旧支持华为。用手机只为通讯方便,与爱国或某些企业毫无关系,遑论核心芯片我觉得网上的一帮人挺好笑的,你们这么爱国啊,建国这么多年了,中国怎么没有几个科技品牌在世界上独步江湖的,再看
手机店卖出一部手机的利润约为多少?实体手机店卖机台手机的利润多少钱?这主要看品牌,不同品牌利润不一样。我们来看下各个手机品牌在实体店的利润情况。1苹果三星手机现在苹果三星手机的价格是最透明的,一般的手机店利润都为8
长荣股份首台套锂电生产配套设备正式交付在长荣集团和海目星研发技术工艺等团队的密切协作下,按照设备采购客户提出的技术标准和工艺要求,由长荣集团承接的首台套海目星锂电生产配套设备于9月1日顺利完成交付。下一步,长荣集团与海
不用手洗,九阳新款破壁机解锁智能新体验,满足全家更多使用需求破壁机让加工后的食材不仅口感更细腻,而且能够充分释放食材中的营养成分,因此受到了越来越多家庭主妇们的喜爱,家中必备一台破壁机,也成了对家人特别是有孩子的家庭里最贴心的关怀。这么多年
论凌渡大灯低配高报的背后低配高报的故事讲了很多,今天在给大家讲讲凌渡大灯的故事。今天小编遇到凌渡车,左前侧被撞。大灯等受损,左大灯在系统金额内提交,表面看没有任何问题。系统显示正常虽然凌渡属于上汽大众旗下
那些年从您手中经过的大灯总成Nissan东风日产乘用车公司成立于2003年6月16日,主要从事NISSAN品牌乘用车的研发采购制造销售服务等业务,是国内具备全价值链的汽车企业之一,在东风汽车有限公司旗下的乘用车板块中占据
那些年从您手中经过的大灯总成TOYOTA丰田汽车公司(TOYOTA),是一家总部设在日本爱知县丰田市和东京都文京区的日本汽车制造公司,属于三井(Mitsui)财阀。目前已稳居世界第一大汽车制造商,丰田亦是雷克萨斯斯巴鲁品
更准确更快速!更多家长为孩子选择讯飞翻译笔S11教培行业的整顿,学生的减负,让很多家长朋友对孩子的学习除了有更多的思考,没有了课外的培训,除了孩子自身的努力,剩下的就是对家长的严格要求了。但很多家长受限于工作方面的因素,还有自身
我国首套水下应急封井器在深水海试成功8月11日,中国海洋石油集团有限公司(以下简称中国海油)对外宣布,近日,由该公司牵头研制的我国首套水下应急封井器在南海深水海域海试成功,填补了我国在深水油气应急装备研制领域的技术空
四川省首台超超临界百万千瓦机组投运8月31日,中国能建西南院与天津电建联合总承包,西北城建参建,华中电力试研院负责单体调试的国能四川天明电厂2100万千瓦新建工程1号机组顺利通过168小时满负荷试运行,标志着四川省
大数据入门MapReduce核心架构在大数据处理上,MapReduce可以说是非常具备代表性的一代框架,尤其是在以Hadoop为首的离线批处理框架当中,MapReduce是核心的数据处理引擎,而随后的Spark其实也
节前大盘以震荡为主每年的国庆节前大盘均以震荡为主,也就是做俯卧撑。在此期间,国内各投资公司基金公司均会进入投资亏盈衡量期,因此很多人都会怪中国股市是震荡市,跟各种各样的基金投资公司进行一年一度的结算
大数据开发SparkStreaming消费Kafka数据在流处理领域,Spark和kafka作为两个重要的组件,在大数据学习当中的重要性不必多说。面对越来越大规模的实时数据流,SparkStreaming和Kafka的组合,在应用开发层