分享

用 Python 开发微信群聊机器人

 LibraryPKU 2018-06-30

用 Python 的 wxBot 框架+图灵机器人实现。 
机器人会回复来自联系人的消息,以及所有群里 @此账号的消息。 
详细实现方法参考: http://blog.csdn.net/tobacco5648/article/details/50802922 

wxBot: https://github.com/liuwons/wxBot 
图灵机器人: http://www./ 

实现的效果: 

wxBot   

wxBot 是用Python包装Web微信协议实现的微信机器人框架。

目前的消息支持情况:

  •  群消息

    •  文本

    •  图片

    •  地理位置

    •  个人名片

    •  语音

    •  动画

    •  语音电话

    •  红包

  •  联系人消息

    •  文本

    •  图片

    •  地理位置

    •  个人名片

    •  语音

    •  小视频

    •  动画

    •  视频电话

    •  红包

    •  转账

  •  消息发送

    •  文本

    •  图片

    •  文件

Web微信协议参考资料:

挖掘微信Web版通信的全过程

微信协议简单调研笔记

qwx: WeChat Qt frontend 微信Qt前端

master-dev 分支为开发版本,用于测试新特性,欢迎使用后提出建议!


wxBot   

wxBot 是用Python包装Web微信协议实现的微信机器人框架。

目前的消息支持情况:

  •  群消息

    •  文本

    •  图片

    •  地理位置

    •  个人名片

    •  语音

    •  动画

    •  语音电话

    •  红包

  •  联系人消息

    •  文本

    •  图片

    •  地理位置

    •  个人名片

    •  语音

    •  小视频

    •  动画

    •  视频电话

    •  红包

    •  转账

  •  消息发送

    •  文本

    •  图片

    •  文件

Web微信协议参考资料:

挖掘微信Web版通信的全过程

微信协议简单调研笔记

qwx: WeChat Qt frontend 微信Qt前端

master-dev 分支为开发版本,用于测试新特性,欢迎使用后提出建议!

1 环境与依赖

此版本只能运行于Python 2环境 。

wxBot 用到了Python requests , pypng , Pillow 以及 pyqrcode 库。

使用之前需要所依赖的库:

pip install requestspip install pyqrcodepip install pypngpip install Pillow

2 快速开发

利用 wxBot 最简单的方法就是继承WXBot类并实现 handle_msg_all 或者 schedule 函数,然后实例化子类并调用 run 方法 。

2.1 代码

以下的代码对所有来自好友的文本消息回复文本消息 hi 、图片消息 1.png 以及文件消息 1.png , 并不断向好友 tb 发送文本schedule 。

handle_msg_all 函数用于处理收到的每条消息,而 schedule 函数可以做一些任务性的工作(例如不断向好友推送信息或者一些定时任务)。

#!/usr/bin/env python# coding: utf-8import timefrom wxbot import *class MyWXBot(WXBot): def handle_msg_all(self, msg): if msg['msg_type_id'] == 4 and msg['content']['type'] == 0: self.send_msg_by_uid(u'hi', msg['user']['id']) self.send_img_msg_by_uid('img/1.png', msg['user']['id']) self.send_file_msg_by_uid('img/1.png', msg['user']['id']) def schedule(self): self.send_msg(u'tb', u'schedule') time.sleep(1)def main(): bot = MyWXBot() bot.DEBUG = True bot.run()if __name__ == '__main__': main()

2.2 运行

直接用 python 运行代码(如运行测试代码 test.py ):

python test.py

2.3 登录微信

程序运行之后,会在当前目录下生成二维码图片文件 qr.png 并自动打开,用微信扫描此二维码并按操作指示确认登录网页微信。

如果运行在Linux下,还可以通过设置 WXBot 对象的 conf['qr'] 为 tty 的方式直接在终端打印二维码(此方法只能在Linux终端下使用),效果如下:


3 效果展示

测试代码 test.py 的运行效果:


4 接口

4.1 handle_msg_all

handle_msg_all 函数的参数 msg 是代表一条消息的字典。字段的内容为:

字段名字段内容
msg_type_id整数,消息类型,具体解释可以查看 消息类型表
msg_id字符串,消息id
content字典,消息内容,具体含有的字段请参考 消息类型表 ,一般含有 type(数据类型)与 data(数据内容)字段,type 与 data的对应关系可以参考 数据类型表
user字典,消息来源,字典包含 name(发送者名称,如果是群则为群名称,如果为微信号,有备注则为备注名,否则为微信号或者群昵称)字段与 id(发送者id)字段,都是字符串

4.2 消息类型表

类型号消息类型content
0初始化消息,内部数据无意义,可以忽略
1自己发送的消息无意义,可以忽略
2文件消息字典,包含 type 与 data 字段
3群消息字典, 包含 user (字典,包含 id 与 name字段,都是字符串,表示发送此消息的群用户)与 type、 data 字段,红包消息只有 type 字段, 文本消息还有detail、desc字段, 参考 群文本消息
4联系人消息字典,包含 type 与 data 字段
5公众号消息字典,包含 type 与 data 字段
6特殊账号消息字典,包含 type 与 data 字段
99未知账号消息无意义,可以忽略

4.3 数据类型表

type数据类型data
0文本字符串,表示文本消息的具体内容
1地理位置字符串,表示地理位置
3图片字符串,图片数据的url,HTTP POST请求此url可以得到jpg文件格式的数据
4语音字符串,语音数据的url,HTTP POST请求此url可以得到mp3文件格式的数据
5名片字典,包含 nickname (昵称), alias (别名),province (省份),city (城市), gender (性别)字段
6动画字符串, 动画url, HTTP POST请求此url可以得到gif文件格式的数据
7分享字典,包含 type (类型),title (标题),desc (描述),url (链接),from (源网站)字段
8视频不可用
9视频电话不可用
10撤回消息不可用
11空内容空字符串
12红包不可用
13小视频字符串,视频数据的url,HTTP POST请求此url可以得到mp4文件格式的数据
99未知类型不可用

4.4 群文本消息

由于群文本消息中可能含有@信息,因此群文本消息的 content 字典除了含有 type 与 data 字段外,还含有 detail 与desc 字段。

各字段内容为:

字段内容
type数据类型, 为0(文本)
data字符串,消息内容,含有@信息
desc字符串,删除了所有@信息
detail数组,元素类型为含有 type 与 value 字段的字典, type 为字符串 str (表示元素为普通字符串,此时value为消息内容) 或 at (表示元素为@信息, 此时value为所@的用户名)

4.5 WXBot对象属性

WXBot 对象在登录并初始化之后,含有以下的可用数据:

属性描述
contact_list当前用户的微信联系人列表
group_list当前用户的微信群列表
public_list当前用户关注的公众号列表
special_list特殊账号列表
sessionWXBot 与WEB微信服务器端交互所用的 Requests Session 对象

4.6 WXBot对象方法

WXBot 对象还含有一些可以利用的方法

方法描述
get_icon(uid, gid)获取联系人或者群聊成员头像并保存到本地文件 img_[uid].jpg , uid 为用户id, gid 为群id
get_head_img(id)获取用户头像并保存到本地文件 img_[id].jpg ,id 为用户id(Web微信数据)
get_msg_img(msgid)获取图像消息并保存到本地文件 img_[msgid].jpg , msgid 为消息id(Web微信数据)
get_voice(msgid)获取语音消息并保存到本地文件 voice_[msgid].mp3 , msgid 为消息id(Web微信数据)
get_video(msgid)获取视频消息并保存到本地文件 video_[msgid].mp4 , msgid 为消息id(Web微信数据)
get_contact_name(uid)获取微信id对应的名称,返回一个可能包含 remark_name (备注名), nickname (昵称),display_name (群名称)的字典
send_msg_by_uid(word, dst)向好友发送消息,word 为消息字符串,dst 为好友用户id(Web微信数据)
send_img_msg_by_uid(fpath, dst)向好友发送图片消息,fpath 为本地图片文件路径,dst 为好友用户id(Web微信数据)
send_file_msg_by_uid(fpath, dst)向好友发送文件消息,fpath 为本地文件路径,dst 为好友用户id(Web微信数据)
send_msg_by_uid(word, dst)向好友发送消息,word 为消息字符串,dst 为好友用户id(Web微信数据)
send_msg(name, word, isfile)向好友发送消息,name 为好友的备注名或者好友微信号, isfile为 False 时word 为消息,isfile 为 True 时 word 为文件路径(此时向好友发送文件里的每一行),此方法在有重名好友时会有问题,因此更推荐使用 send_msg_by_uid(word, dst)
is_contact(uid)判断id为 uid 的账号是否是本账号的好友,返回 True (是)或 False (不是)
is_public(uid)判断id为 uid 的账号是否是本账号所关注的公众号,返回 True (是)或 False (不是)

5 群聊机器人示例

bot.py 用 图灵机器人 API 以及 wxBot 实现了一个自动回复机器人.

此机器人会回复来自联系人的消息,以及群里@此账号的消息。

并且本账号可以通过发送 退下 、 走开 、 关闭 、 关掉 、 休息 、 滚开 来关闭机器人的自动回复。

也可以通过发送 出来 、 启动 、 工作 来再次开启机器人的自动回复。

群聊时需要将对应的群保存到联系人列表。

群聊实现效果:



bot.py 的运行方法:

  • 要接入图灵机器人API时:

    [main]    key=1d2678900f734aa0a23734ace8aec5b1
    python bot.py
    1. 运行 bot.py

    2. 图灵机器人官网注册账号,申请图灵key: 图灵key申请地址

    3. 在 bot.py 文件所在目录下新建 conf.ini 文件,内容为:(key字段内容为申请到的图灵key)

  • 不接入图灵机器人API时(此时机器人对联系人消息以及群里@自己的消息统一回复 知道了 ):

    python bot.py
    1. 运行 bot.py

6 类似项目

feit/Weixinbot Nodejs 封装网页版微信的接口,可编程控制微信消息

littlecodersh/ItChat 微信个人号接口、微信机器人及命令行微信,Command line talks through Wechat

Urinx/WeixinBot 网页版微信API,包含终端版微信及微信机器人

zixia/wechaty Wechaty is wechat for bot in Javascript(ES6). It's a Personal Account Robot Framework/Library.

7 基于Wxbot延伸的一些项目

WxbotManage 基于Wxbot的微信多开管理和Webapi系统

8 交流讨论

问题可以直接开 issue ,加群主进群体验测试效果



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多