banner
大数据平台>大数据技术与应用>Python自动回复微信公众号

Python快速搭建自动回复微信公众号

作者: afenxi来源: afenxi时间:2017-06-14 16:27:46

在之前的一篇文章 Python利用 AIML 和 Tornado 搭建聊天机器人微信订阅号 中用 aiml 实现了一个简单的英文聊天机器人订阅号。但是只能处理英文消息,现在用 图灵机器人 来实现一个中文的聊天机器人订阅号。

这里主要介绍如何利用 Python 的 Tornado Web框架以及wechat-python-sdk 微信公众平台 Python 开发包来快速搭建微信公众号。

完整的公众号代码 GitHub 地址:green ,由于目前此公众号有一些功能正在开发中,此完整代码会与下文所描述的代码有不一致的地方,但是自动回复的功能会一直保留。

本文搭建的微信公众号为 Ms_haoqi,可以扫码关注后测试效果

Python快速搭建自动回复微信公众号-数据分析网

自动回复效果: Python快速搭建自动回复微信公众号-数据分析网

安装Python库

通过 pip 安装 wechat-python-sdk , Requests 以及 Tornado

1 2 3 pip install tornado pip install wechat-sdk pip install requests

订阅号申请

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

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

服务器接入

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

本订阅号的配置为: Python快速搭建自动回复微信公众号-数据分析网

配置里的URL为服务器提供订阅号后台的url路径,本文用到的源代码配置的是 http://server_ip/wx 其中server_ip 是运行源代码的主机的公网ip地址。

Token 可以设置为任意字符串。

EncodingAESKey 可以选择随机生成。

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

接受并处理微信服务器发送的接入请求的关键代码为Tornado的一个Handle, wx.py :

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 import tornado.escape import tornado.web from wechat_sdk import WechatConf conf = WechatConf(     token=your_token, # 你的公众号Token     appid=your_appid, # 你的公众号的AppID     appsecret=your_appsecret, # 你的公众号的AppSecret     encrypt_mode=safe,  # 可选项:normal/compatible/safe,分别对应于 明文/兼容/安全 模式     encoding_aes_key=your_encoding_aes_key  # 如果传入此值则必须保证同时传入 token, appid ) from wechat_sdk import WechatBasic wechat = WechatBasic(conf=conf) 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 signature != default and timestamp != default and nonce != default and echostr != default                 and wechat.check_signature(signature, timestamp, nonce):             self.write(echostr)         else:             self.write(Not Open)

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

启动后台的 main.py 代码:

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 import tornado.web import tornado.httpserver from tornado.options import define, options settings =         r = requests.post(self.url, data=body)         r.encoding = utf-8         resp = r.text         if resp is None or len(resp) == 0:             return None         try:             js = json.loads(resp)             if js[code] == 100000:                 return js[text].replace(<br>, )             elif js[code] == 200000:                 return js[url]             else:                 return None         except Exception:             traceback.print_exc()             return None

 

编写公众号自动回复代码

利用 wechat-python-sdk 微信公众平台 Python 开发包可以很容易地处理公众号的所有消息。

如下为处理来自微信官方服务器的微信公众号消息的 Tornado Handler对象(此代码会获取公众号收到的用户消息并调用刚刚包装的图灵机器人API自动回复) wx.py部分代码:

Python 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 # -*- coding: utf-8 -*- import tornado.escape import tornado.web auto_reply = TulingAutoReply(key, url) # key和url填入自己申请到的图灵key以及图灵请求url class WX(tornado.web.RequestHandler):     def wx_proc_msg(self, body):         try:             wechat.parse_data(body)         except ParseError:             print Invalid Body Text             return         if isinstance(wechat.message, TextMessage): # 消息为文本消息             content = wechat.message.content             reply = auto_reply.reply(content)             if reply is not None:                 return wechat.response_text(content=reply)             else:                 return wechat.response_text(content=u"不知道你说的什么")         return wechat.response_text(content=u知道了)     def post(self):         signature = self.get_argument(signature, default)         timestamp = self.get_argument(timestamp, default)         nonce = self.get_argument(nonce, default)         if signature != default and timestamp != default and nonce != default                 and wechat.check_signature(signature, timestamp, nonce):             body = self.request.body.decode(utf-8)             try:                 result = self.wx_proc_msg(body)                 if result is not None:                     self.write(result)             except IOError, e:                 return

来源:http://blog.csdn.net/tobacco5648/article/details/51190039

banner
看过还想看
可能还想看
最新文章
Yonghong Z-Suite一站式大数据分析平台 —— 以卓越的数据技术为客户创造价值,实现客户成功。