微信公眾號自動回復機器人


<?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';
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM