利用SAE搭建微信公众平台(三)——WeRobot框架

最近又要做一个微信公众平台项目了。
距离前一次做项目已经过去了一年的时间,在这一年的时间里面微信公众平台的变化很大啊!添加了很多功能,再使用简单的web.py开发起来就有一些难度了(也不是难度,就是工作量问题)。果断开始寻找python版的微信框架。

于是我找到了WeRobot框架,框架的开发者仍然是一名高中生,但不妨碍这是一个很好用的框架。截止这篇文章的时候版本到了0.53,微信平台截止目前所有的功能都支持。而且这个框架甚至提供了在SAE上部署的教程。甚为方便。

直接点开该项目的sae-demo,照着其示例代码进行werobot安装,在此之前你需要git和virtualenv,这两者的安装不赘述。WeRobot SAE安装代码如下:

[code]
git clone git://github.com/whtsky/WeRoBot-SAE-demo.git
cd WeRoBot-SAE-demo
virtualenv –no-site-packages .
source bin/activate #如果是windows环境请使用Scripts\activate代替
pip install sae-python-dev
saecloud install werobot
[/code]

注意作者在这个地方的代码有误,bin/active应该为上面的bin/activate,windows环境下的代码也不相同。
如果没有什么错误的话,本地代码就应该创建好了现在去修改config.yaml文件中的name属性,再使用

[code]
saecloud deploy .
[/code]

命令就可以上传了,需要注意的是一定要记得在本地先安装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的完整代码如下:

[python]
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!’
[/python]

此时访问主页仍然出错,查看原因后发现,与文档中写的不一样,0.53版本的session是默认开启的,sae又不允许文件io,所以出错,修改办法是在创建WeRobot实例时再传入参数enable_session=False。
如果想要使用session,可以使用sae的kvdb来保存session信息,首先在sae的控制面板中开启kvdb,然后将如下代码保存为site-packages/werobot/session/kvdbstorage.py

[python]
# -*- coding: utf-8 -*-
”’
Author: Howard
Page: http://www.nilday.com
”’

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)
[/python]

在robot.py文件中修改如下:

[python]
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
[/python]

到此为止我们的微信公众平台就搭建好了,大家可以把token换成自己的token,此时直接访问主要会得到一个403错误页面这是由于微信公众平台不允许直接get方式访问导致,在微信公众平台的控制面板上设置好调用地址和token,就可以使用了。
以上提到的一些bug都已经反馈给了开发者,希望他越做越好,真是后生可畏啊!

参考文献:

https://werobot.readthedocs.org/en/latest/

https://github.com/whtsky/WeRoBot-SAE-demo

http://sae.sina.com.cn/doc/python/tools.html#saecloud

上一篇文章:利用SAE搭建微信公众平台(二)

27 评论

  1. 博主,我对我自己部署werobot到SAE过程也写了一篇博客。现在才发现你比我早几天。看了你这篇文章,发现咱两思路是一样的链接:http://1.sukai.sinaapp.com/?p=92

  2. 在robot.py里添加了sys.path.insert(1, os.path.join(root, ‘Lib/site-packages’))还有错误。请问是什么原因 ,谢谢。Traceback (most recent call last): File “/data1/www/htdocs/495/llms/1/index.wsgi”, line 2, in from robot import robot File “/data1/www/htdocs/495/llms/1/robot.py”, line 11, in robot = werobot.WeRoBot(token=’tokenhere’)AttributeError: ‘module’ object has no attribute ‘WeRoBot’

    1. 请检查werobot模块的__init__.py文件,最好在其中的except处将异常信息print出来看一下(print的内容到sae的日志中心中的debug去找),看一下具体的情况。

  3. 博主学了一点点PYTHON的基础想照着您的博客,学习一点新知识,但是完全无法入门。现在403错误页面算是终于出来了但是接下来该干嘛,还是一头雾水能接着发布一些关于微信的教程么。

  4. 按README.md在本地部署完毕后,怎么使用Git部署到GAE呢?(因为已经使用了Git而SAE又不允许混合使用Git和SVN来管理代码)

发表评论

电子邮件地址不会被公开。 必填项已用*标注