最近在弄微信远程控制,闲来无聊把图灵机器人接入自己公众号
网上的有的是直接图灵官网那接入,但是那样就完全接管了公众号的消息管理了,自己的就没用了,然后百度了一番,终于弄出来了
预备条件:服务器(云主机,自己买),微信公众号,和一个图灵的apikey(图灵官网申请个机器人后就可以获得),会点php基础(我用php开发的..)
先自己微信公众号先对接上自己主机。怎么对接有时间我发下教程。。。
另外再废话点,微信公众号一般是三种,订阅号(个人),服务号(工商个体户),企业号(企业用),订阅号只能个人用并且开启开发者模式后(也就是你对接服务器了后无法自定义菜单,这点很坑….),服务号和企业号不说了,反正个人申请不了…,另外无论你申请了哪种公众号,你都可以开启测试号,测试号是微信官方给开发者开发测试用的,是三种公众号的混合体,但是使用期限只有一年(怎么使用自己想清楚就行了,别瞎打开了)…
微信公众号流程是用户发消息给微信服务器,然后微信服务器生成对应的xml转发给你主机,你主机解析xml后进行处理回应对应的xml给微信服务器,微信服务器解析xml后返回给用户
以下是逻辑处理代码,微信的xml是post过来的,先接收post内容,然后判断是否非空,再把xml转成对象,然后几个关键的xml数据非空再往下处理,然后判断用户消息类型也就是Msgtype分类处理,菜单的每个还有个唯一的key用于指定菜单的唯一性,的目前还没写完,看下微信公众号官方开发文档就懂了,然后根据关键字回复,default就是非自定义的关键字以外的内容,也就是要交给图灵机器人的,api已打码,自己的填进去就行,目前还没完善,仅供参考
$post_data = $GLOBALS["HTTP_RAW_POST_DATA"];
if(!empty( $post_data) ) {
$post_data=simplexml_load_string($post_data);
if (!empty( $post_data->FromUserName &&
$post_data->ToUserName &&
$post_data->CreateTime &&
$post_data->MsgType ) ) {
$FromUserName = $post_data->FromUserName;
$ToUserName = $post_data->ToUserName;
$userword = trim($post_data->Content);
$MsgType = $post_data->MsgType;
$Event = $post_data->Event;
$time = time();
$xml = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
switch ($MsgType) {
case "text":
if (!empty($userword)) {
switch ($userword) {
case "开灯":
$Content="收到开灯";
break;
case "关灯":
$Content="收到关灯";
break;
default:
$apikey="*****";
$url="http://www.tuling123.com/openapi/api?key=%s&info=%s";
$url=sprintf($url,$apikey,$userword);
$json=file_get_contents($url);
$json=json_decode($json);
$Content=$json->text."\r\n".$json->url;;
break;
}
$reply=sprintf($xml,$FromUserName,$ToUserName,$time,$MsgType,$Content);
echo $reply;
}
else echo "";
break;
case "event":
$MsgType="text";
switch ($Event) {
case "subscribe":
$Content="欢迎订阅测试号";
$reply=sprintf($xml,$FromUserName,$ToUserName,$time,$MsgType,$Content);
echo $reply;
break;
case "CLICK":
$Content="收到菜单点击";
$reply=sprintf($xml,$FromUserName,$ToUserName,$time,$MsgType,$Content);
echo $reply;
break;
default:
$Content="收到点击";
$reply=sprintf($xml,$FromUserName,$ToUserName,$time,$MsgType,$Content);
echo $reply;
break;
}
break;
default:
# code...
break;
}
}
}
else {
echo "";
exit;
}
?>
以下是效果
有疑问的可以致电我邮箱