原文地址:http://hello1010.com/wechat-robot/
今天我们来看看有哪些比较好玩的聊天机器人,并且通过微信公众号搭建一个自己的聊天机器人。
QQ机器人
腾讯有一个可以聊天的QQ机器人,当时觉得特别好玩,它会不厌其烦地陪你聊天,不吃不喝。它的QQ号是:615050000。
小黄鸡
曾经非常火的人人网小黄鸡聊天机器人,陪着大学生度过了多少个空虚寂寞冷的日日夜夜。在这里可以找到开发文档:赛科机器人 。它提供了一个快速接入微信后台的功能:
假如你的微信公众号没有自己开发的功能,那么只要按照下面的“微信接口”说明,在微信公众号后台设置参数即可。
假如你的微信公众号已经有自己的功能,现在又想加入小黄鸡的功能,那么就要自己开发了。这里特别注意,msg参数需要GBK编码。
下面给出关键性代码(php):
1
2
3
4
5
6
7
8
9
10
11
12
13
14public 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; }
宏定义:
1
2
3
4define ("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方式发送请求的自定义方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24function 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格式。而小黄鸡返回的就是一个字符串。
针对它返回的数据,我们可以重新对数据进行整合。这是我写的一个方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140/* * 注意: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 . "nn"; foreach($json->list as $kv){ $t = WXResponseHelper::buildHref($kv->name,$kv->detailurl,false); $t .= "(" . $kv->info . ")"; $t .= "nn"; if(!WXResponseHelper::maxLen($tmp, $t)){ $tmp .= $t; }else{ break; } } break; //列车信息 深圳到成都的火车 case 305000: $tmp = $json->text . "nn"; foreach($json->list as $kv){ $t = $kv->trainnum . "n"; $t .= $kv->start . "(" . $kv->starttime . ")" . " → " . $kv->terminal . "(" . $kv->endtime . ")"; $t .= "nn"; if(!WXResponseHelper::maxLen($tmp, $t)){ $tmp .= $t; }else{ break; } } break; //航班 明天成都飞深圳的飞机 case 306000: $tmp = $json->text . "nn"; foreach($json->list as $kv){ $t = $kv->starttime . " - " . $kv->endtime . " " . $kv->flight . "nn"; if(!WXResponseHelper::maxLen($tmp, $t)){ $tmp .= $t; }else{ break; } } break; //酒店 深圳南山区附近的酒店 case 309000: $tmp = $json->text . "nn"; 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 . "nn"; foreach($json->list as $kv){ $t = $kv->price . " " . WXResponseHelper::buildHref($kv->name,$kv->detailurl) . "nn"; if(!WXResponseHelper::maxLen($tmp, $t)){ $tmp .= $t; }else{ break; } } break; //新闻 最新新闻 case 302000: $tmp = $json->text . "nn"; foreach($json->list as $kv){ $t = WXResponseHelper::buildHref($kv->article,$kv->icon) . "(" . $kv->source . ")" . "nn"; 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; }
宏定义:
1
2
3//图灵机器人 define("TL_ROBOT_API","http://www.tuling123.com/openapi/api?key=your_appkey&");
其中,WXResponseHelper类是一个工具类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class 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)。
1
2
3回复给微信的消息长度不能超过2048字节 define("WECHAT_MAX_RESPONSE_LEN" , 2048);
我们来看看效果吧:
还是很容易的吧!这里涉及到了一些微信公众号的后台开发,我有时间再专门写文章介绍,大家关注我的博客即可。对于如何把该聊天功整合到微信公众号,我的建议是,先走之前的逻辑,假如都没有匹配到,再把用户发来的文本丢给聊天机器人处理。
想调戏一下机器人吗?微信扫一扫下面的二维码,它还有在线记录文字和图片的功能哦,更多惊喜等待你去发现。更多介绍可以看这里。
最后
以上就是瘦瘦黄豆最近收集整理的关于给微信公众号增添聊天机器人功能的全部内容,更多相关给微信公众号增添聊天机器人功能内容请搜索靠谱客的其他文章。
发表评论 取消回复