美文网首页自动化监控Zabbix我用 LinuxPython 运维
zabbix微信 | 微信对接自己服务器(2)

zabbix微信 | 微信对接自己服务器(2)

作者: _简_述_ | 来源:发表于2016-11-18 19:04 被阅读666次

上接使用微信告警

企业号微信对接自己服务器

1.本地服务器与微信服务器的信任

  • 本地具有独立外网ip服务器获取微信服务器的ip段
#CropID、Secret微信企业号中“设置--功能--权限管理”可以找到
CropID='*******' 
Secret='*******'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G "$GURL" | awk -F\" '{print $4}')
/usr/bin/curl "https://qyapi.weixin.qq.com/cgi-bin/getcallbackip?access_token=$Gtoken"
  • 在iptables 加入如下例子:
#将取得的ip加入信任中(使其可以访问到这个服务器上的资源)
-A INPUT -s 101.226.103.0/24 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

2.本地部署微信加密文件
在本地服务器(具有外网ip)部署php+nginx,使其可以在公网访问

  • 下载加解密库部署在自己服务器上,使其可以在网络上访问,本文以php为例
//filename:index.php
//回调验证
<?php
//添加腾讯提供的接口文件WXBizMsgCrypt.php由上文连接官方下载
include_once "inc/WXBizMsgCrypt.php";

//设置自己企业号的相关参数
$encodingAesKey="";//企业微信中应用中心开回调模式时自定义
$corpId="";//企业微信中设置找
$token="";//企业微信中应用中心开回调模式时自定义

//获取待验证的参数
$sVerifyMsgSig = $_GET["msg_signature"];
$sVerifyTimeStamp = $_GET["timestamp"];
$sVerifyNonce = $_GET["nonce"];
$sVerifyEchoStr = $_GET["echostr"];

//以企业号参数为参数生成解码对象
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);

//进行地址解析
$errCode = $wxcpt->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
if ($errCode == 0) {
    //如果没有异常就返回加密的echostr的明文
    echo $sEchoStr;
} else {
    //出现异常就返回异常编码
    echo $errCode;
}
?>
  • 微信所需文件路径结构
├── inc
│   ├── errorCode.php
│   ├── pkcs7Encoder.php
│   ├── sha1.php
│   ├── WXBizMsgCrypt.php
│   └── xmlparse.php
├── index.php

3.开启回调模式

  • 在自己创建的应用上开启回调模式填入URL


    开启回调模式
  • 验证成功后将index.php改成如下可实现接收信息并做出反馈

<?php
include_once "inc/WXBizMsgCrypt.php";
//用户参数
$encodingAesKey = "";
$token = "";
$corpId = "";
//回调认证
$sVerifyMsgSig =$_GET["msg_signature"];
$sVerifyTimeStamp = $_GET["timestamp"];
$sVerifyNonce = $_GET["nonce"];
$sVerifyEchoStr =$_GET["echostr"];
$EchoStr = "";
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
$errCode = $wxcpt->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
if ($errCode == 0) {
print $sEchoStr;
} else { 
print($errCode . "\n\n");
}
//接收信息
$sReqData = file_get_contents("php://input");
$sMsg = ""; // 解析之后的明文
$errCode = $wxcpt->DecryptMsg($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sReqData, $sMsg);
if ($errCode == 0) {
file_put_contents('msg/'.$sVerifyTimeStamp.'.txt', $sMsg);//明文输出收到的xml
$xml = new DOMDocument();
$xml->loadXML($sMsg);
$content = $xml->getElementsByTagName('Content')->item(0)->nodeValue;//文字信息的内容
$FromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; //发送用户的id
$MsgType = $xml->getElementsByTagName('MsgType')->item(0)->nodeValue; //消息类型
$Event = $xml->getElementsByTagName('Event')->item(0)->nodeValue; //事件类型
$ScanResult = $xml->getElementsByTagName('ScanResult')->item(0)->nodeValue; //扫描结果
$PicUrl = $xml->getElementsByTagName('PicUrl')->item(0)->nodeValue;//图片链接
$Latitude = $xml->getElementsByTagName('Latitude')->item(0)->nodeValue; //经度
$Longitude = $xml->getElementsByTagName('Longitude')->item(0)->nodeValue;//纬度
$Precision = $xml->getElementsByTagName('Precision')->item(0)->nodeValue; //精度
$MediaId = $xml->getElementsByTagName('MediaId')->item(0)->nodeValue;//资源ID
} else { 
print($errCode . "\n\n");
}
//根据接收信息做反馈-文字
if($MsgType == "text") {
switch($content){ 
case "1": 
$mycontent="我收到了数字1";
$MsgType=text; 
break; 
case "2": 
$mycontent="我收到了数字2";
$MsgType=text; 
break; 
case "3": 
$mycontent="我收到了数字3";
$MsgType=text;
break; 
default : 
$mycontent="输入123试试";//默认回复
$MsgType=text; 
break; 
}
}
//返回文字信息
/*$sRespData =  
"<xml> 
<ToUserName><![CDATA[".$reqFromUserName."]]></ToUserName> 
<FromUserName><![CDATA[".$corpId."]]></FromUserName> 
<CreateTime>".sReqTimeStamp."</CreateTime> 
<MsgType><![CDATA[text]]></MsgType> 
<Content><![CDATA[".$mycontent."]]></Content> 
</xml>";'*/
//返回图文新闻信息,更多方法参考官方接口文档,被动响应消息里边的代码更换XML文件
$sRespData =  
"<xml>
   <ToUserName><![CDATA[".$reqFromUserName."]]></ToUserName>
   <FromUserName><![CDATA[".$corpId."]]></FromUserName>
   <CreateTime>".sReqTimeStamp."</CreateTime>
   <MsgType><![CDATA[news]]></MsgType>
   <ArticleCount>1</ArticleCount>
   <Articles>
       <item>
           <Title><![CDATA[测试]]></Title>
           <Description><![CDATA[详细内容]]></Description>
           <PicUrl><![CDATA[http://www.baidu.com/images/logo.jpg]]></PicUrl>
           <Url><![CDATA[http://www.baidu.com]]></Url>
       </item>
   </Articles>
</xml>";
$sEncryptMsg = ""; //xml格式的密文 
$errCode = $wxcpt->EncryptMsg($sRespData, $sReqTimeStamp, $sReqNonce, $sEncryptMsg); 
if ($errCode == 0) {
print($sEncryptMsg);
} else { 
print($errCode . "\n\n");
}
?>
  • 自己可以根据业务需求,接收到相应信息后,执行本地脚本并返回操作结果实现微信控制zabbix。


    最终效果

相关文章

网友评论

  • 642f696a72df:请问一下,微信控制zabbix,有代码的例子吗?
    _简_述_:其实就是调用zabbix 的api 。可在官网找到使用zabbix 的例子
  • 9c433b8d9b26:请问一下,微信控制zabbix,有代码的例子吗?
    _简_述_:其实就是调用zabbix 的api 。可在官网找到使用zabbix 的例子

本文标题:zabbix微信 | 微信对接自己服务器(2)

本文链接:https://www.haomeiwen.com/subject/kurspttx.html