Skip to content
WeChatBot 是用Python包装Web微信协议实现的微信机器人框架。
Python
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
doc
pypi
CHANGES.md Update log Feb 14, 2017
LICENSE LICENSE Feb 14, 2017
README.md README Feb 14, 2017
__init__.py
conf.ini
requirements.txt requirements Feb 14, 2017
test.py 实现了一个功能最基础的机器人 Feb 14, 2017
wechat.py 基本的群聊、单聊接口 Feb 14, 2017
wechatbot.py 利用wechat和图灵机器人实现了一个群聊机器人 Feb 14, 2017

README.md

WeChatBot python

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

目前的消息支持情况:

  • 群消息

    • 文本
    • 图片
    • 地理位置
    • 个人名片
    • 语音
    • 动画
    • 语音电话
    • 红包
  • 联系人消息

    • 文本
    • 图片
    • 地理位置
    • 个人名片
    • 语音
    • 小视频
    • 动画
    • 视频电话
    • 红包
    • 转账
  • 消息发送

    • 文本
    • 图片
    • 文件

Web微信协议参考资料:

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

微信协议简单调研笔记

qwx: WeChat Qt frontend 微信Qt前端

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

1 环境与依赖

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

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

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

pip install requests
pip install pyqrcode
pip install pypng
pip install Pillow

2 快速开发

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

2.1 代码

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

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from wechat import *


class MyWeChat(WeChat):
    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'张三', u'测试')
        time.sleep(1)


def main():
    bot = MyWeChat()
    bot.DEBUG = True
    bot.conf['qr'] = 'png'
    bot.is_big_contact = False  # 如果确定通讯录过大,无法获取,可以直接配置,跳过检查。假如不是过大的话,这个方法可能无法获取所有的联系人
    bot.run()


if __name__ == '__main__':
    main()

2.2 运行

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

python test.py

2.3 登录微信

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

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

login_on_ubuntu

3 效果展示

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

向机器人发送消息

4 接口

4.1 handle_msg_all

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

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

4.2 消息类型表

类型号 消息类型 content
0 初始化消息,内部数据 无意义,可以忽略
1 自己发送的消息 无意义,可以忽略
2 文件消息 字典,包含 typedata 字段
3 群消息 字典, 包含 user (字典,包含 idname字段,都是字符串,表示发送此消息的群用户)与 typedata 字段,红包消息只有 type 字段, 文本消息还有detail、desc字段, 参考 群文本消息
4 联系人消息 字典,包含 typedata 字段
5 公众号消息 字典,包含 typedata 字段
6 特殊账号消息 字典,包含 typedata 字段
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 字典除了含有 typedata 字段外,还含有 detaildesc 字段。

各字段内容为:

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

4.5 WeChat 对象属性

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

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

4.6 WeChat 对象方法

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

方法 描述
get_icon(uid, gid) 获取联系人或者群聊成员头像并保存到本地文件 img_[uid].jpg , uid 为用户id, gid 为群id
get_head_img(id) 获取用户头像并保存到本地文件 img_[id].jpgid 为用户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 为好友的备注名或者好友微信号, isfileFalseword 为消息,isfileTrueword 为文件路径(此时向好友发送文件里的每一行),此方法在有重名好友时会有问题,因此更推荐使用 send_msg_by_uid(word, dst)
is_contact(uid) 判断id为 uid 的账号是否是本帐号的好友,返回 True (是)或 False (不是)
is_public(uid) 判断id为 uid 的账号是否是本帐号所关注的公众号,返回 True (是)或 False (不是)

5 群聊机器人示例

wechatbot.py图灵机器人 API 以及 WeChat 实现了一个自动回复机器人。

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

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

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

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

群聊实现效果:

群聊

wechatbot.py 的运行方法:

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

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

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

    [main]    
    key=1d2678900f734aa0a23734ace8aec5b1
    
    1. 运行 wechatbot.py
    python wechatbot.py
  • 不接入图灵机器人API时(此时机器人对联系人消息以及群里@自己的消息统一回复 知道了 ):

    1. 运行 wechatbot.py
    python wechatbot.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.

You can’t perform that action at this time.