功能由来:
工作中设置了对传感器的上下限报警,但是有时传感器在上下限来回波动,导致报警一直在发,之前绑定的是短信功能,短短2分钟几块钱没了。领导甚是心疼,决定后面用钉钉报警。
功能描述:
根据报警来源,发出不同报警信息,并在群里艾特特定的人。
没有限定我开发平台,最好windows,这里我将Linux和Windows的都发出来。
实现原理:
钉钉群可以自定义机器人,生成一个url,并设定关键字(当然还有验证码,那个我没用到,所以没研究)。钉钉群创建方法见:很简单这里就不重复描述。
https://blog.csdn.net/cen50958/article/details/92230109
实现方法就是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端也可以用curl,只是要单独下载,再将curl下的路径添加到系统环境变量中。具体可以参考链接:
Windows环境下curl的使用_是半半呀~的博客-CSDN博客_curl 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\"}"
但是出了问题,中文怎么都不能识别,是乱码。尝试过加charset=utf-8,将CMD命令的格式从chcp 639换成chcp 650001,但是都不行。windows端的curl命令,目前仅限英文。解决的小伙伴,可以私信我,万分感谢。
于是,我用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
此文仅此纪念苦逼又快乐的打工时光!