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