Werobot开发微信公众号小记

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的方法随机命名。

你可能感兴趣的:(Werobot开发微信公众号小记)