SAE 了解数据格式
到了这一步,在微信上关注那个测试账号,发送的信息已经会到我们的 SAE 的 app 服务上了。
微信过来的信息都是 XML 格式的,具体地可以参考文档:
http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF
虽然文档上有具体的数据例子,但是,一般还是自己亲眼看到过来的数据,心理上才会踏实一些吧,所以,我们在代码上添加一些逻辑,使用 storage 服务把请求过来的数据保存下来。SAE 环境上标准的输出不太好用,所以开发时把 storage 当成记日志的地方就好了,还有现成的 Web 工具可以直接查看呢。
先去把应用的 storage 服务开启,并创建一个 Bucket,Bucket 我这里取的名字是 log
,为了方便查看,把权限改成 public 。
然后修改 index.wsgi
代码:
# -*- coding: utf-8 -*- import re import time from sae.storage import Bucket def application(environ, start_response): if environ.get('REQUEST_METHOD', 'GET') == 'GET': q = environ.get('QUERY_STRING') m = re.findall('echostr=(.*)', q)[0] s = m.split('&', 1)[0] start_response('200 ok', [('content-type', 'text/plain')]) return [s] length = environ.get('CONTENT_LENGTH', 0) length = int(length) body = environ['wsgi.input'].read(length) bucket = Bucket('log') bucket.put_object('%s.txt' % int(time.time()), body) start_response('200 ok', [('content-type', 'text/plain')]) return ['']
用户的数据都是通过 POST 方法过来的,所以,对于 GET 方法,我们还是原来的逻辑,直接返回 echostr
的数据即可。
wsgi 接口上,获取 POST 数据的简单方法,就是先拿到 CONTENT_LENGTH
头,它标识了 HTTP 请求的 body 部分的长度。然后从 environ['wsgi.input']
这个 file like 对象中读取指定长度的数据即可。
上面代码中,body
就是一个 XML 形式的数据了,我们目前也不做任何处理,直接以时间戳为名,存到 storage 中去。
提交代码,然后在微信上向这个测试账号发一些不同类型的信息吧,文字,图像,语音。
文字内容:
<xml><ToUserName><![CDATA[gh_b47caeadeeb7]]></ToUserName> <FromUserName><![CDATA[ov_QzuF0iskLIXqu0r71qOLmZV6B]]></FromUserName> <CreateTime>1407299911</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[文本内容]]></Content> <MsgId>6044307093609310161</MsgId> </xml>
图像内容:
<xml><ToUserName><![CDATA[gh_b47caeadeeb7]]></ToUserName> <FromUserName><![CDATA[ov_QzuF0iskLIXqu0r71qOLmZV6B]]></FromUserName> <CreateTime>1407300008</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/EiaMylXxR8B.../0]]></PicUrl> <MsgId>6044307510221137887</MsgId> <MediaId><![CDATA[HFQ8FFcieYaRJaNJZecI602qXXU16pqDz3SGY44PGDWbe_mqQBPiQbD_62_N6UDu]]></MediaId> </xml>
直接访问 PicUrl
都可以看到图片的。
语音内容:
<xml><ToUserName><![CDATA[gh_b47caeadeeb7]]></ToUserName> <FromUserName><![CDATA[ov_QzuF0iskLIXqu0r71qOLmZV6B]]></FromUserName> <CreateTime>1407300099</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[qYVLd_UHsrXw5xPiu5ZMNFtIhxpjVojHICbuCvXLPWnarPF8hvY0Ft-GaF2pfUVo]]></MediaId> <Format><![CDATA[amr]]></Format> <MsgId>6044307901063161835</MsgId> <Recognition><![CDATA[]]></Recognition> </xml>
现在也不用去管这堆 XML 的解析问题,了解一下这些数据就可以了。
更多建议: