给微信公众号增添聊天机器人功能

news/2024/11/27 22:35:07/

原文地址:http://hello1010.com/wechat-robot/


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

QQ机器人

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

小黄鸡

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


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

假如你的微信公众号已经有自己的功能,现在又想加入小黄鸡的功能,那么就要自己开发了。这里特别注意,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;
}
}

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

图灵机器人

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


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

/** 注意: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://www.ppmy.cn/news/141193.html

相关文章

2天时间3个面试,百度进了3面,二三线城市却异常惨淡~

昨天和朋友复盘了一下最近的面试经历&#xff0c;分享给大家&#xff1a; 关于就业环境 忠告&#xff1a;如果不是在二三线买车买房结婚生子了&#xff0c;还是到一线城市去吧。 或者换个行业&#xff01; 关于焦虑和摆烂 如果你也在焦虑迷茫、精神内耗。找阳哥给你做“心理…

连个网就算智能了?智能产品市场到底有多少泡沫

现在&#xff0c;假设你是产品经理&#xff0c;你认为下面哪一款才是真正有市场潜力的靠谱智能产品&#xff1f; A) 能够跟踪监测你一天喝了多少水的水壶。 B) 能够跟踪监测你的狗&#xff08;对是你的狗&#xff09;一天喝了多少水的碗。 C) 能够随时提醒你别落下自己的伞的智…

万般皆下品,唯有收租高

这个标题可能带来一些关于政治领域的联想&#xff0c;特别说明一句&#xff0c;本文不涉及香港话题。 前段时间看一篇文章&#xff0c;分析北京各种烧烤连锁店模式和盈利的&#xff0c;数据佐证很有条理&#xff0c;我挺喜欢这种文章&#xff0c;商业分析在日常创业场景中的范例…

6分钟,带迷茫的你快速入门大数据

在这个国家都在大力发展大数据战略的时代&#xff0c;无论是作为学生还是已经工作了的程序猿&#xff0c;都希望能够通过学习掌握大数据来获得一份好的工作&#xff0c;提升自己的工资收入。那么我们该如何学习大数据&#xff1f;从哪里开始学呢&#xff1f; 就以上几个问题&a…

李迟2022年6月工作生活总结

本文为 2022 年 6 月工作生活总结。 研发编码 前端 需求&#xff1a;某输入框自动补全&#xff0c;带有中文名称&#xff0c;但后端只处理数字&#xff0c;需解析出数字并序列化。如将梧州岑溪 001改为001&#xff0c;但页面依然显示前者。解析函数如下&#xff1a; function…

从给丈母娘榨果汁带你认识Apache Kylin(文末赠书)

一、开篇 二、Apache Kylin是什么&#xff1f; 三、为什么要使用Apache Kylin&#xff1f; 四、Apache Kylin的架构 五、Kylin使用案例 六、Kylin AI展望 七、总结 一、开篇 我这个人有个习惯&#xff0c;每天早上起床刷牙之后要先喝一杯果汁。我只喜欢吃3种水果&#xff1a;苹…

你被京东“坑”了多少钱?

拼多多火了好长时间了&#xff0c;但是质量实在不敢恭维&#xff01;所以我和身边的朋友一直都还是在京东和淘宝剁手&#xff01;尤其电子产品&#xff0c;逛京东还是更多一些。京东的商品虽然价格没有优势&#xff0c;但品质依然还是值得信赖的&#xff01; 上周&#xff0c;我…

js数值的扩展

数值的扩展 二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法&#xff0c;分别用前缀0b&#xff08;或0B&#xff09;和0o&#xff08;或0O&#xff09;表示。 0b111110111 503 // true 0o767 503 // true从 ES5 开始&#xff0c;在严格模式之中&#xff0c;…