分享

利用SAE搭建微信公众平台(三)

 rcylbx 2015-09-24

最近又要做一个微信公众平台项目了。
距离前一次做项目已经过去了一年的时间,在这一年的时间里面微信公众平台的变化很大啊!添加了很多功能,再使用简单的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属性,再使用

1
saecloud deploy .

命令就可以上传了,需要注意的是一定要记得在本地先安装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搭建微信公众平台(二)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多