本文是在原博客kazenoyu.me上迁移过来

最近参加了微信的创新班,在这个班上,我需要做一些编程作业。而其中一个作业就是使用微信公众平台创建一个帐号,这个帐号的内容是自己定制的。我选择了广州图书馆自助平台作为微信公众号的内容,它含有的功能非常简单,能够简单的查看一个帐号的借阅信息、查询某本图书的信息以及提供续借的功能。我使用的技术相当简单,使用python的bottle框架作为httpserver,requests库解决http请求处理的问题,例如使用cookie记录账户信息。

刚开始的时候是打算使用django的,因为最近有使用django的经验。后来觉得使用django有点杀鸡用牛刀的感觉,于是便选择了bottle框架。 研究了好半天,总于能在服务器上跑bottle的http server。最难解决的问题是如何部署bottle。由于我跟ddmbr、dreamingo的vps上有各种各样的服务,其中包括一个很复杂的apache server。由于不懂这些东西,在配置问题上浪费了很多时间。当时在网上搜了很多东西,尝试过bottle+nginx+uwsgi的方法,但是还是没有部署好。最后的解决方法是把apache的index.html删除掉,因为时间问题只能这样粗暴的解决了。

Bottle

bottle的安装相当的简单,运行以下命令即可

pip install bottle

微信开放平台

接下来我们来研究微信公众平台的api,这个api还真是简单到极点啊,真心觉得写得挺好的。
微信开放平台的api文档里面说,当用户访问你的公众平台帐号时,腾讯会发送GET请求到你的公众平台处理服务器,里面有signature等参数,而我们需要相应的是一个xml。

微信开放平台GET参数: * signature: 微信加密签名 * timestamp: 时间戳 * nonce: 随机数 * echostr: 随机字符串

由于这个开放平台的验证方式实在过于简单,在这里我不对其使用作详细说明。我把自己的代码贴一下出来,方便以后进行查询。

from bottle import route,run,request
import bottle
from hashlib import sha1
from time import time
import xml.etree.ElementTree as ET

#对所有请求/路径的GET方法,验证加密方法
@route('/',method='GET')
def verify():
    try:
        print request.GET
        signature = request.GET.get('signature')
        timestamp = request.GET.get('timestamp')
        nonce = request.GET.get('nonce')
        echostr = request.GET.get('echostr')
        
        token ='gzlib'#你的开发者token
        L = [token,timestamp,nonce]
        L.sort()
        temp = ''.join(L)
        hashstr = sha1(temp).hexdigest()
        if hashstr == signature:
        return echostr
    except Exception:
        return 'Verify Error'

#解析xml树,我这里用的是elementtree,有更好的方法请告知
def parse():
    root = ET.fromstring(request.body.read())
    message = {}
    for child in root:
        message[child.tag] = child.text
    return message

#用户发送的信息,原封不动地返回
@route('/',method='POST')
def handleUserInput():
    message = parse()
    s =  """
    <xml>
        <from>%s</from>
        <to>%s</to>
        <timestamp>%s</timestamp>
        <content>%s</content>
    </xml>
    """ %(message['FromUserName'], message['ToUserName'],
          str(int(time())), message['Content'])
    return s

刚开始的时候不清楚ssh的机制,直接使用命令:

python index.wsgi &

结果出大事了,因为这样做的话是使用当前ssh链接的bash运行这个脚本的。当ssh一断开python就会自动挂掉,后来折腾两个小时在想怎么通过uwsgi去用这个脚本,结果还是配置不成功。最后找到的解决方案linux的简单命令nohup。

nohup python index.wsgi &

大功告成!!时间紧迫也没时间再写多点了。赶紧去把连接数据库处理逻辑部分的方法写了。
微信的创新班作业真多啊,连续逃两个星期课去写这些作业了。