去年曾介绍过用脚本给微信订阅号关注者发送消息的方法,今天介绍一个使用自建服务器给企业号的关注者发消息(文字及图片)、接收消息、自动回复消息及做相应自动化操作的方法。
运维方面,可用来发告警的文字消息或图片,然后手机上收到消息后,可以通过在手机上直接回复已设定好的关键字或相应的命令,这时会传到自建服务器上,就可以自动运行相应的脚本、命令进行自动化操作,并可将操作结果发送出来。
闲话不多说,开始说步骤:
一、shell脚本发送文字消息或图片
1.到微信公众平台网站上(https://mp.weixin.qq.com/)注册一个企业号(其中主体类型选为“团队”的话可以不用提供企业相关证明)。
2.手机关注微信号
3.登陆企业号后台,选择“设置”-“功能设置”-“权限管理”-“发送消息”,可以看到CorpID和Secret,记下来后面会用到。
4.在服务器写shell脚本:
123456789101112131415161718192021222324252627#!/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
运行脚本后手机就可以收到信息了:
二、设置微信服务器将收到的消息转发至自建服务器,自建服务器可以根据内容自动运行相应的脚本,以及进行自动回复。
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 ,注意!此处官方提供的脚本有误!
123456789101112131415161718<?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
{
(
"ERR: "
.
$errCode
.
"\n\n"
);
}
?>
4.回到企业号后台点击保存验证。
5.验证通过,修Sample.php进行消息接收和自动回复
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152<?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
{
(
"ERR: "
.
$errCode
.
"\n\n"
);
// exit(-1);
}
}
else
{
(
"ERR: "
.
$errCode
.
"\n\n"
);
//exit(-1);
}
?>
在手机上对企业号发送消息“测试测试”,收到了服务器的自动回复:
原文出自:
http://blog.too2.net/?p=230
转载请注明转自:辛碌力成【http://blog.too2.net】
发表评论