首页 >> 微信开发 >> 开发技术资讯
微信公众平台机器人教程
首先要去微信公众平台申请一个帐号
http://mp.weixin.qq.com/
申请一个SAE应用
我的是http://weixintalk.sinaapp.com
设置微信接口地址
微信平台->设置->回复设置->自定义回复->调用公众平台消息接口>>
url写这个url,token随便定一个"helloczq"
开启SAE服务
由于我们需要教机器人一些日常用语,所以我们必须要一个存储他们的空间,这里暂时使用SAE的kvdb服务,请先到sae开启。
定义规则
我们先给他定义一个简单的规则,比如
求助是
help
教他学东西是
"_" + 问题 + ":" + 回答
比如:_hi:hello,就是回复hello给hi
如果一样东西有很多人教他,机器人应该优先回复旧的东西。
聊天代码
规则定好了,我们先写一个聊天的类
-
class talk {
-
public function reply($str) {
-
$kv = new SaeKV ();
-
$kv->init (); //用户输入帮助语句,可以自定义帮助语法
-
if ($str == 'help' || $str == '求助'){
-
return "要教我读书,请英文下划线开头,接着问题,接着英文冒号,接着回答";
-
} //下划线开头的教学模式
-
if (substr($str, 0,1) == '_'){
-
//教
-
$pos = strpos($str, ':');
-
if ($pos > -1){ //问题
-
$q = substr($str, 1,$pos - 1); //答案
-
$a = substr($str, $pos + 1);
-
//加入知识库
-
$ret = $kv->get('know_' . md5($q)); if ($ret === false || !is_array($ret))
-
$ret = array();
-
$ret[] = $a;
-
$kv->set('know_' . md5($q), $ret);
-
return "known::" . $q . '/' . $a ;
-
}
-
}
-
$ret = $kv->get('know_' . md5($str));//查询数据库,寻找问题答案
-
if ($ret === false || !is_array($ret) || count($ret) == 0){
-
return '我什么都不知道,输入"help"求助';
-
}else{
-
//随机一个
-
while(count($ret) > 1){
-
$re = array_shift($ret);
-
if (rand(0, 1) == 0)
-
return $re;
-
}
-
return array_shift($ret);
-
}
-
}
复制代码
这个类会自动回复,教学,大家可以简单测试一下
接入微信
其实就是把上面那个类和官方的php代码拼起来...
以下是全部代码,包括验证部分
-
define ( "TOKEN", "helloczq" );
-
$wechatObj = new wechat ();
-
$wechatObj->valid ();
-
$wechatObj->responseMsg ();
-
class wechat {
-
public function valid() {
-
$echoStr = $_GET ["echostr"];
-
if (! $this->checkSignature ())
-
exit ();
-
}
-
public function responseMsg() {
-
$postStr = $GLOBALS ["HTTP_RAW_POST_DATA"];
-
if (! empty ( $postStr )) {
-
$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
-
$fromUsername = $postObj->FromUserName;
-
$toUsername = $postObj->ToUserName;
-
$content = trim ( $postObj->Content );
-
$time = time ();
-
$talk = new talk();
-
$textTpl = "
-
-
-
%s
-
-
-
0
-
";
-
$msgType = "text";
-
$contentStr = $talk->reply($content);
-
$resultStr = sprintf ( $textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr );
-
echo $resultStr;
-
-
} else {echo $_GET ["echostr"];
-
exit ();
-
}
-
}
-
private function checkSignature() {
-
$signature = $_GET ["signature"];
-
$timestamp = $_GET ["timestamp"];
-
$nonce = $_GET ["nonce"];
-
$token = TOKEN;
-
$tmpArr = array (
-
$token,
-
$timestamp,
-
$nonce
-
);
-
sort ( $tmpArr );
-
$tmpStr = implode ( $tmpArr );
-
$tmpStr = sha1 ( $tmpStr );
-
-
if ($tmpStr == $signature) {
-
return true;
-
} else {
-
return false;
-
}
-
}
-
}
-
class talk {
-
public function reply($str) {
-
$kv = new SaeKV ();
-
$kv->init ();
-
if ($str == 'help' || $str == '求助'){
-
return "要教我读书,请英文下划线开头,接着问题,接着英文冒号,接着回答";
-
}
-
if (substr($str, 0,1) == '_'){
-
$pos = strpos($str, ':');
-
if ($pos > -1){
-
$q = substr($str, 1,$pos - 1);
-
$a = substr($str, $pos + 1);
-
$ret = $kv->get('know_' . md5($q));
-
if ($ret === false || !is_array($ret))
-
$ret = array();
-
$ret[] = $a;
-
$kv->set('know_' . md5($q), $ret);
-
return "known::" . $q . '/' . $a ;
-
}
-
}
-
$ret = $kv->get('know_' . md5($str));
-
if ($ret === false || !is_array($ret) || count($ret) == 0){
-
return '我什么都不知道,输入"help"求助';
-
}else{
-
//随机一个
-
while(count($ret) > 1){
-
$re = array_shift($ret);
-
if (rand(0, 1) == 0)
-
return $re;
-
}
-
return array_shift($ret);
-
}
-
}
-
}
-
?>
复制代码
地址:海南省海口市南宝路明都大厦1007#
版权所有:海口世纪华联科技有限公司
设计制作:中立科技