Python开发之快速搭建自动回复微信公众号功能


Posted in Python onApril 22, 2016

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

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

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

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

Python开发之快速搭建自动回复微信公众号功能

自动回复效果:

Python开发之快速搭建自动回复微信公众号功能

安装Python库

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

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 :

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 代码:

import tornado.web
import tornado.httpserver
from tornado.options import define, options
settings = {
'static_path': os.path.join(os.path.dirname(__file__), 'static'),
'template_path': os.path.join(os.path.dirname(__file__), 'view'),
'cookie_secret': 'e440769943b4e8442f09de341f3fea28462d2341f483a0ed9a3d5d3859f==78d',
'login_url': '/',
'session_secret': "3cdcb1f07693b6e75ab50b466a40b9977db123440c28307f428b25e2231f1bcc",
'session_timeout': 3600,
'port': 5601,
'wx_token': 'weixin',
}
web_handlers = [
(r'/wx', wx.WX),
]
define("port", default=settings['port'], help="run on the given port", type=int)
if __name__ == '__main__':
app = tornado.web.Application(web_handlers, **settings)
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

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

接入图灵机器人

要接入图灵机器人,首先需要在官网申请API Key。

申请到之后可以利用以下代码包装一个自动回复接口:

# -*- coding: utf-8 -*-
import json
import requests
import traceback
class TulingAutoReply:
def __init__(self, tuling_key, tuling_url):
self.key = tuling_key
self.url = tuling_url
def reply(self, unicode_str):
body = {'key': self.key, 'info': unicode_str.encode('utf-8')}
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>', '\n')
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部分代码:

# -*- 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

关于Python开发之快速搭建自动回复微信公众号功能就给大家介绍这么多,希望对大家有所帮助!

Python 相关文章推荐
一波神奇的Python语句、函数与方法的使用技巧总结
Dec 08 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python 列表理解及使用方法
Oct 27 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
django中瀑布流写法实例代码
Oct 14 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 Python
Django小白教程之Django用户注册与登录
Apr 22 #Python
python中PIL安装简单教程
Apr 21 #Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 #Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 #Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 #Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 #Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
Apr 20 #Python
You might like
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
python实现socket客户端和服务端简单示例
2014/02/24 Python
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Python装饰器使用示例及实际应用例子
2015/03/06 Python
Python实现将xml导入至excel
2015/11/20 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
详解python itertools功能
2020/02/07 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
历史系自荐信范文
2013/12/24 职场文书
教师演讲稿范文
2014/01/08 职场文书
上班早退检讨书
2014/01/09 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
搞笑爱情保证书
2014/04/29 职场文书
授权委托书格式范文
2014/08/02 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
入党群众意见范文
2015/06/02 职场文书