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 相关文章推荐
最大K个数问题的Python版解法总结
Jun 16 Python
Python使用pymysql小技巧
Jun 04 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
基于python实现数组格式参数加密计算
Apr 21 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
浅谈Python基础之列表那些事儿
May 11 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
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
Vue表单实例代码
2016/09/05 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
基于vue-element组件实现音乐播放器功能
2018/05/06 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
JS实现打字游戏
2019/12/17 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
python读取Android permission文件
2013/11/01 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
django序列化serializers过程解析
2019/12/14 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
2014婚礼司仪主持词
2014/03/14 职场文书
公共场所禁烟标语
2014/06/25 职场文书
医德医风自我评价
2014/09/19 职场文书
邀请函格式范文
2015/02/02 职场文书
会计主管岗位职责
2015/04/02 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
MySQL七种JOIN类型小结
2021/10/24 MySQL