Python微信操控itchat的方法


Posted in Python onMay 31, 2019

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

综合:

Python微信操控itchat的方法

实现文本信息的关联,及可以实时看到所关联的账号的聊天信息,当发生聊天数据时会主动将聊天数据发送到主账号上

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()

总结

以上所述是小编给大家介绍的Python微信操控itchat的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
Python使用numpy实现BP神经网络
Mar 10 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
jupyter note 实现将数据保存为word
Apr 14 Python
Python可视化工具如何实现动态图表
Oct 23 Python
Python headers请求头如何实现快速添加
Nov 03 Python
Python模拟登录requests.Session应用详解
Nov 17 Python
Python实现列表拼接和去重的三种方式
Jul 02 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
python基于SMTP协议发送邮件
May 31 #Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 #Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 #Python
基于Python打造账号共享浏览器功能
May 30 #Python
Python实现带下标索引的遍历操作示例
May 30 #Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 #Python
python2和python3在处理字符串上的区别详解
May 29 #Python
You might like
什么是MVC,好东西啊
2007/05/03 PHP
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
js实现拖拽效果
2015/02/12 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
关于JS解构的5种有趣用法
2019/09/05 Javascript
js实现表格数据搜索
2020/08/09 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
python模块之StringIO使用示例
2015/04/08 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
2014年工作总结及2015工作计划
2014/12/12 职场文书
护士个人总结范文
2015/02/13 职场文书
表扬信范文
2015/05/04 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
Pytest中skip和skipif的具体使用方法
2021/06/30 Python