钉钉机器人报警-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
此文仅此纪念苦逼又快乐的打工时光!