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 相关文章推荐
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
Python实现快速计算词频功能示例
Jun 25 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
基于pandas向csv添加新的行和列
May 25 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
Python获取百度热搜的完整代码
Apr 07 Python
Python中os模块的简单使用及重命名操作
Apr 17 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中for循环语句的几种变型
2007/03/16 PHP
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
javascript jq 弹出层实例
2013/08/25 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
js实现轮播图特效
2020/05/28 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
python刷投票的脚本实现代码
2014/11/08 Python
python 获取网页编码方式实现代码
2017/03/11 Python
Python编程之变量赋值操作实例分析
2017/07/24 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
简单分析python的类变量、实例变量
2019/08/23 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
详解python的变量缓存机制
2021/01/24 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
应聘医药销售自荐书范文
2014/02/08 职场文书
订货会邀请函
2015/01/31 职场文书
单位收入证明范本
2015/06/18 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript