美文网首页JAVA技术文章IT技术篇
itchatmp | 基于python微信公众号接口

itchatmp | 基于python微信公众号接口

作者: 简子逍 | 来源:发表于2019-06-21 14:41 被阅读32次

    针对微信公众平台,图形界面操作存在的许多功能限制,在开发者中心设置回调URL和Token,可以更加灵活地扩展各项功能。对于具备开发能力的人员,同时拥有一台可供转发消息的服务器,itchatmp可以提供强大的技术支持。

    开发前准备:

    1. Python版本:2.7,3.5
    2. 供转发的服务器
    3. 微信公众平台账号

    搭建web服务

    Python Web框架有许多,最流行的如Django,Flask,WSGI等。这里重点推荐一个开源的微信公众号接口itchatmp。它将公众号许多功能接口都整合到了代码里,开发者无需自行构造请求访问链接,简单易上手。

    1. 安装itchatmp

    pip install itchatmp
    

    注意:itchat基于tornado框架,本人在python3.5版本安装过程中,发现高版本的tornado(5.0以上)有许多兼容问题。如执行import itchatmp时,发生RuntimeError: There is no current event loop in thread 'Thread-1';在接受图片消息时,set_event_loop无法建立事件循环等。

    解决办法:安装较低版本的tornado。

    pip uninstall tornado
    pip install tornado==4.5.3
    

    2. 设置自动回复

    • 处理文本消息
    def getBasicInfo(msg):
        date = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(int(msg['CreateTime'])))   # 接收消息的时间
        user = msg['FromUserName']   # 关注用户的OpenId,同一个公众号所有关注者都是唯一的
        return date, user
    
    @itchatmp.msg_register(TEXT)
    def text_reply(msg):
        content = msg['Content']
    
        date, user = getBasicInfo(msg)
        save_path = SAVE_PATH + TEXT_PATH + user + '.txt'  # 使用OpenID来保存不同用户的消息记录
    
        if not os.path.exists(save_path):
            with open(save_path,'w',encoding='utf-8') as file:
                file.write(date + " --- " + content + "\n")
        else:
            with open(save_path,'a',encoding='utf-8') as file:
                file.write(date + " --- " + content + "\n")
    
        return "消息保存成功"  # 去掉return语句时,表示不回复内容
    

    保存结果:


    • 处理多媒体消息

    多媒体消息,包括图片,语音,视频,小视频等,这类消息的共同点是,返回参数中都带有MediaId。MediaId是消息媒体id,可以使用该参数,通过调用获取临时素材接口下载数据。

    @itchatmp.msg_register([IMAGE, VIDEO, SHORT_VIDEO, VOICE])
    def media_reply(msg):
        date, user = getBasicInfo(msg)
        pathSymbol = {
            IMAGE: IMAGE_PATH,
            VIDEO: VIDEO_PATH,
            SHORT_VIDEO: SHORT_VIDEO_PATH,
            VOICE: VOICE_PATH
        }.get(msg["MsgType"])  # 通过判断消息类型,获取媒体信息相应的保存路径
       
        r = itchatmp.messages.download(msg["MediaId"])
        filename = date + ' '+ user + os.path.splitext(r.get('FileName', 'myfile'))[1]  # 命名规则:时间 + OpenId +文件后缀名
        if 'File' in r:
            with open(SAVE_PATH + pathSymbol + filename, 'wb') as f:
                f.write(r['File'].getvalue())  # 保存数据到本地
        else:
            print(r)
    

    微信公众平台上多媒体消息最多只能保存3天,上述代码可以实时地将所有信息,按照相应的格式(jpg,mp4,amr等)永久保存在本地。

    • 其它消息

    其它消息类型,可以参考微信工作平台技术文档,里面列举了不同消息参数的格式,根据需要自定义回复内容。

    @itchatmp.msg_register(LOCATION)
    def location_reply(msg):
        lat = msg['Location_X']
        lon = msg['Location_Y']
        label = msg['Label']
    
        return str(label) + '\n' + '经度:' + lat + '\n' + '纬度:' + lon
    

    例如对收到的地理位置消息,可以自动回复该位置的名称,经纬度信息。


    3. 一个简单的例子

    import itchatmp
    
    itchatmp.update_config(itchatmp.WechatConfig(
        token='yourToken', 
        appId = 'yourAppId',
        appSecret = 'yourAppSecret'))
    
    @itchatmp.msg_register(itchatmp.content.TEXT)
    def text_reply(msg):
        return msg['Content']
    
    itchatmp.run()
    

    此处的appId,appSecret分别为开发者ID,开发者密码,可以在微信工作平台查看,见下一步。token用于验证开发者服务器,由开发者随机设置(3-32字符)。

    在服务器上运行该程序(默认开启80端口),外网访问出现以下语句时,表示服务开启成功。


    服务器配置

    1. 开发者ID(AppID),开发者密码(AppSecret),IP白名单

    公众号开发信息
    • 开发者ID可以在微信公众平台 - 开发 - 基本配置 - 公众号开发信息中查看。
    • 开发者密码是校验公众号开发者身份的密码,公众平台不会单独储存AppSecret,因此在初次设置后需要另行保存。
    • 将提供转发的服务器地址添加到IP白名单中。

    2. 配置服务器

    填写服务器配置
    • URL填写服务器地址,http协议必须使用80端口。
    • 将开启web服务代码中设置的token填到这里。
    • 点击随机生成EncodingAESKey。
    • 个人订阅号,消息加解密方式可以选择明文模式。

    在提交服务器配置信息时,会进行token验证。因此提交前确保在服务器上已经搭建好web服务,并且成功运行,否则会出现请求URL超时提示。

    关于接口权限

    针对个人未认证订阅号,可以使用的接口主要有:

    • 接收消息(所有类型消息)
    • 发送消息(仅仅支持自动回复)
    • 永久素材的管理(上传,修改,删除)
    • 其它图像、音频接口,界面操作等

    在开发者中心开启了回调URL和Token后,公众平台设置的自动回复、自定义菜单等功能都将失效并且停用。而个人订阅号不具备自定义菜单接口权限,因此在改用开发者模式后,可能会丢失平台上设置的自定义菜单信息。

    了解更多详情,关注微信公众号 —— 四元群

    相关文章

      网友评论

        本文标题:itchatmp | 基于python微信公众号接口

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