微信公众号最佳实践 ( 8.8)智能聊天机器人
智能聊天机器人
小i机器人,是上海至臻网络科技有限公司开发的智能机器人产品,是全球用户量最大的中文聊天机器人。该机器人,能查询新闻、地图、餐饮、机票等各类生活资讯。
iBotCloud
iBotCloud全称为”小i机器人智能云服务平台”,是”小i机器人“在开放自身的核心能力的基础上,为广大开发者、合作伙伴和企业提供的一系列基于云计算和大数据平台的在线服务和开发接口。
开发者可以利用uBotCloud提供的在线服务,定义机器人属性,编辑机器人的智能回答,打造属于您的智能交互机器人。此外,iBotCloud支持多种渠道(微信接入,网站接入)的快速接入。
iBotCloud的官方网址如下:http://cloud.xiaoi.com/
用户通过注册即可获得”初级测试权限“,获得智能回答,自定义知识模块的基础测试权限,
同时,iBotCloud会为开发者提供API接口(Key 和 Secret),开发者可以通过访问API接口与iBotCloud进行快速对接,从而为自己的应用程序增加丰富的智能语音交互体验。
iBotCloud智能问答接口地址如下:http://nlp.xiaoi.com/robot/ask.do
开发实现
微信公众号在收到文本消息之后,即调用小i机器人来自动回复,需要将用户id及用户的内容都传递给机器人。相关代码如下:
private function receiveText($object){$keyword = trim($object->Content);include("xiaoi.php");$content = getXiaoiInfo($object->FromUserName, $keyword);$result = $this->transmitText($object, $content);return $result;}
小i机器人的逻辑实现比较复杂,其智能问答的实现代码如下:
xiaoi.php整体代码如下
<?php//var_dump(getXiaoiInfo("asdf", "你是谁?"));
function getXiaoiInfo($openid, $content)
{//定义api接口,即申请到的接口$app_key="0266e*****";$app_secret="Je5VbXA*******";//签名算法的实现,小i机器人API需要通过签名来访问,签名的过程是将APP的key和secret以及随机数等参数//根据一定签名算法生成的签名值作为新的请求头中的一部分,以此来提高访问过程中的防篡改性。$realm = "xiaoi.com";$method = "POST";$uri = "/robot/ask.do";$nonce = "";$chars = "abcdefghijklmnopqrstuvwxyz0123456789";for ($i = 0; $i < 40; $i++) {$nonce .= $chars[ mt_rand(0, strlen($chars) - 1) ];}//签名算法如下://sha1加密(app_key:realm:app_secret)其中realm为xiaoi.com$HA1 = sha1($app_key.":".$realm.":".$app_secret);//sha1加密(method:um)其中method为请求方法,如POST,uri为"/robot/ask.do"$HA2 = sha1($method.":".$uri);//sha1加密(HA1:nonce:HA2)其中HA1为步骤1的值,HA2为步骤2的值,nonce为40位随机数$sign = sha1($HA1.":".$nonce.":".$HA2);//接口调用,使用cURL获取调用智能问答的结果$url = "http://nlp.xiaoi.com/robot/ask.do";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);//小i机器人API的有效访问都必须包含签名请求头,signature为签名算法步骤3的值,最后为该字符串添加请求头:“X-Auth”curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Auth: app_key="'.$app_key.'", nonce="'.$nonce.'", signature="'.$sign.'"'));curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);//将请求参数连接成字符串,通过POST提交给接口curl_setopt($ch, CURLOPT_POSTFIELDS, "question=".urlencode($content)."&userId=".$openid."&platform=custom&type=0");$output = curl_exec($ch);if ($output === FALSE){return "cURL Error: ". curl_error($ch);}//返回接口的内容。return trim($output);
}
index.php整体代码如下
<?phpdefine("TOKEN", "weixin");$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {$wechatObj->responseMsg();
}else{$wechatObj->valid();
}class wechatCallbackapiTest
{public function valid(){$echoStr = $_GET["echostr"];if($this->checkSignature()){echo $echoStr;exit;}}private function checkSignature(){$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){return true;}else{return false;}}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 = "欢迎关注 德强1012 ";break;case "unsubscribe":$content = "取消关注";break;}$result = $this->transmitText($object, $content);return $result;}private function receiveText($object){$keyword = trim($object->Content);include("xiaoi.php");$content = getXiaoiInfo($object->FromUserName, $keyword);$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 logger($log_content){if(isset($_SERVER['HTTP_BAE_ENV_APPID'])){ //BAErequire_once "BaeLog.class.php";$logger = BaeLog::getInstance();$logger ->logDebug($log_content);}else if(isset($_SERVER['HTTP_APPNAME'])){ //SAEsae_set_display_errors(false);sae_debug($log_content);sae_set_display_errors(true);}else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL$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);}}
}?>
xiaoi.php整体代码如下:
<?php//var_dump(getXiaoiInfo("asdf", "你是谁?"));
function getXiaoiInfo($openid, $content)
{//定义app$app_key="0266e*****";$app_secret="Je5VbXAh3Pg*****";//签名算法$realm = "xiaoi.com";$method = "POST";$uri = "/robot/ask.do";$nonce = "";$chars = "abcdefghijklmnopqrstuvwxyz0123456789";for ($i = 0; $i < 40; $i++) {$nonce .= $chars[ mt_rand(0, strlen($chars) - 1) ];}$HA1 = sha1($app_key.":".$realm.":".$app_secret);$HA2 = sha1($method.":".$uri);$sign = sha1($HA1.":".$nonce.":".$HA2);//接口调用$url = "http://nlp.xiaoi.com/robot/ask.do";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Auth: app_key="'.$app_key.'", nonce="'.$nonce.'", signature="'.$sign.'"'));curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, "question=".urlencode($content)."&userId=".$openid."&platform=custom&type=0");$output = curl_exec($ch);if ($output === FALSE){return "cURL Error: ". curl_error($ch);}return trim($output);
}
微信公众号最佳实践 ( 8.8)智能聊天机器人相关推荐
- 微信公众号最佳实践 ( 10.2)回复QQ表情和Emoji表情
回复QQ表情和Emoji表情 微信的的文字发送方有一个笑脸表情等表情符,单击该表情后,我们可以发送这些表情,这些表情包括QQ表情和Emoji表情(也叫符号表情) 如图示: 微信用户和微信公众号都能直接 ...
- 微信公众号最佳实践 ( 4.7)获取用户地理位置
开通了上报地理位置接口的微信公众号,在用户关注并进入微信公众号回话时,会弹框让用户确认是否允许微信公众号使用其地理位置.弹框只在关注后出现一次,用户以后可以在微信公众号详情页面进行操作. 本章代码还需 ...
- 微信公众号最佳实践 ( 4.3)语音识别
4.3.1 接取识别结果 开通语音识别功能以后,用户每次发送语音给微信公众号,微信会在推送语音消息XML数据包中添加一个Recongnition字段,该字段为语音识别出的文本内容. 注:由于客户端缓存 ...
- 微信公众号上部署自己训练的聊天机器人(腾讯云服务器+TensorFlow2.1+Django3.1)
文章目录 前言 1. 模型介绍 1.1 Encoder-Decoder框架 1.2 Attention机制 1.3 代码实现 2. 安装依赖库 3. 模型部署 4. 测试 前言 哈哈,重头戏终于来 ...
- 微信公众号最佳实践 ( 3.2) 被动回复用户消息
'公众号' 被动回复 "用户" 发送的六种类型的消息 其中图文可分为'单图文'和'多图文' 回复文本消息 回复图片消息 回复语音消息 回复视频消息 回复音乐消息 回复图文消息 请注 ...
- 微信公众号最佳实践 ( 4.4)客服接口
当用户和公众号产生特定动作的交互时(具体动作请见下方列表),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST一个JSON数据包来发送消息给普通用户 ...
- 微信公众号最佳实践 ( 9.1)会员卡
会员卡 会员卡一般是指企业发行的用于识别顾客身份的卡片,普片用于服务行业,他是公司宣传的理想载体,能够吸引新顾客,留住老顾客,增强顾客忠诚度的作用,还能实现打折,积分等功能. 页面布局 准备素材,包括 ...
- 微信公众号最佳实践 ( 7.2)交通信息查询
交通信息查询 交通信息是是属于公共信息,已经有很多大型网站提供了响应的查询和查看功能,但是这些信息的后台数据往往并不对外开放,一是因为获取成本高,二是怕添加一个新的竞争对手,但好在很多第三方网站提供了 ...
- 微信公众号最佳实践 ( 8.7)一站到底
一站到底 <一站到底>是一个益智答题类节目.趣味十足,在挑战中挖掘个性. 实现方案 首先,我们需要有一个题库,用户答题的内容均从题库中获取. 该题库SQL语句如下: -- -- 表的结构 ...
最新文章
- http协议的队首阻塞
- php python插件安装,小弟我的vim配置和插件 小型 python php IDE
- legend3---用Homestead配置后报错“No input file specified.”
- python的线性链表_Python线性表——单链表-阿里云开发者社区
- Oracle 直方图理论
- 金三银四,如何征服面试官,拿到Offer
- Python高级——property属性
- 关于计算机人工智能的知识,《计算机科学导论》人工智能基础知识
- 如何实现登录、URL和页面按钮的访问控制?
- php是硬件还是软件,计算机操作系统是管理计算机硬件和软件的什么
- 程序员的发展方向是什么?
- oppo A3怎么刷机oppo A3的刷机教程 oppo A3完美解除账号锁
- 80286微处理器和80386的优缺点
- cpu温度过高 ubuntu_Ubuntu/Debian 查看CPU温度的方法
- virsh、qemu-img基本管理操作
- 授人以鱼不如授人以渔——和女儿学一起学成语
- 新中新 金龙一卡通 TPE_StartTPE 加载授权文件失败 JAVA
- 利用JavaScript生成动态添加歌单
- 时光悄悄流逝,光阴不再使你我天真
- 交警那不了了之的办事,涉案人员逃逸至今仍没归案
热门文章
- 三国志战略版:Daniel_颜良分析
- 【评测】重组C因子法内毒素检测技术解析
- van-grid引入自定义图标无效,图标加载不出来
- 金融时间序列分析:1. 基础知识
- 2021星巴克月饼全新上市;万豪旗下源宿品牌入驻中国东南区;现代汽车承诺到2045年实现碳中和 | 美通社头条...
- 黑马 最最新 项目视频
- 抖音青少年模式?怎么这么好用啊!
- 如何使用Xcode7来调试iOS10设备
- [20170412]bbed隐藏数据记录.txt
- 【Linux_SVN忽略文件提交——已经存在仓库里面的文件夹怎么忽略提交】