配置ZABBIX的微信报警时,发现网上的python有兼容性问题,于是自己用PHP写了一个发送的脚本,放在这里给需要的人。
#!/usr/bin/php <?php $corp_id = 'xxxxx'; //微信企业号ID $secret = 'jS8WzmdueRIZKxxxE'; //微信企业号应用secret $app_id = 1; //微信企业号应用ID号 // display E_ERROR and E_WARNING and E_PARSE error_reporting(7); date_default_timezone_set('Asia/Chongqing'); if ( $argc < 3 ) { echo "usage:php ${argv[0]} weChat_userId subject content\n"; exit; } //var_dump($argv); $userId = $argv[1]; $subject = $argv[2]; $content = $argv[3]; $wx = new weChat($corp_id, $secret, $app_id); $wx->sendText($userId, $subject, $content); class weChat{ private $corpId; private $corpSecret; private $appId; private $tokenFile = "/tmp/wx_token.txt"; public $token; function __construct($corpId, $corpSecret, $app_id) { openlog('SendWeChat', LOG_PID | LOG_ODELAY,LOG_LOCAL4); $this->corpId = $corpId; $this->corpSecret = $corpSecret; $this->appId = $app_id; } function __destruct() { closelog(); } /** * 得到微信企业号Token * @return string token */ public function getToken() { // 微信Token API URL $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->corpId}&corpsecret={$this->corpSecret}"; if ( $this->getSaveToken() ) { return true; } else { $re = $this->http_get($url); if ($re === false) { syslog(LOG_INFO, "get weixin token false."); return false; } $token = json_decode($re,true); if( array_key_exists("access_token", $token) ) { $token['expire_time'] = $token['expires_in'] + time(); $this->saveToken(json_encode($token)); $this->token = $token; return true; } else { syslog(LOG_INFO, "get weixin token error,access_token not exists."); return false; } } } /** * 发送文本消息 * @param string $userId * @param string $subject * @param string $content * @return bool */ public function sendText($userId, $subject, $content) { // 微信Token API POST URL $url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="; if ( $this->getToken() ) { $data = array( 'touser' => $userId, 'msgtype' => 'text', 'agentid' => $this->appId, 'text' => array('content' => urlencode($subject . "\n\n" . $content)) ); $re = $this->http_post($url . $this->token['access_token'], urldecode(json_encode($data))); if ($re === false) { syslog(LOG_INFO, "send text messages to weixin({$userId}) false."); return false; } $arrayRe = json_decode($re,true); if( $arrayRe['errcode'] == 0 ) { syslog(LOG_INFO, "send text messages to weixin({$userId}) succeed."); return true; } else { syslog(LOG_INFO, "send text messages to weixin({$userId}) false! errcode:{$arrayRe['errcode']} errmsg:{$arrayRe['errmsg']} "); return false; } } else { return false; } } /** * 保存Token到临时文件 * @param string $token * @return bool * */ private function saveToken( $token ){ try { file_put_contents($this->tokenFile, $token, LOCK_EX); return true; } catch (Exception $e) { syslog(LOG_INFO, "Write File Error (File: ".$e->getFile().", line ". $e->getLine()."): ".$e->getMessage()); return false; } } /** * 得到保存的Token * @return bool */ private function getSaveToken(){ if (file_exists($this->tokenFile) && is_readable($this->tokenFile)) { $token = json_decode(file_get_contents($this->tokenFile),true); $now = time() + 60; if ( $token['expire_time'] > $now ) { $this->token = $token; return true; } else return false; } else { syslog(LOG_INFO, "file({$this->tokenFile}) not exists on unreadable."); return false; } } /** * GET 请求 * @param string $url * @return string content */ public function http_get($url){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } } /** * POST 请求 * @param string $url * @param array $param * @param boolean $post_file 是否文件上传 * @return string content */ public function http_post($url,$param,$post_file=false){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if (is_string($param) || $post_file) { $strPOST = $param; } else { $aPOST = array(); foreach($param as $key=>$val){ $aPOST[] = $key."=".urlencode($val); } $strPOST = join("&", $aPOST); } //var_dump($strPOST); //$header = array('Content-type: application/json'); //curl_setopt($oCurl, CURLOPT_HTTPHEADER, $header); curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } } }
微信收到的报警信息,相比发邮件,每一行都多了一个换行,请问这个问题你解决了吗?
我自己解决了,原因是报警信息的换行是Windows格式的,发送前转一下就可以了。
进来学习学习~~~