python开智书

基于bottle和SAE的微信公众号后台搭建

功能

微信上发送一条消息给自己的公众号后台,后台返回一条消息给用户。

步骤

1. 我有了一个微信公众号后台,能推送图文消息给用户。如何完成自定义响应用户消息?

微信公众平台开发接口介绍 http://mp.weixin.qq.com/wiki/home/index.html

微信公众号的后台将用户在公众号内的留言转发到某个指定的URI。 指定的URI能完成接收微信的请求,返回消息。

如何在一个URI上提供消息应答功能? 部署在SAE上的一个python应用简单几行代码就能提供web服务

sae python应用文档 http://sae.sina.com.cn/doc/python/index.html

2. 如果选用bottle这样的一个web框架,简单代码就可以完成一个请求应答的过程。

from bottle import Bottle, run

import sae

app = Bottle()

@app.route('/')
def hello():
    return "Hello, world! - Bottle"

application = sae.create_wsgi_app(app)

3. 理解基本流程之后,选择合适的框架来复用,支持微信消息回复的流程, 先参考网上的教程,调通基本的请求应答,详细可见github的提交日志。

在github上选择合适的框架 从自己写应答代码构造返回xml等。 到利用wechat-sdk 到最后选用werobot框架

涉及到的模块

  • 创建一个公共账号,公众号用微信默认的配置能收发消息
  • 创建SAE上的一个python应用,能够处理公众号后台的HTTP GET验证消息和POST消息并返回给用户
  • saecloud:基于github管理的代码,能自如的本地测试和上传SAE测试

参考

搭建过程主要参考了大妈的42分钟乱入SAE手册 http://chaos2.qiniudn.com/sae/build/html/

通读SAE官方文档python部分 http://sae.sina.com.cn/doc/python/index.html

搭建过程不使用官方文档提到的svn管理代码。 使用github管理代码,saecloud上传代码。

遇到的坑

微信公众号

首先申请一个微信公众号,普通的订阅号做测试足够了。 在服务器配置选项中,有一个token设置,记住这个字符串后续在验证GET消息的时候需要使用。 如果你的代码是拷贝的网上的代码,也记得修改这个token。 另外GET请求的签名校验不是必须,也可以直接返回echostr.

公众号后台第三方库的使用

现在有很多开源的微信后台管理框架,我比较了下,这两个比较靠谱: 这个主要是提供了各种微信接口操作的简单封装,使用的时候需要自己手动写一些赋值和返回接口的代码,可以比较方便的嵌入自己的代码。 https://github.com/doraemonext/wechat-python-sdk 这个功能更完全一些: https://github.com/whtsky/WeRoBot/ 我选择的比较灵活的第一种。

第三方库的使用 github库目录是:niubility SAE应用目录是:freesz 我安装的wechat_sdk niubility/freesz/site-packages/wechat_sdk saecloud会把site-packages中间的第三方库上传至sae。

返回一个POST消息的时候,需要填写fromuser和touser 很多教程会提示你,返回消息要交换这两个值,你才能收到请求. wechat_sdk内部帮你做了交换,不需要你手工填写了,否则会出现收不到的问题。

SAE

按照sae的官方文档创建好一个python应用。 如果你是初次使用SAE,尽快通过开发者认证。如果没有通过认证,你的HTTP GET请求会附加一个类似“请通过实名认证”之类的消息。这个附加选项会让你在用作微信后台签名认证的时候无法成功。

python应用中自带了很多框架,这里选用了最精简易懂的bottle框架。 当然,你可以把自己版本的bottle.py上传,这样可以本地与sae版本一致。

saecloud安装使用

查看其setup.py,需要安装这些插件 'Werkzeug', 'pip', 'PyYAML', 'argparse',

    # XXX: The latest grizzled-python package is broken
    'grizzled-python==1.0.1',
    'sqlcmd',
    'prettytable',

有很多无法pip自动安装,需要手动下载以后安装, 'grizzled-python==1.0.1' 这个的版本还必须是对应的版本,新版本是不行的。

一个saecloud的bug

在本地运行OK的代码上传是SAE以后发现报错,无法导入requests.

用saecloud安装: saecloud install requests saecloud提示安装成功,但是site-packages下依然没有 niubility/freesz/site-packages/requests 后面手动拷贝至该目录,上传解决。

SAE 调试

任性的print,可以在SAE的日志debug中查看

使用curl发送GET和POST请求测试 curl -V POST curl freesz.sinaapp.com/?echostr=test

参考链接: http://chaos2.qiniudn.com/sae/build/html/