最近又要做一个微信公众平台项目了。
距离前一次做项目已经过去了一年的时间,在这一年的时间里面微信公众平台的变化很大啊!添加了很多功能,再使用简单的web.py开发起来就有一些难度了(也不是难度,就是工作量问题)。果断开始寻找python版的微信框架。
于是我找到了WeRobot框架,框架的开发者仍然是一名高中生,但不妨碍这是一个很好用的框架。截止这篇文章的时候版本到了0.53,微信平台截止目前所有的功能都支持。而且这个框架甚至提供了在SAE上部署的教程。甚为方便。
直接点开该项目的sae-demo,照着其示例代码进行werobot安装,在此之前你需要git和virtualenv,这两者的安装不赘述。WeRobot SAE安装代码如下:
1 2 3 4 5 6 | cd WeRoBot-SAE-demo
virtualenv --no-site-packages .
source bin/activate #如果是windows环境请使用Scripts\activate代替
pip install sae-python-dev
saecloud install werobot
|
注意作者在这个地方的代码有误,bin/active应该为上面的bin/activate,windows环境下的代码也不相同。
如果没有什么错误的话,本地代码就应该创建好了现在去修改config.yaml文件中的name属性,再使用
命令就可以上传了,需要注意的是一定要记得在本地先安装svn再使用saecloud deploy,不然肯定会遇到error2,我找这个问题找了好久,读了源代码才发现,结果sae的官方文档里面就有,怪我读文档不仔细。
成功之后还是发现index.wsgi,有错误,检查多遍才发现仍然是找不到lib路径的问题,除了官方示例中robot.py中的sys.path.insert(0, os.path.join(root, 'site-packages'))之外,还需要加一句:sys.path.insert(1, os.path.join(root, 'Lib/site-packages')),robot.py的完整代码如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | import os
import sys
root = os.path.dirname(__file__)
sys.path.insert( 0 , os.path.join(root, 'site-packages' ))
sys.path.insert( 1 , os.path.join(root, 'Lib/site-packages' ))
import werobot
robot = werobot.WeRoBot(token = 'tokenhere' )
@robot .handler
def echo(message):
return 'Hello World!'
|
此时访问主页仍然出错,查看原因后发现,与文档中写的不一样,0.53版本的session是默认开启的,sae又不允许文件io,所以出错,修改办法是在创建WeRobot实例时再传入参数enable_session=False。
如果想要使用session,可以使用sae的kvdb来保存session信息,首先在sae的控制面板中开启kvdb,然后将如下代码保存为site-packages/werobot/session/kvdbstorage.py
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # -*- coding: utf-8 -*-
'''
Author: Howard
'''
from werobot.session import SessionStorage
from werobot.utils import json_loads, json_dumps
import sae.kvdb
class KVDBStorage(SessionStorage):
"""
SAE KVDB Storage
需要开启SAE的KVDB服务
"""
def __init__( self ):
self .kv = sae.kvdb.KVClient()
def get( self , id ):
stringvalue = self .kv.get( id )
if stringvalue = = None :
return {}
value = json_loads(stringvalue)
return value
def set ( self , id , value):
session = json_dumps(value)
self .kv. set ( id ,session)
def delete( self , id ):
self .kv.delete( id )
|
在robot.py文件中修改如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | import os
import sys
root = os.path.dirname(__file__)
sys.path.insert( 0 , os.path.join(root, 'site-packages' ))
sys.path.insert( 1 , os.path.join(root, 'Lib/site-packages' ))
import werobot
from werobot.session.kvdbstorage import KVDBStorage
session_storage = KVDBStorage()
robot = werobot.WeRoBot(token = 'tokenhere' ,enable_session = True ,session_storage = session_storage)
@robot .handler
def hello(message, session):
count = session.get( "count" , 0 ) + 1
session[ "count" ] = count
return "Hello! You have sent %s messages to me" % count
|
到此为止我们的微信公众平台就搭建好了,大家可以把token换成自己的token,此时直接访问主要会得到一个403错误页面这是由于微信公众平台不允许直接get方式访问导致,在微信公众平台的控制面板上设置好调用地址和token,就可以使用了。
以上提到的一些bug都已经反馈给了开发者,希望他越做越好,真是后生可畏啊!
参考文献:
https://werobot./en/latest/
https://github.com/whtsky/WeRoBot-SAE-demo
http://sae.sina.com.cn/doc/python/tools.html#saecloud
上一篇文章:利用SAE搭建微信公众平台(二)
|