美文网首页
Werobot开发微信公众号小记

Werobot开发微信公众号小记

作者: 腹肌少年 | 来源:发表于2018-01-10 10:10 被阅读0次

    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开发微信公众号小记

          本文链接:https://www.haomeiwen.com/subject/inmnnxtx.html