美文网首页ITThinkPHPPHP探索与反思
微信公众平台聊天机器人

微信公众平台聊天机器人

作者: hellojammyPlus | 来源:发表于2015-01-27 23:08 被阅读11787次

    点击访问原文
    您还可以加入全栈技术交流群(QQ群号:254842154)


    今天我们来看看有哪些比较好玩的聊天机器人,并且通过微信公众号搭建一个自己的聊天机器人。

    QQ机器人

    腾讯有一个可以聊天的QQ机器人,当时觉得特别好玩,它会不厌其烦地陪你聊天,不吃不喝。它的QQ号是:615050000。

    小黄鸡

    曾经非常火的人人网小黄鸡聊天机器人,陪着大学生度过了多少个空虚寂寞冷的日日夜夜。在这里可以找到开发文档:http://dev.skjqr.com/ 。它提供了一个快速接入微信后台的功能:

    8.pic.jpg

    假如你的微信公众号没有自己开发的功能,那么只要按照下面的“微信接口”说明,在微信公众号后台设置参数即可。

    假如你的微信公众号已经有自己的功能,现在又想加入小黄鸡的功能,那么就要自己开发了。这里特别注意,msg参数需要GBK编码。

    下面给出关键性代码(php):

        public function response($postObj){
        $r["r"] = false;
        $response = getWebCont(SK_ROBOT_API . iconv("UTF-8","GB2312//IGNORE", $postObj['content']));
        //返回的格式是否正确,假如正确,是以[msg]开头的
        if(preg_match(SK_REG_ROBOT_RESPONSE_MSG_BEGIN, $response , $match)){
            $response = str_replace("[msg]" , "" , $response);
            $response = str_replace("[/msg]" , "" , $response);
            $r["r"] = true;
            $r["res"] = $response;
        }
        return $r;
    }
    

    宏定义:

    define ("SK_ROBOT_API","http://dev.skjqr.com/api/weixin.php?email=your_email&appkey=your_appkey&msg=");
    
    // 返回的消息以 [msg] 开头
    define("SK_REG_ROBOT_RESPONSE_MSG_BEGIN","/\[msg]/"); 
    

    getWebCont是php中通过curl方式发送请求的自定义方法:

    function getWebCont($url, $data = '', $sslVerify = false) {
    $ch = curl_init();
    if ($sslVerify) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if ($data) {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    $body = curl_exec($ch);
    $head = curl_getinfo($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($head['http_code'] == '200') {
        return $body;
    } else {
        //log here 
        return false;
    }
    }
    

    可以看到,使用还是比较简单的。

    图灵机器人

    个人比较喜欢图灵机器人,官方网址:http://www.tuling123.com/openapi/。 它返回的聊天数据中,类型比较全面,而且是友好的json格式。而小黄鸡返回的就是一个字符串。

    9.pic.jpg

    针对它返回的数据,我们可以重新对数据进行整合。这是我写的一个方法:

    /*
     * 注意:info字段需要urlencode编码
     * $postObj是微信返回的数据,我对它进行了二次封装
     */
    public function response($postObj){
        $r["r"] = true;
        $response = getWebCont(TL_ROBOT_API . "userid=" . $postObj['from'] . '&info=' . urlencode($postObj['content']));
        if(!$response){
            $r['res'] = "我无法理解你的问题。抱歉。";
            return $r;
        }
    
        $json = json_decode($response);
    
        if(!is_object($json) || !property_exists($json, "code")){
            $r['res'] = "我无法理解你的问题。抱歉。";
            return $r;
        }
    
        //$r["r"] = true;
        switch($json->code){
            //文本类数据
            case 100000:
                $tmp = $json->text;
                break;
            //网址类数据 打开百度
            case 200000:
                $tmp = $json->text . "\n" . $json->url;
                break;
            //菜谱  红烧肉怎么做?
            case 308000:
                $tmp = $json->text . "\n\n";
    
                foreach($json->list as $kv){
                    $t = WXResponseHelper::buildHref($kv->name,$kv->detailurl,false);
                    $t .= "(" . $kv->info . ")";
                    $t .= "\n\n";
    
                    if(!WXResponseHelper::maxLen($tmp, $t)){
                        $tmp .= $t;
                    }else{
                        break;
                    }
                }
    
            break;
    
            //列车信息  深圳到成都的火车
            case 305000:
                $tmp = $json->text . "\n\n";
                foreach($json->list as $kv){
                    $t = $kv->trainnum . "\n";
                    $t .= $kv->start . "(" . $kv->starttime . ")" . " → " . $kv->terminal . "(" . $kv->endtime . ")";
                    $t .= "\n\n";
    
                    if(!WXResponseHelper::maxLen($tmp, $t)){
                        $tmp .= $t;
                    }else{
                        break;
                    }
                }
                break;
            //航班 明天成都飞深圳的飞机
            case 306000:
                $tmp = $json->text . "\n\n";
                foreach($json->list as $kv){
                    $t = $kv->starttime . " - " . $kv->endtime . "  " . $kv->flight . "\n\n";
                    if(!WXResponseHelper::maxLen($tmp, $t)){
                        $tmp .= $t;
                    }else{
                        break;
                    }
                }
                break;
            //酒店 深圳南山区附近的酒店
            case 309000:
                $tmp = $json->text . "\n\n";
                foreach($json->list as $kv){
                    $t = $kv->price . "  " . $kv->satisfaction . "  " . WXResponseHelper::buildHref($kv->name,$kv->icon) . "\n";
                    if(!WXResponseHelper::maxLen($tmp, $t)){
                        $tmp .= $t;
                    }else{
                        break;
                    }
                }
                break;
            //商品价格 惠人榨汁机多少钱
            case 311000:
                $tmp = $json->text . "\n\n";
                foreach($json->list as $kv){
                    $t = $kv->price . "  " . WXResponseHelper::buildHref($kv->name,$kv->detailurl) . "\n\n";
                    if(!WXResponseHelper::maxLen($tmp, $t)){
                        $tmp .= $t;
                    }else{
                        break;
                    }
                }
                break;
            //新闻 最新新闻
            case 302000:
                $tmp = $json->text . "\n\n";
                foreach($json->list as $kv){
                    $t = WXResponseHelper::buildHref($kv->article,$kv->icon) . "(" . $kv->source . ")" . "\n\n";
                    if(!WXResponseHelper::maxLen($tmp, $t)){
                        $tmp .= $t;
                    }else{
                        break;
                    }
                }
                break;
    
            case 40001:
                $tmp = "key的长度错误(32位)";
                break;
            case 40002:
                $tmp = "请求内容为空";
                break;
            case 40003:
                $tmp = "key错误或帐号未激活";
                break;
            case 40004:
                $tmp = "当天请求次数已用完";
                break;
            case 40005:
                $tmp = "暂不支持该功能";
                break;
            case 40006:
                $tmp = "服务器升级中";
                break;
            case 40007:
                $tmp = "服务器数据格式异常";
                break;
            case 50000:
                $tmp = "机器人设定的“学用户说话”或者“默认回答”";
                break;
            default:
                $tmp = "我无法理解你的问题。抱歉。";
                break;
        }
    
        $r['res'] = $tmp;
        return $r;
    }
    

    宏定义:

    //图灵机器人
    define("TL_ROBOT_API","http://www.tuling123.com/openapi/api?key=your_appkey&");
    

    其中,WXResponseHelper类是一个工具类:

    class WXResponseHelper {
    
    /**
     * 构造链接
     * @param $txt
     * @param $link
     * @param bool $blank
     * @return string
     */
    public static function buildHref($txt, $link, $blank = true){
        if($link == "")
            return $txt;
    
        return sprintf("<a href=\"%s\" %s >%s</a>", $link, ($blank ? "target=\"_blank\"" : ""), $txt);
    }
    
    public static function maxLen($allText, $text){
        $len = strlen($text);
        $total_bytes = strlen($allText);
        $total_bytes += $len;
        return $total_bytes < WECHAT_MAX_RESPONSE_LEN ? false : true;
    }
    
    }
    

    我们要注意,返回给微信的字符串中,最大不能超过2048字符,不然会提示公众号无法提供服务。另外,请求参数中带上userid,会使聊天具有上下文,我这里直接使用了用户的openid(长度为28)。

    ////回复给微信的消息长度不能超过2048字节
    define("WECHAT_MAX_RESPONSE_LEN" , 2048); 
    

    我们来看看效果吧:

    菜谱 航班 酒店 价格 价格

    还是很容易的吧!这里涉及到了一些微信公众号的后台开发,我有时间再专门写文章介绍,大家关注我的博客即可。对于如何把该聊天功整合到微信公众号,我的建议是,先走之前的逻辑,假如都没有匹配到,再把用户发来的文本丢给聊天机器人处理。

    想调戏一下机器人吗?微信扫一扫下面的二维码,它还有在线记录文字和图片的功能哦,更多惊喜等待你去发现。更多介绍可以看这里:http://mp.weixin.qq.com/s?__biz=MjM5MTY4MjQ1Mw==&mid=203319413&idx=1&sn=cd0632d6bb1b790c0ca63fd4c675c649&key=79cf83ea5128c3e5d0570a32265ee45aaf15fc97a7b962ce1be0348ef8da0c01e66bef4697cabd601b900cbf2a7db7e2&ascene=0&uin=MzI2NTUzMzIw&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10.1+build(14B25)&version=11020012&pass_ticket=dUkp7VhYdQm79stsvQ6JFA04to9fW9m%2FNGTH%2FvFdjDA1HQWBRpIL%2BZ8KZ2g43sKq

    hellochats

    相关文章

      网友评论

      本文标题:微信公众平台聊天机器人

      本文链接:https://www.haomeiwen.com/subject/fszkxttx.html