Python利用AIML和Tornado搭建聊天机器人微信订阅号

AIML ,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明的。

它的雏形是一个名为”A.L.I.C.E.” (“Artificial Linguistic Internet Computer Entity”)的高度扩展的Eliza机器人。ALICE总共赢得3次每年度的Loebner奖,并且在2004年获得了Chatterbox Challenge的冠军。由于A.L.I.C.E. 的AIML设置是在GNU GPL协议下发布的,所以已经有许多基于该程序和AIML库的“克隆ALICE”出现。目前AIML已经有了Java,Ruby,Python, C ,C#,Pascal等语言的版本。

Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像 web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。

微信公众平台 是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发。

Python可以很方便地利用Tornado框架以及AIML搭建一个聊天机器人微信公众号,本文简单介绍下如何用Python编写简单的聊天机器人。不过由于目前AIML上缺少高质量的中文语料库而不支持中文聊天。因此本文搭建的为英文聊天机器人。

此搭建方式需要一台具有固定公网ip地址的主机一台。也可以利用现有的云主机或者云平台,例如 sina app engine 。

此微信订阅号的完整源代码可以通过此链接下载:聊天机器人订阅号源代码。

1 实现效果

搭建的微信订阅号可以直接回复用户发送的英文消息与用户聊天。

我自己搭建了一个订阅号CuriousGuys,可以添加此订阅号后直接发送英文消息。
要添加CuriousGuys可以直接扫码:

效果截图:

2 安装相关Python库

需要用到Tornado以及aiml库。

Linux下安装Tornado可以直接用以下脚本:

pip install tornado

其它操作系统下安装Tornado可以参考Tornado官方网站。

Linux下安装aiml也可以直接pip安装:

pip install aiml

其它操作系统下的安装请参考AIML官方网站。

3 获取alice资源

Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,将此目录复制到工作区。
或者在Google code上下载alice brain: aiml-en-us-foundation-alice.v1-9.zip

4 订阅号申请

要搭建订阅号,需要在微信官网进行注册,注册网址:微信公众平台。

目前个人用户可以免费申请微信订阅号,虽然很多权限申请不到,但是基本的消息回复是没有问题的。

5 服务器接入

具体的接入步骤可以参考官网上的接入指南。

本订阅号的配置为:

配置里的URL为服务器提供订阅号后台的url路径,本文用到的源代码配置的是 http://server_ip/wx 其中 server_ip 是运行源代码的主机的公网ip地址。这个可以通过修改源代码里的config.py来配置。

Token 可以设置为任意字符串,不过要将源代码config.py里的settings[‘wx_token’]改为设置的字符串。

EncodingAESKey 可以选择随机生成。

消息加密方式可以设置为比较简单的明文模式。

接受并处理微信服务器发送的接入请求的关键代码为Tornado的一个Handle(在源代码里的handle/wx.py中):

class WX(tornado.web.RequestHandler):def get(self):signature = self.get_argument('signature', 'default')timestamp = self.get_argument('timestamp', 'default')nonce = self.get_argument('nonce', 'default')echostr = self.get_argument('echostr', 'default')if config.settings['wx_test'] or (signature != 'default' and timestamp != 'default' and nonce != 'default' and echostr != 'default' and check_wx_request(signature, timestamp, nonce)):self.write(echostr)else:self.write('Not Open')

此代码的作用就是验证消息是来自微信官方服务器后直接返回echostr。

配置好程序源代码后运行,确认运行无误后再点击 提交 ,如果程序运行没问题,会显示接入成功。

6 程序编写

关键部分为利用aiml回复用户发送的消息。

aiml载入语料库的代码为(在config.py中):

import aiml
cur_dir = os.getcwd()
print 'cur_dir:', cur_dir
os.chdir('./res/alice')
alice = aiml.Kernel()
alice.learn("startup.xml")
alice.respond('LOAD ALICE')
os.chdir(cur_dir)
print 'cur_dir:', os.getcwd()

服务器回复用户消息的关键代码为(在handle/wx.py中):

# -*- coding: utf-8 -*-
import tornado.escape
import tornado.webfrom BaseHTTPServer import HTTPServer
import base64
import sys
import json
import timeimport config
import time
import hashlib
import urllib
import os
import randomfrom util.xml2json import *# 处理xml格式的用户消息
def wx_proc_msg(msg_body):try:jmsg = xml2json(msg_body)msgjson = json.loads(jmsg)msg = msgjson['xml']MsgType = msg['MsgType']main_content = {}main_content['MsgType'] = msg['MsgType']main_content['CreateTime'] = msg['CreateTime']main_content['ToUserName'] = msg['FromUserName']main_content['FromUserName'] = msg['ToUserName']if MsgType == 'text':req = msg['Content']respond = config.alice.respond(req)if respond == None or len(respond) < 1:respond = '''Sorry I can't understand you'''main_content['Content'] = respondresult = {}result['xml'] = main_content.copy()result = json2xml(result)return resultelif MsgType == 'image':main_content['MsgType'] = 'text'main_content['Content'] = '''Sorry I can't read picture.'''result = {}result['xml'] = main_contentreturn json2xml(result)elif MsgType == 'voice':passelif MsgType == 'video':passelif MsgType == 'shortvideo':passelif MsgType == 'location':passelif MsgType == 'link':passelse:passexcept Exception, e:print 'Error when process this message:', msg_bodyprint ereturn ''# 验证消息是否来自微信官方服务器
def check_wx_request(signature, timestamp, nonce):token = config.settings['wx_token']arr = [token, timestamp, nonce]arr.sort()sh = hashlib.sha1(arr[0] + arr[1] + arr[2]).hexdigest()if sh == signature:return Trueelse:return False# Tornado的Handle,用于接收并处理用户消息
class WX(tornado.web.RequestHandler):def post(self):signature = self.get_argument('signature', 'default')timestamp = self.get_argument('timestamp', 'default')nonce = self.get_argument('nonce', 'default')if config.settings['wx_test'] or (signature != 'default' and timestamp != 'default' and nonce != 'default' and check_wx_request(signature, timestamp, nonce)):body = self.request.bodytry:self.write(wx_proc_msg(body))except IOError, e:return

Python搭建聊天机器人微信订阅号相关推荐

  1. Python搭建聊天机器人

    Python用AIML搭建聊天机器人 AIML,全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理的XML语言,是由R ...

  2. python制作聊天机器人原理_用 Python 来做一个聊天机器人吧!(一)

    在我的一个回答里,我提到了用 Python 搭建聊天机器人.从今天开始,我就带着大家从0开始搭建一个聊天机器人. (顺便说一句,我喜欢把链接像上面这样加在文字里,如果找不到文中所说的资源,可以看看周围 ...

  3. 不花一分钱快速搭建自己的微信公众号机器人

    ▌前言 前些天闲来无事想弄个微信公众号机器人,因为可以用机器人做好多事情,比如可以让它变成一个智能聊天机器人,也可以让它爬取并推送arxiv上自己想要的论文,还可以让它绘制并推送有关肺炎疫情的曲线图等 ...

  4. 搭建微信订阅号后台服务

    1. 准备域名和服务器 微信公众平台需要配置服务器地址 URL 访问,在实验开始之前,我们要准备域名. 购买服务器(腾讯云) 域名注册 域名解析 域名设置解析后需要过一段时间才会生效,通过 ping ...

  5. 微信订阅号python后台

    每天户外运动,想有个能自动查询天气的方式,然而单位地方比较偏,周边没有气象部门站点,最近的有天气预报的地方也是三十多公里外的城区了.那就DIY一个呗. 某宝上找了找有各种模块,最近又学习了python ...

  6. python微信公众号翻译功能_自学Python笔记:给微信公众号搭建“成绩查询”功能...

    原标题:自学Python笔记:给微信公众号搭建"成绩查询"功能 期末考试 临近年末,全国各地都在上演一场大戏<期末考试>,考完试无论什么样的结果总想尽快看到自己一个学期 ...

  7. python开源聊天机器人ChatterBot——聊天机器人搭建、流程分析、源码分析

    开源聊天机器人ChatterBot 3.1  ChatterBot简介 ChatterBot是一个Python库,可以轻松生成对用户输入的自动响应.ChatterBot使用一系列机器学习算法来产生不同 ...

  8. python对话机器人框架_长篇文讲解:使用Python AIML搭建聊天机器人的方法示例(收藏)...

    本文内容主要介绍了使用Python AIML搭建聊天机器人的方法示例,我觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随我过来看看吧 AIML全名为Artificial Intelligenc ...

  9. Python AIML搭建聊天机器人(附遇到的问题及解决)

    Python AIML搭建聊天机器人(附遇到的问题及解决) AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创建自然语言软件代理 ...

  10. 微信程序开发系列教程(二)微信订阅号+人工智能问答服务

    我的前一篇文章**微信程序开发系列教程(一)**开发环境搭建 已经介绍了微信服务器的开发环境搭建.本文作为开发系列的第二篇文章,介绍如何给您的微信订阅号开发一个最简单的问答服务,非常好玩. 这个系列的 ...

最新文章

  1. matlab立方体投影,那些投影到三维的高维立方体,后来都怎么样了?(浅度好文)...
  2. 卧槽!又一 SQL 神器面世!!
  3. RxSwift学习--核心逻辑再探
  4. 12.10课堂学习----实例化、构造方法案例
  5. Spring Enable* 注解
  6. AD软件之模块化原理图
  7. WordPress调用自带jquery的方法 ,使 $ 生效
  8. Leetcod每日一题:151.reverse-words-in-a-string(翻转字符串里的单词)
  9. QItemSelectionModel——视图选择
  10. GitHub使用(1):从GitHub建立项目分支并克隆到本地
  11. J2EE项目风险(翻译)
  12. Visual Graph图形控件的高级应用
  13. 日语开发java自我介绍,优秀日语自我介绍范文
  14. android 智能手机usb驱动程序,华为手机usb驱动下载
  15. macbook 终端命令怎么使用_mac怎么打开终端?mac打开命令提示符的方法
  16. 连接计算机硬盘usb,使用移动硬盘时电脑显示:“如果您将此USB设备连接到高速USB2.0端口,可以提升其性能”...
  17. elasticsearch操作索引库、RestClient操作索引库2
  18. android 阿里hotfix,Android 热修复方案--阿里百川HotFix
  19. 小米盒子2刷android tv,【二次搬运】小米盒子3S刷Android TV教程
  20. APP 跳转微信小程序和回调

热门文章

  1. 信安软考 第十四章 恶意代码防范技术原理
  2. 【原】豆瓣电台桌面版插件开发——搜索插件
  3. Lodash兼容IE6~IE8
  4. windows xp 美化大师之系统主题
  5. 金蝶系统提示服务器不是有效的,金蝶服务器不是有效的,请重新设置问题
  6. linux加载dl580网卡驱动,HP DL580 G7 服务器在LINUX5 下的集成网卡怎么安装?_电脑_天涯问答_天涯社区...
  7. linux安装Elasticsearch全文搜索引擎
  8. BlackBerry 7290如何传自定义图片
  9. 信道估计的理解(转载借鉴)
  10. 使用asio搭建商用服务器