钉钉机器人报警-webhook

功能由来:

工作中设置了对传感器的上下限报警,但是有时传感器在上下限来回波动,导致报警一直在发,之前绑定的是短信功能,短短2分钟几块钱没了。领导甚是心疼,决定后面用钉钉报警。

功能描述:

没有限定我开发平台,最好windows,这里我将Linux和Windows的都发出来。

实现原理:

钉钉群可以自定义机器人,生成一个url,并设定关键字(当然还有验证码,那个我没用到,所以没研究)。钉钉群创建方法见:很简单这里就不重复描述。

实现方法就是post json数据,使用curl命令即可。话不多说,show code!

Linux:

解释一下,链接替换成自己生成那个,content需要包含你自己设置那个关键词,isAtAll意思是是否艾特群里所有人,atUserIds表示被艾特人的钉钉ID,atMobiles是被艾特人的电话。怎么样,简单吧!

#!/bin/bash

echo "start=="
curl https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx 
-H Content-Type: application/json 
-d {"msgtype": "text", 
     "text": {"content": "关键词:@phone"},
     "at":
     {
       "isAtAll": false,
       "atUserIds":["dingdingID"],
       "atMobiles":["电话"]
     }
    }
echo "==>end"

Windows:

使用curl的命令也和linux下差不多,只是windows的CMD命令中引号需要用""进行转义。于是大体的命令如下:

curl https://oapi.dingtalk.com/robot/send?access_token=xxxx  -H "Content-Type:application/json; charset=utf-8"  -d  "{"text": {"content":"钉钉机器人群消息测试--from win10"},"msgtype":"text"}"

于是,我用QT写了一遍(在此感谢大佬,虽然你的链接我找不到了,遥寄对你的崇拜.....)

QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
    const QUrl url(QStringLiteral("https://oapi.dingtalk.com/robot/send?access_token=xxxx"));
    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    QJsonObject obj;
    QJsonObject obj1;
    obj1.insert("content", "钉钉机器人群消息测试--from QT win10");
    obj.insert("msgtype", "text");
    obj.insert("text", obj1);

    //obj["msgtype"] = "text";
    //obj["text"] = "value2";
    QJsonDocument doc(obj);
    QByteArray data = doc.toJson();
    // or
    // QByteArray data("{"key1":"value1","key2":"value2"}");
    QNetworkReply *reply = mgr->post(request, data);

    QObject::connect(reply, &QNetworkReply::finished, [=](){
        if(reply->error() == QNetworkReply::NoError){
            QString contents = QString::fromUtf8(reply->readAll());
            qDebug() << contents;
        }
        else{
            QString err = reply->errorString();
            qDebug() << err;
        }
        reply->deleteLater();
    });

包含头文件:

#include <QNetworkAccessManager>
#include <QJsonObject>
#include <QJsonDocument>
#include <QNetworkReply>

结语:

方法很简单,但是如果格式没对,或者没包含关键词会报对应的错误,对应解决就可以了。

补充:

终于我还是自己找到了原因,是要win10系统CMD命令要支持UTF-8才行,Linux和QT本身是可以的。方法:windows设置--时间和语言--区域和语言--管理时间设置--更改系统区域设置,勾选Beta版支持UTF-8,然后重启即可。 感谢知乎提供的灵感,虽然帖子是考虑mount命令得出的解决办法,下面贴出链接:

https://zhuanlan.zhihu.com/p/46254792

此文仅此纪念苦逼又快乐的打工时光!

经验分享 程序员 微信小程序 职场和发展