首页IT技术系统 › 微信企业号在运维中的一些使用

微信企业号在运维中的一些使用

去年曾介绍过用脚本给微信订阅号关注者发送消息的方法,今天介绍一个使用自建服务器给企业号的关注者发消息(文字及图片)、接收消息、自动回复消息及做相应自动化操作的方法。

运维方面,可用来发告警的文字消息或图片,然后手机上收到消息后,可以通过在手机上直接回复已设定好的关键字或相应的命令,这时会传到自建服务器上,就可以自动运行相应的脚本、命令进行自动化操作,并可将操作结果发送出来。


闲话不多说,开始说步骤:

一、shell脚本发送文字消息或图片

1.到微信公众平台网站上(https://mp.weixin.qq.com/)注册一个企业号(其中主体类型选为“团队”的话可以不用提供企业相关证明)。

2.手机关注微信号

3.登陆企业号后台,选择“设置”-“功能设置”-“权限管理”-“发送消息”,可以看到CorpID和Secret,记下来后面会用到。

4.在服务器写shell脚本:

#!/bin/bash
#返回access token
function getToken(){ #传入参数$1为corpid,参数$2为corpsecret
    curl -s "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$1&corpsecret=$2" | awk -F '"' '{print $4}'
}
#返回media_id
function getMediaId(){ #传入参数$1为access token;参数$2为图片文件
    curl -s -F media=@$2 "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=$1&type=image" | awk -F '"' '{print $8}'
}
#发送文字消息
function sendText(){ #传入参数$1为access token,$2为消息内容,$3指定接收消息的账号
    curl -d '{"touser": "'$3'", "msgtype": "text", "agentid": 0, "text": {"content": "'$2'"}, "safe":"0"}'  "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$1"
}
#发送图片消息
function sendImage(){ #传入参数$1为access token;参数$2为media_id,$3指定接收消息的账号
    postdata='{"touser": "'$3'", "msgtype": "image", "agentid": 0, "image": {"media_id": "'$2'"}, "safe":"0"}'
    curl -d "$postdata"  "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$1"
}
corpid='wxxxxxxxxxxxxx' #使用前面记下来的值替换
corpsecret='xxxxxxxxxxxxxxxxxxxx'  #使用前面记下来的值替换
image='test.png'
text='这是发送的内容'
receiver='158xxxxxxxx' #此处为接收者的id,根据企业号后台的设置(ID),可以是手机号、微信号或其它的。同时发送到多个关注者用“|”隔开。
token=`getToken $corpid $corpsecret`
sendText $token $text $receiver
media_id=`getMediaId $token $image`
sendImage $token $media_id $receiver


运行脚本后手机就可以收到信息了:

0.jpg


二、设置微信服务器将收到的消息转发至自建服务器,自建服务器可以根据内容自动运行相应的脚本,以及进行自动回复。

1.在企业号后台 “应用中心”-“企业小服手”-“模式选择”里选择“回调模式”,填入自建服务器的url( http://wx.test.net:8080/Sample.php),并自动生成token和EncodingAESKey,记下来后面使用。

2.下载微信官方提供的加密库,这里下载的是php的。(http://qydev.weixin.qq.com/wiki/index.php?title=加解密库下载与返回码)

3.修改Sample.php ,注意!此处官方提供的脚本有误!

<?php
include_once "WXBizMsgCrypt.php";
$encodingAesKey = "XXXXXXXXXX"; //替换成上面生成的
$token = "XXXXXXXX"; //替换成上面生成的
$corpId = "wxxxxxxxxxx";  //#替换成上面生成自己的corpID
$sVerifyMsgSig = $_GET["msg_signature"]; //此处几行官方提供的有坑!
$sVerifyTimeStamp = $_GET["timestamp"];
$sVerifyNonce = $_GET["nonce"];
$sVerifyEchoStr = $_GET["echostr"];
$sEchoStr = "";
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
$errCode = $wxcpt->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
if ($errCode == 0) {
    echo $sEchoStr;
} else {
    print("ERR: " . $errCode . "\n\n");
}
?>

4.回到企业号后台点击保存验证。

5.验证通过,修Sample.php进行消息接收和自动回复

<?php
include_once "WXBizMsgCrypt.php";
$encodingAesKey = "XXXXXXXXXXXXX";
$token = "XXXXXXXXXXXXXXXXXXX";
$corpId = "wxXXXXXXXXXXXXXXXX";
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
$sReqMsgSig = $_GET["msg_signature"];
$sReqTimeStamp = $_GET["timestamp"];
$sReqNonce =$_GET["nonce"];
$sReqData = $GLOBALS["HTTP_RAW_POST_DATA"];
$sMsg = "";  
$errCode = $wxcpt->DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $sMsg);
if ($errCode == 0) {
    $postStr=$sMsg;
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $content = trim($postObj->Content);  
//根据手机回复的内容执行相应的脚本或命令,也可以将执行结果再发送到关注者手机上。
    if($fromUsername == '15800000000' && $content == "下线XX服务器"){ 
        system('/usr/local/script/offline xx');  
    }elseif($fromUsername == '15800000000' && $content == "command" ){
         system('command');
    }
    $time = time();
if($fromUsername=='15800000000')  //关注者的ID
    $reply='我自己';  //可以根据不同关注者、不同$content自动回复不同内容
else if ($fromUsername=='13900000000')
    $reply='关注者二';
else
    $reply='其它人';
    $textTpl = "<xml> 
                            <ToUserName><![CDATA[%s]]></ToUserName> 
                            <FromUserName><![CDATA[%s]]></FromUserName> 
                            <CreateTime>%s</CreateTime> 
                            <MsgType><![CDATA[text]]></MsgType> 
                            <Content><![CDATA[你说的是%s,你是$reply]]></Content>                           
                            </xml>";
    $sRespData= sprintf($textTpl, $fromUsername, $toUsername, $time, $content);
    $sEncryptMsg = "";  
$errCode = $wxcpt->EncryptMsg($sRespData, $sReqTimeStamp, $sReqNonce, $sEncryptMsg);
if ($errCode == 0) {
    echo $sEncryptMsg;
} else {
    print("ERR: " . $errCode . "\n\n");
    // exit(-1); 
    }
} else {
    print("ERR: " . $errCode . "\n\n");
    //exit(-1); 
}
?>

在手机上对企业号发送消息“测试测试”,收到了服务器的自动回复:

1.jpg

原文出自: http://blog.too2.net/?p=230
转载请注明转自:辛碌力成【http://blog.too2.net】

发表评论