微信公众号自动回复机器人

<?php
//写你自己的token
define("TOKEN", "xxxxxx");
define("APPID", "xxxxxxxxxxxxxxxxxxxxxxxxx");
define("APPSECRET", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
//XML的发送文本模板
define("TEXTTPL", "<xml>
                      <ToUserName><![CDATA[%s]]></ToUserName>
                      <FromUserName><![CDATA[%s]]></FromUserName>
                      <CreateTime>%s</CreateTime>
                      <MsgType><![CDATA[%s]]></MsgType>
                      <Content><![CDATA[%s]]></Content>
                      <FuncFlag>0</FuncFlag>
                  </xml>");
//XML的发送图片模板
define("IMAGETPL", "<xml><ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Image><MediaId><![CDATA[%s]]></MediaId></Image>
                    </xml>");
$wechatObj = new wechatCallbackapiTest();
//接口验证
/*$wechatObj->valid();*/

//调用回复消息方法
$wechatObj->responseMsg();
class wechatCallbackapiTest{
    //验证方法
    public function valid(){
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    //消息回复
    public function responseMsg(){
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        //如果用户有请求
        if (!empty($postStr)){
            libxml_disable_entity_loader(true);
            //用户请求的对象
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            //用户输入的文字
            $keyword = trim($postObj->Content);
            $time = time();
            //消息类型
            $msgType = $postObj->MsgType;
            //事件类型
            $event = $postObj->Event;
            //xml模板
            $Tpl = TEXTTPL;
            //默认发送类型
            $sendType = 'text';
            //如果用户的请求类型是事件
            if($msgType=="event"){
                if($event=="subscribe"){
                    $contentStr = "欢迎词";
                }

            }

            //用户的请求类型是文本
            if($msgType=="text"){
                if(substr($keyword,-6)=='图片'){
                    $Tpl = IMAGETPL;            
                    $sendType = "image";    
                    /*$dir  = '@'.dirname(__FILE__).'/tupian.jpg';*/
                    //关键词过滤
                    $keyword = substr($keyword, 0,-6);
                    //图片的网络地址
                    $picurl = $this->getJpg($keyword);
                    //图片的本地地址
                    $dir = $this->jpgChangeLocal($picurl);

                    $contentStr = $this->uploadRes('image',$dir);
                }else{
                    $contentStr =$this-> getWord($keyword);            
                }
            }

            //自动填充xml
            $resultStr = sprintf($Tpl, $fromUsername, $toUsername, $time, $sendType, $contentStr);
            //回复
            echo $resultStr;
        }
        //用户没有请求
        else{
            echo "";
            exit;
        }
    }

    //验证
    private function checkSignature(){
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
  
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }

    //聊天机器人
    public function getWord($keyword){
        $url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=".urlencode($keyword);
        $result = $this->_request($url);

        if($result){
            $result = json_decode($result,true);
            if($result['result']==0){
                return $result['content'];
            }
        }
        return '系统故障';
    } 

    //抓取(支持get/post)
    function _request($curl,$https=true,$method='GET',$data=null){  
        //1.创建一个新cURL资源  
        $ch = curl_init();  
          
        //2.设置URL和相应的选项  
        //要访问的网站  
        curl_setopt($ch, CURLOPT_URL, $curl);  
        //启用时会将头文件的信息作为数据流输出。      
        curl_setopt($ch, CURLOPT_HEADER, false);   
        //将curl_exec()获取的信息以字符串返回,而不是直接输出。    
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     
      
        if($https){  
            //FALSE 禁止 cURL 验证对等证书(peer's certificate)。  
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    
     
            //可以省略不写,默认为2
           /* curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);  //验证主机  */
        }  
        if($method == 'POST'){  
            //发送 POST 请求  
            curl_setopt($ch, CURLOPT_POST, true);   
            //全部数据使用HTTP协议中的 "POST" 操作来发送。        
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    
        }  
          
        //3.抓取URL并把它传递给浏览器  
        $content = curl_exec($ch);  
        if ($content  === false) {  
          return "网络请求出错: " . curl_error($ch);  
          exit();  
        }  
          
        //4.关闭cURL资源,并且释放系统资源  
        curl_close($ch);  
          
        return $content;  
    } 

    //access_token是公众号的全局唯一接口调用凭据
    function getAccess_token(){
        $appid = APPID;
        $appsecret = APPSECRET;
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";

        $resultData = json_decode($this->_request($url),true);
        return  $resultData['access_token'];
    }

    //上传资源,新增临时素材,返回media_id
    function uploadRes($type,$media){
        $data = array('media'=>$media);
        $access_token = $this->getAccess_token_sql();
        $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={$access_token}&type={$type}";
        $resultData = json_decode($this->_request($url,true,'POST',$data),true);
        return $resultData['media_id'];
    }

    //为提高速度,通过MySQL获取Access_token
    function getAccess_token_sql(){
        //创建数据库连接
        $conn = mysqli_connect('xxxxxxxxxx','xxxxxx','xxxxx','xxxxxxxxxxxxxxx');
        if (!$conn) {
            die("连接失败: " . mysqli_connect_error());
        }
        $sql = "SELECT * FROM access_token WHERE ID = 1";
        $result = mysqli_query($conn, $sql);
        if($row = mysqli_fetch_assoc($result)){
            $access_token = $row['access_token'];
            $update_time = $row['update_time'];
        }
        $time = time();
        //如果时间相隔小于两小时,以前的token还能用
        if($time-$update_time<7150){
            return $access_token;
        }else{
            $access_token = $this->getAccess_token();
            //更新数据库,把token写入并更新时间
            mysqli_query($conn,"UPDATE access_token SET access_token = '{$access_token}',update_time = {$time} WHERE ID = 1");
            return $access_token;
        }
    }

    //网络图片转换本地图片
    function jpgChangeLocal($pic){

        //获取文件
        $file = $this->_request($pic);        
        $filename = 'image/'.time().'.jpg';
        //打开写入流
        $resource = fopen($filename, 'a');
        //写入
        fwrite($resource, $file);
        //关闭资源
        fclose($resource);
        return '@'.dirname(__FILE__).'/'.$filename;
    }

    //通过关键词返回jpg百度图片网络地址
    function getJpg($keyword){
        $url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord+=&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&word={$keyword}";
        $result = $this->_request($url);
        //查询后json转换得到的数组
        $resultdata = json_decode($result,true);
        /*return $data['data'][0]['hoverURL'];*/
        //过滤data
        foreach($resultdata['data'] as $key => $value){
            //如果这url不为空
            if(strlen($value['hoverURL'])>20){
                //添加到数组
                $urldata[] = $value['hoverURL'];
            }
        }
        if($urldata){
            //随机发送图片
            $index = rand(0,count($urldata)-1);
            return $urldata[$index];
        //
        }else{
            //查询失败默认返回图片
            return 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=75145293,1379637150&fm=27&gp=0.jpg';
        }
    }
}

 

posted @ 2018-07-09 17:14  cl94  阅读(1248)  评论(0编辑  收藏  举报