前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自定义钉钉机器人报警

自定义钉钉机器人报警

作者头像
LiosWong
发布于 2018-10-29 09:43:35
发布于 2018-10-29 09:43:35
1.6K00
代码可运行
举报
文章被收录于专栏:后端沉思录后端沉思录
运行总次数:0
代码可运行

为了埋点实时监控业务,简单的实现了钉钉机器人报警,钉钉开发官方文档点击

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface AlarmService {

    Response<Boolean> orderSuccessAlarm(CompanyAppIdEnum companyAppIdEnum, String orderNo, OrderStatusEnum orderStatusEnum);

    Response<Boolean> orderFilterAlarm(CompanyAppIdEnum companyAppIdEnum,Long userId);

}

public class AlarmServcieImpl implements AlarmService {
    @Autowired
    RedisClient RedisClient;

    @Autowired
    ConfigUtil configUtil;

    private static final Log logger = LogFactory.getLog(AlarmServcieImpl.class);

    private static final Long expireTime = 24 * 60 * 60L;

    //创建机器人可获取
    private static final String requestUrl = "https://oapi.dingtalk.com/robot/send?access_token=xxxx";

    @Override
    public Response<Boolean> orderSuccessAlarm(CompanyAppIdEnum companyAppIdEnum, String orderNo, OrderStatusEnum orderStatusEnum) {
        try {
            if (configUtil.isServerTest()) {
                return new Response<>(Boolean.FALSE);
            }
            String count = RedisClient.getString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            if (Objects.isNull(count)) {
                RedisClient.setString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, "0", expireTime, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            }
            dispatcher(companyAppIdEnum, Number.getNumber(Long.valueOf(RedisClient.getString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date())))), AlarmTypeEnum.ORDER_ALARM);
            RedisClient.incrBy(SystemConstants.ORDER_STATUS_ALARM_ROBOT, 1L, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
        return new Response<>(Boolean.TRUE);
    }

    @Override
    public Response<Boolean> orderFilterAlarm(CompanyAppIdEnum companyAppIdEnum,Long userId) {
        try {
            if (configUtil.isServerTest()) {
                return new Response<>(Boolean.FALSE);
            }
            String count = RedisClient.getString(SystemConstants.ORDER_FILTER_USER_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            if (Objects.isNull(count)) {
                RedisClient.setString(SystemConstants.ORDER_FILTER_USER_ALARM_ROBOT, "0", expireTime, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            }
            dispatcher(companyAppIdEnum, Number.getNumber(Long.valueOf(RedisClient.getString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date())))), AlarmTypeEnum.ORDER_USER_FILTER);
            RedisClient.incrBy(SystemConstants.ORDER_STATUS_ALARM_ROBOT, 1L, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
        return new Response<>(Boolean.TRUE);
    }

    protected void dispatcher(CompanyAppIdEnum companyAppIdEnum, Number number, AlarmTypeEnum alarmTypeEnum) {
        Arrays.asList(Number.values()).forEach(
                p -> {
                    if (p.equals(number) && !Number.INIT_NUMBER.equals(number)) {
                        try {
                            sendNotice(companyAppIdEnum, number, alarmTypeEnum);
                        } catch (IOException e) {
                            e.printStackTrace();
                            logger.error(e.getMessage(), e);
                        }
                        return;
                    }
                }
        );
    }

    public static void main(String[] args) throws IOException {
        sendNotice(CompanyAppIdEnum.WAN_KA, Number.PRELIMINARY_WARNING, AlarmTypeEnum.ORDER_ALARM);
    }

    private static void sendNotice(CompanyAppIdEnum companyAppIdEnum, Number number, AlarmTypeEnum alarmTypeEnum) throws IOException {
        HttpClient httpclient = HttpClients.createDefault();
        HttpPost httppost = new HttpPost(requestUrl);
        httppost.addHeader("Content-Type", "application/json; charset=utf-8");
        String textMsg = getNotice(number, companyAppIdEnum, alarmTypeEnum);
        StringEntity se = new StringEntity(textMsg, "utf-8");
        httppost.setEntity(se);
        HttpResponse response = httpclient.execute(httppost);
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String result = EntityUtils.toString(response.getEntity(), "utf-8");
            logger.info("报警已经成功发送,机构为:{},响应消息为:{}", companyAppIdEnum.getDesc(), result);
        }
    }

    private static String getNotice(Number number, CompanyAppIdEnum companyAppIdEnum, AlarmTypeEnum alarmTypeEnum) {
        switch (alarmTypeEnum) {
            case ORDER_ALARM:
                return "{\n" +
                        "     \"msgtype\": \"markdown\",\n" +
                        "     \"markdown\": {\"title\":\"推单失败报警\",\n" +
                        "\"text\":\"#### 推单失败报警  \\n " + companyAppIdEnum.getDesc() + "推单失败已超过" + number.getCount() + "单" + "\\n > ![screenshot](https://note.youdao.com/yws/api/personal/file/WEB77f35c865dbd286c3baed15670e8892f?method=download&shareKey=dfdd0302d114373146480ae3d4330af1)\\n  > ######" + new Date() + "发布 [警告]() \"\n" +
                        "     },\n" +
                        "    \"at\": {\n" +
                        "        \"atMobiles\": [\n" +
                        "            \"15168426462\"" +
                        "        ], \n" +
                        "        \"isAtAll\": false\n" +
                        "    }\n" +
                        " }";
            case ORDER_USER_FILTER:
                return "{\n" +
                        "     \"msgtype\": \"markdown\",\n" +
                        "     \"markdown\": {\"title\":\"机构过滤报警\",\n" +
                        "\"text\":\"#### 机构过滤报警  \\n " + companyAppIdEnum.getDesc() + "过滤失败已超过" + number.getCount() + "单" + "\\n > ![screenshot](https://note.youdao.com/yws/api/personal/file/WEB77f35c865dbd286c3baed15670e8892f?method=download&shareKey=dfdd0302d114373146480ae3d4330af1)\\n  > ######" + new Date() + "发布 [警告]() \"\n" +
                        "     },\n" +
                        "    \"at\": {\n" +
                        "        \"atMobiles\": [\n" +
                        "            \"15168426462\"" +
                        "        ], \n" +
                        "        \"isAtAll\": false\n" +
                        "    }\n" +
                        " }";
            default:
                break;
        }
        return "";
    }

    public enum Number {

        INIT_NUMBER(0L, "初始"),

        PRELIMINARY_WARNING(50L, "初步警告"),

        PRELIMINARY_WARNING_PLUS(55L, "初步警告"),

        INTERMEDIATE_WARNING(100L, "中级警告"),

        INTERMEDIATE_WARNING_PLUS(105L, "中级警告"),

        INTERMEDIATE_WARNING_PLUS_PLUS(200L, "中级++警告"),

        INTERMEDIATE_WARNING_PLUS_PLUS_PLUS(205L, "中级++警告"),

        SERIOUS_WARNING(300L, "严重警告"),

        SERIOUS_WARNING_PLUS(305L, "严重警告"),

        SERIOUS_WARNING_PLUS_PLUS(350L, "严重警告"),

        SERIOUS_WARNING_PLUS_PLUS_PLUS(400L, "严重警告"),

        SERIOUS_WARNING_PLUS_PLUS_PLUS_PLUS(500L, "严重警告");

        private Long count;

        private String desc;

        Number(Long count, String desc) {
            this.count = count;
            this.desc = desc;
        }

        public Long getCount() {
            return count;
        }

        public Number setCount(Long count) {
            this.count = count;
            return this;
        }

        public String getDesc() {
            return desc;
        }

        public Number setDesc(String desc) {
            this.desc = desc;
            return this;
        }

        public static Number getNumber(Long count) {
            Number[] number = {INIT_NUMBER};
            Arrays.asList(Number.values()).forEach(
                    p -> {
                        if (p.getCount().equals(count)) {
                            number[0] = p;
                            return;
                        }
                    }
            );
            return number[0];
        }
    }

    public enum AlarmTypeEnum {
        ORDER_ALARM,
        ORDER_USER_FILTER;
    }
}

按照钉钉的文档来开发,创建机器人后,即可获取Webhook地址,整个过程还是很简单的,以上只是提供了一个思路.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​​钉钉自定义机器人简单使用
年前公司的需求里面有用到钉钉机器人,使用之后发现真的非常简单,不得不感叹阿里的牛逼,这篇文章总结了一下个人使用钉钉机器人的经验,同时介绍个人据此构建一个工具类来方便后续直接“开箱即用”,希望对于读者有所启发。
阿东
2021/08/16
4.1K0
​​钉钉自定义机器人简单使用
Elasticsearch API简单使用
笔者喜欢做一些小工具,给PM或者组内同学使用,不仅仅可以提高工作效率,而且也可以学一些前端方面的知识。之前使用Elasticsearch API做过管理后台的小工具,一直没有总结,最近给PM哥们又做了一个小工具,而且也使用到了Elasticsearch API,正好做个简单分享。
LiosWong
2018/12/10
8090
Elasticsearch API简单使用
求助-钉钉开发异步消息失败
源码: 1.AsyncMessage.java package com.ray.dingtalk.model.message.asyncsend; /**@desc : * * 参考文档地
shirayner
2018/08/10
8561
python钉钉机器人自定义回复
然后去实现handle_client 就好了。篇幅有限。完整的代码关注公众号 罗尔街 即可获取
Michel_Rolle
2023/07/30
2.9K4
Java钉钉开发_02_免登授权(身份验证)
将所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式 (即 key1=value1&key2=value2…)拼接成字符串string1
shirayner
2018/08/10
3.5K0
Java钉钉开发_02_免登授权(身份验证)
Java钉钉开发_03_通讯录管理之 人员管理 和 部门管理
一、本节要点 1.通讯录权限 ISV(应用服务商)默认无管理通讯录的权限,企业应用默认有所有通讯录权限。 2.数据传输格式—JSON 请参见: Java_数据交换_fastJSON_01_用法入门 二、代码实现 1.HTTP请求工具类—HttpHelper package com.ray.dingtalk.qy.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import jav
shirayner
2018/08/10
2.1K0
通过钉钉机器人发送群消息通知
可以查看这篇文章:添加机器人到钉钉群 使用命令行工具curl快速验证自定义机器人是否可以正常工作。可以使用如下命令,把对应的链接调整成对应群的webhook地址即可。
共饮一杯无
2022/11/24
1.6K0
通过钉钉机器人发送群消息通知
微服务组件---- Spring Cloud Alibaba 链路追踪 skywalking 详解
【1】skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
忧愁的chafry
2022/10/30
1.9K0
微服务组件----  Spring Cloud Alibaba  链路追踪 skywalking 详解
钉钉机器人自动关联 GitHub 发送 approval prs
摘要:用技术来解决 PM 枯燥的 approval pr 工作,本文将阐述如何自动化获取 GitHub Organization 下各个 repo 待 merge 的 pull requests 并通知相关人员,告别每日的手动操作。
NebulaGraph
2020/06/17
1.5K0
钉钉机器人自动关联 GitHub 发送 approval prs
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
1、今日数据: 以2h为间隔,左间隔时间=< “条数” <当下最近时间右间隔时间,比如,[00:00, 02:00)
刘大猫
2024/11/11
1070
Java微信公众平台开发_03_消息管理之被动回复消息
上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图,这个url就是回调url,是开发者用来接收微信消息和事件的接口URL 。也就是说,用户在微信公众号中发送的消息会被推送到这个回调url,而我们可以接收用户的消息,并进行回复。
shirayner
2018/08/10
5.5K0
Java微信公众平台开发_03_消息管理之被动回复消息
钉钉报警脚本
# 1.调用格式 案例1 [root@summer logs]# curl 'https://oapi.dingtalk.com/robot/send?access_token=841826a8168
summerking
2022/09/19
5100
钉钉报警脚本
Java微信公众平台开发_06_素材管理
一、本节要点 1.官方文档的media  这个media可以理解为文件,即我们需要以POST方式提交一个文件 2.媒体文件有效期 媒体文件在微信后台保存时间为3天,即3天后media_id失效。 二、
shirayner
2018/08/10
1.9K0
Java微信公众平台开发_06_素材管理
钉钉机器人单聊实现互动卡片推送
公司OA系统升级, 需要将OA系统内的消息和系统外的消息联系. 为此产品提出需求. 当用户在OA系统收到消息时,可同时在钉钉收到待办消息提醒,提醒用户前往OA系统查看消息,处理相关事宜. 因此着手做了钉钉待办. 但是钉钉待办实现后效果并不理想.因此采用了钉钉卡片进行通知. 而采用卡片通知又分群聊和单聊场景. 并且卡片通知整个流程也挺曲折, 下面我将 把我走过的坑重新梳理下, 让更多需要的人更快搭建此场景.
时间静止不是简史
2023/04/18
3.2K0
钉钉机器人单聊实现互动卡片推送
[C#] 钉钉机器人通知
操作步骤 【钉钉桌面客户端】-> 【群设置】-> 【智能群助手】-> 【添加新建机器人-选自定义】-> 【设置机器人名称头像】-> 【注意⚠️设置自定义关键字: TanCloud】 ->【添加成功后复
科控物联
2022/04/19
8790
[C#] 钉钉机器人通知
利用 shell 实现钉钉机器人告警推送
在运维中需要对主机业务进行周期巡检,为减少人工巡检频率,降低业务停机风险,利用 shell 脚本对 Linux 系统服务运行状态进行主动巡检,异常服务通过钉钉机器人进行告警消息推送。
Kevin song
2021/03/08
3.7K0
利用 shell 实现钉钉机器人告警推送
使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
    最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用,真的让人觉得阿里的pm都是脑残才会设计出这种脑残产品,不过吐槽归吐槽,该用还得用,虽然钉钉别的功能很鸡肋,但是机器人这个功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步,例如:通过聚合Github、Gitlab等源码管理服务,实现源码更新同步;通过聚合Trello、JIRA等项目协调服务,实现项目信息同步;同事,支持Webhook协议的自定义接入,支持更多可能性,例如:将运维报警提醒、自动化测试的结果报告提醒、工作、生活日程安排(上班打卡、下班吃饭、健身、读书、生日、纪念日...)等等的提醒,通过自定义机器人聚合到钉钉中。
用户9127725
2022/08/08
9170
使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Zabbix配置钉钉的带图片报警
实现思路: 首先报警信息里要有itemid,这是前提,根据信息里传入的参数使用正则匹配到itemid 构建一个session会话,或者使用cookie来进行登录,根据itemid去请求图片,并将获取
用户6641876
2020/02/19
1.6K0
系统监控及钉钉机器人告警脚本
一、背景 当前不同的公司服务器较多,在项目开发、部署和演示过程多次遇到服务器无故宕机的情况,另外各服务器上部署的中间件也存在无故下线的情况,如果出现以上情况就特别棘手,而技术人员无法第一时间感知。
IT运维技术圈
2022/10/24
6160
尚医通-预约挂号
添加com.frx01.yygh.order.mapper.OrderInfoMapper,添加配置类,扫描mapper包
用户9615083
2022/12/30
3.5K0
尚医通-预约挂号
推荐阅读
相关推荐
​​钉钉自定义机器人简单使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验