itchat 是一个开源的微信个人号接口, 使用 python 调用微信从未如此简单.
开源地址
https://github.com/littlecodersh/ItChat
文档:
https://itchat.readthedocs.io/zh/latest/
安装:
pip3 install itchat
登入与登出
登入并向文件助手发送一句话, 登入时会经过扫码操作, 类似于电脑微信登入
- import itchat
- #登入并保存登入状态, 实现第一次运行时扫码, 一定时间内再次运行就不用扫码了, 手机微信上将显示: 网页微信已登入.....
- itchat.auto_login(hotReload=True)
- #发送文本数据到文件助手
- itchat.send("东小东你好 123",toUserName="filehelper")
登出:
itchat.logout()
注册登入登出的回调方法
- def ldong():
- print('微信登入')
- def edong():
- print('微信登出')
- #登入
- itchat.auto_login(hotReload=True,loginCallback=ldong, exitCallback=edong)
命令行二维码
通过以下命令可以在登陆的时候使用命令行显示二维码:
itchat.auto_login(enableCmdQR=True)
部分系统可能字幅宽度有出入, 可以通过将 enableCmdQR 赋值为特定的倍数进行调整:
- # 如部分的 Linux 系统, 块字符的宽度为一个字符 (正常应为两字符), 故赋值为 2
- itchat.auto_login(enableCmdQR=2)
默认控制台背景色为暗色 (黑色), 若背景色为浅色 (白色), 可以将 enableCmdQR 赋值为负值:
itchat.auto_login(enableCmdQR=-1)
可接受监听的数据类型
消息分类:
图片或表情 (PICTURE), 录制 (RECORDING), 附件 (ATTACHMENT), 小视频 (VIDEO), 文本 (TEXT), 地图 (MAP), 名片 (CARD), 通知 (NOTE), 分享 (SHARING), 好友邀请 (FRIENDS), 语音 (RECORDING), 系统消息 (SYSTEM)
获取消息内容:
可以通过 print(msg) 方法查看消息里的所有数据, 然后进行提取
- @itchat.msg_register(itchat.content.TEXT)
- def text_reply(msg):
- print(msg)
消息捕获
针对朋友的消息捕获
登入时不适用于 hotReload=True, 因为多次运行会多次注册自动回复, 比如在没有登出的情况下运行 3 次程序, 就会出现 1 次接受 3 次发送的效果
监听函数只有在对方发送数据时进入
文本
- import itchat
- #自动回复
- @itchat.msg_register(itchat.content.TEXT)
- def text_reply(msg):
- return "东小东回复数据:"+msg["Text"]
- #登入
- itchat.auto_login()
- #保持运行
- itchat.run()
文件下载
- import itchat
- #PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT
- # 图片, 录制, 附件, 视频, 文本
- from itchat.content import PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT
- @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
- def download_files(msg):
- filedpx="./filex/"+msg["FileName"] #得到文件路径, 目录需要手动创建
- msg.download(filedpx) #下载
- return "你发送的文件类型"+msg['Type']+"保存地址为: filex/"+msg.fileName
针对群聊的自动监测
如果想添加针对群聊的监测, 则在监听函数加入 isGroupChat=True
监听函数只要有数据发送就会进入, 包括自己发送的数据
- import itchat
- #只对群消息有效
- @itchat.msg_register(itchat.content.TEXT,isGroupChat=True)
- def text_reply(msg):
- if(msg["Text"]=="11"):
- return "东小东回复数据 xx:"+msg["Text"]
- #只对个人用户有效
- @itchat.msg_register(itchat.content.TEXT)
- def text_reply(msg):
- return "东小东回复数据:"+msg["Text"]
- #登入
- itchat.auto_login()
- #保持运行
- itchat.run()
@我信息监测
- import itchat
- #只对群消息有效
- @itchat.msg_register(itchat.content.TEXT,isGroupChat=True)
- def text_reply(msg):
- #判断是否是 @本人
- if msg["Text"].find("@"+usermsgx["NickName"])==0:
- return "@"+msg.actualNickName+"东你发的信息为:"+msg.text
- itchat.auto_login()# 登入
- usermsgx=itchat.search_friends()# 得到当前用户的信息
- itchat.run()# 保持运行
针对所有信息来源信息监听
朋友, 群聊, 公众号
- @itchat.msg_register(TEXT, isFriendChat=True, isGroupChat=True, isMpChat=True)
- def simple_reply(msg):
- return 'I received: %s' % msg.text
数据发送
return
在接收数据函数里的 return "数据" 则是自动确认为回复当前发送用户数据, 可以删除该句, 则不进行数据回复
itchat.send, 可以一次性发送多条
参数:(内容, 用户)
返回值: 发送结果, 是否发送成功, JSON 数据
注意: 文件地址不可为中文
内容: 可为单独的字符串内容, 其他有 [@类型 @地址] , 类型有图片 (img), 文件 (fil), 视频 (vid)
用户: 省略则发个自己, 不稳定, msg['FromUserName'] 表示指定用户为触发用户
- res=itchat.send('文本信息的发送......!', toUserName=msg['FromUserName'])
- res=itchat.send('@img@%s' % './filex/zcy.gif', toUserName=msg['FromUserName'])
- res=itchat.send('@fil@%s' % './filex/tt.txt', toUserName=msg['FromUserName'])
- res=itchat.send('@vid@%s' % './filex/videox.mp4', toUserName=msg['FromUserName'])
指定类型发送 2
参数:(地址, 用户)
返回值: 发送结果, 是否发送成功, JSON 数据
注意: 文件地址不可为中文
- bb = itchat.send_msg('文字信息 2', toUserName=msg['FromUserName'])
- bb = itchat.send_image('./filex/zcy.gif', toUserName=msg['FromUserName'])
- bb = itchat.send_file('./filex/tt.txt', toUserName=msg['FromUserName'])
- bb = itchat.send_video('./filex/videox.mp4', toUserName=msg['FromUserName'])
- print("返回值:",bb)
- msg.user.send()
使用与 itchat.send() 相同, 但是可以已经确定 toUserName=msg['FromUserName'], 不可更换
指定用户 (toUserName):
文件助手 (发送给自己, 必备):toUserName="filehelper"
发送者: toUserName=msg['FromUserName']
例子:
通过群名向群里发送内容, 该微信群需要在运行代码前进行手动添加到通讯录
- import itchat
- #登入
- itchat.auto_login()
- chatroomName='傻逼群'# 群名
- itchat.get_chatrooms(update=True)
- chatrooms = itchat.search_chatrooms(name=chatroomName)
- if len(chatrooms)==0 :
- print('没有找到群聊:' + chatroomName)
- exit(0)
- else:
- print(chatrooms[0]['UserName'])# 输出群聊标识符
- itchat.send_msg('大家好, 这是发送的内容', toUserName=chatrooms[0]['UserName'])# 发送消息
- #保持运行
- itchat.run()
个人的基本信息
获取本人信息
- usermsgx=itchat.search_friends()
- print(usermsgx)
- print(usermsgx["NickName"]) #得到昵称
获取所有朋友信息
- friendx=itchat.get_friends()
- print(friendx)
条件获取朋友或者自己信息
- # 获取特定 UserName 的用户信息
- itchat.search_friends(userName='@abcdefg1234567')
- # 获取任何一项等于 name 键值的用户
- itchat.search_friends(name='littlecodersh')
- # 获取分别对应相应键值的用户
- itchat.search_friends(wechatAccount='littlecodersh')
- # 三, 四项功能可以一同使用
- itchat.search_friends(name='LittleCoder 机器人', wechatAccount='littlecodersh')
得到用户序号
- @itchat.msg_register([TEXT,MAP])
- def text_reply(msg):
- print(msg)
- print(msg["User"]["Uin"])
更新用户数据, 通过 UserName, 或者 UserName 列表
memberList = itchat.update_friend('@abcdefg1234567')
注意:
中文文件名文件上传
Q: 为什么中文的文件没有办法上传?
A: 这是因为使用 requests 包会自动将中文文件名编码为服务器端无法识别的格式, 所以需要修改 requests 包或者使用别的方法上传文件.
最简单的方法即将 requests 包的 packages/urlib3 中的 fields.py 中的 format_header_param 方法改为如下内容:
- def format_header_param(name, value):
- if not any(ch in value for ch in '"\\\r\n'):
- result = '%s="%s"' % (name, value)
- try:
- result.encode('ascii')
- except UnicodeEncodeError:
- pass
- else:
- return result
- if not six.PY3: # Python 2:
- value = value.encode('utf-8')
- value = email.utils.encode_rfc2231(value, 'utf-8')
- value = '%s="%s"'% (name, value.decode('utf8'))
- return value
命令行显示二维码
Q: 为什么我在设定了 itchat.auto_login() 的 enableCmdQR 为 True 后还是没有办法在命令行显示二维码?
A: 这是由于没有安装可选的包 pillow, 可以使用右边的命令安装: pip install pillow
综合:
实现文本信息的关联, 及可以实时看到所关联的账号的聊天信息, 当发生聊天数据时会主动将聊天数据发送到主账号上
- import itchat
- from itchat.content import PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT,MAP
- #只对个人用户有效
- @itchat.msg_register([TEXT])
- def text_reply(msg):
- # 查询数据的接收者
- touserx="filehelper"# 默认为文件助手发送信息
- if msg["ToUserName"]!="filehelper":# 如果非文件助手信息
- touserx=itchat.search_friends(userName=msg["ToUserName"])["NickName"]
- inuserx = itchat.search_friends(userName=msg["FromUserName"])["NickName"]# 查询数据的发送者
- totouserx=itchat.search_friends(name='东里个咚')[0]["UserName"] #通过昵称查询到 username
- texts=msg.text #得到接收的数据
- itchat.send_msg("["+thisuserx+"] \n"+inuserx+"-->"+touserx+":\n"+texts,toUserName=totouserx) #发送给目标
- #登入
- itchat.auto_login()
- thisuserx=itchat.search_friends()["NickName"] #得到当前用户昵称
- #保持运行
- itchat.run()
来源: https://www.cnblogs.com/dongxiaodong/p/10490563.html