Werobot开发微信公众号小记

Werobot是基于python2集成的微信公众号后台开发框架。集成程度比较高,使用起来无脑方便,适合新手或不经常与微信公众号打交道的选手,当然很多大神也在用。
由于领导上的需要,我接触了这门手艺,主要想实现以下几个简单的功能:1、小黄鸡 2、查询油价 3、输入关键字返回图片。为了简便易行,使用新浪sae挂载。
一、安装 【Werobot开发微信公众号小记】参考这篇帖子

git clone git://github.com/whtsky/WeRoBot-SAE-demo.git cd WeRoBot-SAE-demo virtualenv -p python2.7 --no-site-packages . source bin/activate pip install sae-python-dev saecloud install werobot

其中在第三行遇到错误,因为我先装的python3,默认环境是3,所以改为:
virtualenv -p C:/python27/python.exe --no-site-packages .

第四行遇到错误,据查证,此处应该是别的操作系统的用法,windows应改为:
source Scripts/activate

二、第三方库的使用 第三方的库需要安装在单独的名为Vendor的文件夹下,在根目录下用以下方式安装:
pip2 install --target=vendor package_name

不要安装lxml。有一些库在sae的预装模块中,如果另行安装在vendor中会冲突报错。具体参考这篇帮助文档。在config.yaml中完成以下设置。
name: yourappname #你的项目名称 worker: wsgi version: 1libraries: - name: lxml version: "2.3.4"

三、调试 首先要保证你的代码本身没有问题。从sae代码管理中的链接点进去,如果出现问题则会返回错误信息,按照错误信息提示改正代码,直到出现提示:这是一个 WeRoBot 应用.....
有的时候代码没有问题,上一步ok,但微信端返回平台发生故障或者不返回信息。我用这样的办法:
@robot.text def a(message): try: 代码 return #你想要的结果 except Exception as e: return traceback.format_exc()

这样在微信端可以接收到错误信息,根据信息有的放矢地改正代码。
四、其他两个坑 1、可能会出现ssl证书验证的错误,打开vendor/werobot/client.py,修改request函数
def request(self, method, url, **kwargs): if "params" not in kwargs: kwargs["params"] = {"access_token": self.token} if isinstance(kwargs.get("data", ""), dict): body = _json.dumps(kwargs["data"], ensure_ascii=False) body = body.encode('utf8') kwargs["data"] = bodyr = requests.request( method=method, url=url, verify=False,#在这里添加这一句,关闭证书验证 **kwargs) r.raise_for_status() r.encoding = "utf-8" json = r.json() if check_error(json): return json

2、python 怎么将图片url上传到微信服务器? upload_media函数必须使用file-object,如果直接使用upload_media上传图片的byte字段,会出现type不符的错误。
参考知乎这个问题,打开vendor/werobot/client.py,修改upload_media函数
def upload_media(self, media_name,media_type, media_file):#这里添加media_name变量名 """ 上传临时多媒体文件。:param media_type: 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) :param media_file: 要上传的文件,一个 File-object :return: 返回的 JSON 数据包 """ return self.post( url="https://api.weixin.qq.com/cgi-bin/media/upload", params={ "access_token": self.token, "type": media_type }, files={ 'media': ( media_name,media_file)#这里添加media_name参数 } )

为了输入关键字返回图片,我是采用先上传到微信服务器再返回的方式,如果用以上方式上传时media_name相同,会报错,我采用uuid的方法随机命名。

    推荐阅读