使用shell脚本连接钉钉机器人发送消息

一、前言

服务器上有时 定时任务、重要接口 等出现异常,导致数据不正常,不能及时通知到服务负责人,及时处理问题。所以引入”钉钉”作为通知工具,当服务出现异常便可立即收到通知,及时处理!
二、使用方式
1、客户端配置机器人
1.1首先需要有阿里巴巴的”钉钉”客户端

使用shell脚本连接钉钉机器人发送消息

1.2、建立群聊(如果只想通知给自己,不想通知其他人,也可以与他们创建群聊之后再将他们踢出)

使用shell脚本连接钉钉机器人发送消息

1.3、点击”群设置”里面的”智能群助手”

使用shell脚本连接钉钉机器人发送消息

1.4、” 添加机器人

使用shell脚本连接钉钉机器人发送消息

1.5、自定义

使用shell脚本连接钉钉机器人发送消息

1.6、给机器人取个名字, 注意:后续的消息体中必须要包含设置的” 自定义关键词“,消息才能发送成功。

使用shell脚本连接钉钉机器人发送消息

1.7、点击”完成”后会得到一个webhook,把这个webhook复制出来,一会儿代码中要用,

类似这样的:https://oapi.dingtalk.com/robot/send?access_token=880e6b7********97d5e

使用shell脚本连接钉钉机器人发送消息

1.8、点击” 完成“之后会收到这样一条消息,说明机器人配置完成了,接下来就是代码了

2.消息类型及数据格式

2.1 文本类型(text)

参数必选类型说明 msgtype true string 此消息类型为固定text content true string 内容消息 atMobiles false string 被@人手机号 isAtall false bool @所有人时为ture,否则为false

{
     "msgtype": "text",
     "text": {
         "content": "我是陈十六,请多指教@156****16**"
     },
     "at": {
         "atMobiles": [
             "1825718XXXX"
         ],
         "isAtAll": false
     }
 }

使用shell脚本连接钉钉机器人发送消息

2.2 link类型

参数必选类型说明 msgtype true string 此消息类型为固定link title true string 消息标题 text true string 内容消息,如果太长只会显示一部分 messageUrl true string 点击消息跳转的url picUrl false string 图片url

{
    "msgtype": "link",
    "link": {
        "text":"link是以连接的形式发送消息。",
       "title": "连接的主题",
        "picUrl": "",
        "messageUrl": "复制的机器人的Webhoot"
    }
}

使用shell脚本连接钉钉机器人发送消息

2.3、markdown类型

{
     "msgtype": "markdown",
     "markdown": {"title":"杭州天气",
"text":"#### 杭州天气  \n > 9度,@1825718XXXX 西北风1级,空气良89,相对温度73%\n\n > ![screenshot](http://i01.lw.aliimg.com/media/lALPBbCc1ZhJGIvNAkzNBLA_1200_588.png)\n  > ###### 10点20分发布 [天气](http://www.thinkpage.cn/) "
     },
    "at": {
        "atMobiles": [
            "1825718XXXX"
        ],
        "isAtAll": false
    }
 }

使用shell脚本连接钉钉机器人发送消息

3、通过代码使用机器人发送钉钉消息

a、通过java代码实现

package com.common.util;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 钉钉-工具类
 */
@Slf4j
public class DingTalkUtil {

    /**
     * 钉钉机器人发消息地址(配置机器人的webhook)
     * 此处大家可以配置到配置文件等等方式
     */
    private static final String MSG_URL = "https://oapi.dingtalk.com/robot/send?access_token=880e6b7********************************************97d5e";

    /**
     * 通知具体人
     *
     * @param content    通知内容
     * @param mobileList 通知具体人的手机号码列表
     */
    public static void sendDingTalkMsg(List mobileList, String content) {
        sendDingTalkMsg(false, mobileList, content);
    }

    /**
     * 通知所有人
     *
     * @param content 通知内容
     */
    public static void sendDingTalkMsg(String content) {
        sendDingTalkMsg(true, null, content);
    }

    /**
     * 发送消息
     *
     * @param content    通知内容
     * @param isAtAll    是否@所有人
     * @param mobileList 通知具体人的手机号码列表
     */
    private static void sendDingTalkMsg(boolean isAtAll, List mobileList, String content) {
        try {
            if (!CollectionUtils.isEmpty(mobileList)) {
                isAtAll = false;
            }
            //消息内容
            Map contentMap = new HashMap<>();
            contentMap.put("content", content);

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

            Map parameter = new HashMap<>();
            parameter.put("msgtype", "text");
            parameter.put("at", atMap);
            parameter.put("text", contentMap);

            //推送消息(http请求)
            String result = HttpUtils.post(MSG_URL, JSON.toJSONString(parameter));
            log.info("发送钉钉消息-result:{}", result);
        } catch (Exception e) {
            log.error("发送钉钉消息异常", e);
        }
    }

    public static void main(String[] args) {
//        sendDingTalkMsg("服务通知:测试消息");
        sendDingTalkMsg(Collections.singletonList("189********"), "服务通知:测试消息");
    }
}

另附代码中使用到的HttpUtils

package com.common.util;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;

import java.io.Closeable;
import java.nio.charset.Charset;
import java.util.Map;

/**
 * http请求-工具类
 *
 * @author xiehongwei
 * @date 2020/11/03
 */
@Slf4j
public class HttpUtils {

    private static final String UTF_8 = "utf-8";

    private static RequestConfig requestConfig;

    static {
        requestConfig = RequestConfig.custom()
                .setConnectTimeout(1000)//连接超时时间
                .setSocketTimeout(3000)//读超时时间
                .build();
    }

    /**
     * post请求(无参/参数在url上)
     */
    public static String post(String url) throws Exception {
        return post(url, "");
    }

    /**
     * post请求
     */
    public static String post(String url, String body) throws Exception {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse httpResponse = null;
        try {
            httpClient = HttpClients.createDefault();

            HttpPost httpPost = new HttpPost(url);

            if (StringUtils.isNotBlank(body)) {
                StringEntity se = new StringEntity(body, Charset.forName(UTF_8));
                se.setContentType("text/json");
                se.setContentEncoding(new BasicHeader("Content-Type", "application/json"));

                httpPost.setEntity(se);
            }

            httpPost.setConfig(requestConfig);
            httpPost.setHeader("Content-Type", "application/json;charset=utf-8");

            httpResponse = httpClient.execute(httpPost);
            if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                return EntityUtils.toString(httpResponse.getEntity(), UTF_8);
            } else {
                log.error("post请求其它服务失败,statusCode:{}", httpResponse.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            log.error("post请求其它服务异常", e);
            throw e;
        } finally {
            close(httpClient);
            close(httpResponse);
        }
        return null;
    }

    /**
     * post请求
     */
    public static String post(String url, Map parameter) throws Exception {
        return post(url, JSON.toJSONString(parameter));
    }

    /**
     * 关闭流
     */
    private static extends Closeable> void close(T io) {
        if (io == null) {
            return;
        }
        try {
            io.close();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }
}

shell脚本实现

#!/bin/bash

webhook='https://oapi.dingtalk.com/robot/send?access_token=34XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
cluster='QQOrder_ERP'
host=hostname -I | awk '{print $1}'
vip=$1

function SendMsgToDingding() {
  curl $webhook -H 'Content-Type: application/json' -d "
  {
    'msgtype': 'text',
    'text': {
      'content': '集群名称:$cluster\n告警信息:虚拟IP已漂移至节点,请注意\n'
    },
    'at': {
      'isAtAll': true
    }
  }"
}
SendMsgToDingding

Original: https://www.cnblogs.com/zouhong/p/16476137.html
Author: 小破孩楼主
Title: 使用shell脚本连接钉钉机器人发送消息

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529599/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • NoteOfMySQL-13-事务与并发控制

    一、事务简介 存储引擎如InnoDB、BDB才支持事务处理。 每个事务(transaction)的处理必须满足ACID原则: 原子性(Atomicity): 原子性指每个事务都必须…

    Linux 2023年6月14日
    0120
  • 前端之CSS初识

    一、CSS介绍 CSS( Cascading Style Sheet,层叠样式表)定义 如何显示HTML元素。 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染…

    Linux 2023年6月14日
    087
  • MySQL-报错:Error when bootstrapping CMake:

    在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接 yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root…

    Linux 2023年6月13日
    096
  • Java基础系列–03_Java中的方法描述

    Java的方法(函数)的描述 方法(1)方法的定义:就是完成特定功能的代码块。注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法。(2)格式:修饰符 返回值类型 方法…

    Linux 2023年6月7日
    0104
  • 机器学习1

    常见的几种假设检验的实例以及对应python代码实现(包括基于图的效果展示 Z检验 t检验 χ2检验 F检验 熟悉scikit-learn及其相关应用 Numpy Numpy 优势…

    Linux 2023年6月6日
    086
  • Shell文件属性的判断与比较

    Shell支持对文件属性的判断,常用的文件属性操作符很多,如下表所示。更多文件属性操作符可以参考命令帮助手册man test [root@centos7&#xFF5E;]#…

    Linux 2023年6月6日
    074
  • ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)

    上一章分享了如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新,本章继续进行下一步,用户授权。涉及到的例子也以上一章的为基础。(ASP.NET Core 系…

    Linux 2023年6月7日
    087
  • Kubernetes 安装Redis集群

    一、Operator 以集群模式安装 可以在service_account和 operator后面加-n 参数指定namespace 这个yaml文件中使用的资源较高,测试环境可能…

    Linux 2023年5月28日
    060
  • docker 安装redis

    1: 搜索镜像, docker search redis2:&#xA0;<strong>docker pull redis:6.0.6</strong&g…

    Linux 2023年5月28日
    080
  • CANoe的安装和使用

    CANoe的简介 CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环境,全称叫CAN open environment。CANoe集合了网络监控、数据获取/记录…

    Linux 2023年6月13日
    0193
  • MySQL — 数据操作语言

    DML 全称 Data Manipulation Language。数据操作语言,用来对数据库表中的数据进行增删改。 插入一条数据 插入多条数据 update &#x886…

    Linux 2023年6月8日
    097
  • JVM学习 运行时数据区 PC寄存器、本地方法栈、虚拟机栈

    2、运行时数据区 哔哩哔哩 尚硅谷视频 宋红康老师 2.1、程序计数器(PC寄存器) 作用 PC寄存器用来存储指向下一条指令的地址,也就是即将要执行指令的代码。由执行引擎读取下一条…

    Linux 2023年6月7日
    099
  • K8S 从私有仓库拉取镜像

    通常来讲,我们在通过公共镜像仓库拉取docker镜像的时候,不需要任何的认证操作,但我们在构建了企业的私有镜像以后,就不得不在拉取镜像之前通过用户名密码来完成认证。 在docker…

    Linux 2023年6月6日
    086
  • c++的bind使用方法

    c++的bind使用方法 除了容器有适配器之外,其实函数也提供了适配器,适配器的特点就是将一个类型改装成为拥有子集功能的新的类型。其中函数的适配器典型的就是通过 std::bind…

    Linux 2023年6月14日
    084
  • 投票活动进行中!探讨问题:从互联网大量收集学习资料再包装成产品售卖盈利是否属于侵权违法?

    写在开篇 今天不聊某项技能的知识点,我们聊点别的。那么,到底聊啥好呢?笔者想想… 有了,这两天笔者从一个微信公众号中发现一个非常恶劣的营销行为。事情大概背景是这样的:运…

    Linux 2023年6月7日
    069
  • 多线程执行同一任务,不共享局部变量

    多线程执行同一任务,不共享局部变量 一、 代码展示 import threading import time 多线程执行同一任务时,局部变量是不共享的 def sum_num():…

    Linux 2023年6月14日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球