首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

微信公眾平台開發:2014 世界盃賽程查詢機器人實作

     編輯:PHP 相關知識

2014 巴西世界盃背景

第 20 屆世界盃於 2014 年 6 月 12 日至 7 月 13 日在巴西 12 個城市舉行,32 支球隊參賽,共 64 場賽事,首次採用門線技術。

微信機器人核心程式碼

<?php
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
} else {
    $wechatObj->valid();
}

class wechatCallbackapiTest {
    public function valid() {
        $echoStr = $_GET["echostr"];
        $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) {
            echo $echoStr;
            exit;
        }
    }

    public function responseMsg() {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)) {
            $this->logger("R " . $postStr);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);
            switch ($RX_TYPE) {
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
            }
            $this->logger("T " . $result);
            echo $result;
        } else {
            echo "";
            exit;
        }
    }

    private function receiveEvent($object) {
        $content = "";
        switch ($object->Event) {
            case "subscribe":
                $content = array();
                $content[] = array(
                    "Title" => "2014年巴西世界盃賽程",
                    "Description" => "",
                    "PicUrl" => "https://images.cnitblog.com/i/340216/201406/111304544204656.jpg",
                    "Url" => "https://url.cn/RInu1v"
                );
                break;
        }
        if (is_array($content)) {
            $result = $this->transmitNews($object, $content);
        } else {
            $result = $this->transmitText($object, $content);
        }
        return $result;
    }

    private function receiveText($object) {
        $keyword = trim($object->Content);
        if (strstr($keyword, "世界盃") || strstr($keyword, "足球")) {
            $content = array();
            $content[] = array(
                "Title" => "2014年巴西世界盃賽程",
                "Description" => "",
                "PicUrl" => "https://images.cnitblog.com/i/340216/201406/111304544204656.jpg",
                "Url" => "https://url.cn/RInu1v"
            );
        } else {
            $content = date("Y-m-d H:i:s", time()) . "\n技術支援 方倍工作室";
        }
        if (is_array($content)) {
            $result = $this->transmitNews($object, $content);
        } else {
            $result = $this->transmitText($object, $content);
        }
        return $result;
    }

    private function transmitText($object, $content) {
        $textTpl = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            </xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

    private function transmitNews($object, $arr_item) {
        if (!is_array($arr_item)) return;
        $itemTpl = "
            <item>
            <Title><![CDATA[%s]]></Title>
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url>
            </item>";
        $item_str = "";
        foreach ($arr_item as $item)
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
        $newsTpl = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[news]]></MsgType>
            <Content><![CDATA[]]></Content>
            <ArticleCount>%s</ArticleCount>
            <Articles> $item_str</Articles>
            </xml>";
        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
        return $result;
    }

    private function logger($log_content) {
        if (isset($_SERVER['HTTP_BAE_ENV_APPID'])) {
            require_once "BaeLog.class.php";
            $logger = BaeLog::getInstance();
            $logger->logDebug($log_content);
        } else if (isset($_SERVER['HTTP_APPNAME'])) {
            sae_set_display_errors(false);
            sae_debug($log_content);
            sae_set_display_errors(true);
        } else if ($_SERVER['REMOTE_ADDR'] != "127.0.0.1") {
            $max_size = 10000;
            $log_filename = "log.xml";
            if (file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)) {
                unlink($log_filename);
            }
            file_put_contents($log_filename, date('H:i:s') . " " . $log_content . "\r\n", FILE_APPEND);
        }
    }
}
?>

功能流程說明

  1. 驗證簽名:valid() 驗證微信伺服器簽名
  2. 事件處理:關注事件回覆圖文訊息(世界盃賽程)
  3. 文字處理:關鍵字「世界盃」或「足球」觸發圖文回覆,其他回覆時間戳
  4. 多環境日誌:支援 BAE、SAE、本地環境日誌記錄

效果展示

效果圖1 效果圖2

方倍工作室關注方式

  1. 微信通訊錄 → 添加朋友 → 查找公眾號 → 搜尋「方倍工作室」
  2. 微信通訊錄 → 添加朋友 → 搜號碼 → 輸入「pondbaystudio」
  3. 掃描二維碼:二維碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved