使用sae实现一个简单的问答式微信订阅号

上周做的东西,可能细节上已经有些记不清楚了,大致记录下吧。

1.申请一个微信订阅号,类型是个人的那种,然后名字里面记住不要有什么代购之类的敏感词,否则会要求进行更严格的认证,也就是要收钱的了。

2.高级功能里选择开发者模式(编辑模式也可以玩下,也很好玩),然后打开功能,因为是未认证的个人订阅号,所以一些高级功能是都不能用的。

3.申请一个sae帐号,需要绑定一个微博帐号,然后直接送500云豆,统计的结果就是我的应用还能继续跑2661年,可以跑到天荒地老了,所以说普通的玩下,基本上就是免费了,当然以后规则也许会变。

4.在sae上创建应用,选择类型python,应用类型是web应用,记住自己的二级域名即可,后面还会用到。二级域名由数字字母组成,后面加上.sinaapp.com就是你的域名地址了。

5.安装svn,当然sae也有提供在线模式,但是不是很方便,安装svn后就可以在本地写代码然后上传了。

OK,扯了这么多,来点实际的。。。

根目录下会有文件config.yaml,里面的内容如下:

name: (这里填你的二级域名,不要后面sinaapp那一堆)
version: 1


libraries:
- name: webpy
  version: "0.36"
- name: lxml
  version: "2.3.4"

然后是index.wsgi文件,里面的内容如下:

# coding: UTF-8
import os

import sae
import web

from weixinInterface import WeixinInterface

urls = (
'/weixin','WeixinInterface' #这里是给出目录与应用文件的对应关系,即http://(二级域名).sinaapp.com/weixin 会映射到WeixinInterface.py文件
)

app_root = os.path.dirname(__file__)
templates_root = os.path.join(app_root, 'templates') #这里添加了一个目录用来存放模版文件
render = web.template.render(templates_root)

app = web.application(urls, globals()).wsgifunc()        
application = sae.create_wsgi_app(app)


下面是weixinInterface.py里的内容:

# -*- coding: utf-8 -*-
import hashlib
import web
import lxml
import time
import os
import urllib2,json
from lxml import etree
from common import *

class WeixinInterface:

    def __init__(self):
        self.app_root = os.path.dirname(__file__)
        self.templates_root = os.path.join(self.app_root, 'templates')
        self.render = web.template.render(self.templates_root)

    def GET(self):
        #获取输入参数
        data = web.input()
        signature=data.signature
        timestamp=data.timestamp
        nonce=data.nonce
        echostr=data.echostr
        #自己的token
        token="" #这里改写你在微信公众平台里输入的token
        #字典序排序
        list=[token,timestamp,nonce]
        list.sort()
        sha1=hashlib.sha1()
        map(sha1.update,list)
        hashcode=sha1.hexdigest()
        #sha1加密算法        

        #如果是来自微信的请求,则回复echostr
        if hashcode == signature:
            return echostr
        
    def POST(self):        
        str_xml = web.data() #获得post来的数据
        xml = etree.fromstring(str_xml)#进行XML解析
        content=xml.find("Content").text#获得用户所输入的内容
        msgType=xml.find("MsgType").text
        fromUser=xml.find("FromUserName").text
        toUser=xml.find("ToUserName").text
        returnContent = getReturnContent(content)
        return self.render.reply_text(fromUser,toUser,int(time.time()), \
            returnContent)
        

注释里貌似写的很清楚了,GET方法是微信用来验证url有效性的,反正大概就是发什么回来,就给它回什么回去。common.py文件里实现了getReturnContent方法,就是按照这个模版,在获取用户的输入后,你进行判断,然后给用户回消息。至于回复些啥,就八仙过海各显神通了。

templates目录下的模版文件里的内容如下:

$def with (toUser,fromUser,createTime,content)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[$content]]></Content>
</xml>

这块CDATA的定义在微信的开发者文档里也能看到,我就不细说了。

然后这个鬼东西我也不知道该怎么添加截图,感觉写的不是很详细,有看不懂的再说吧,就这样了。。。sae还是很方便的,直接提供这种接口,很多细节就不用自己关注了,不然很麻烦。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值