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

针对微信公众平台,图形界面操作存在的许多功能限制,在开发者中心设置回调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

# 安装futures库报错
pip install futures==3.1.1

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后,公众平台设置的自动回复、自定义菜单等功能都将失效并且停用。而个人订阅号不具备自定义菜单接口权限,因此在改用开发者模式后,可能会丢失平台上设置的自定义菜单信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容