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中的各种装饰器详解
Apr 11 Python
python3中bytes和string之间的互相转换
Feb 09 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
Python基于滑动平均思想实现缺失数据填充的方法
Feb 21 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
python 函数中的参数类型
Feb 11 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 Python
Python实现老照片修复之上色小技巧
Oct 16 Python
Python requests用法和django后台处理详解
Mar 19 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
php短域名转换为实际域名函数
2011/01/17 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
PHP小教程之实现链表
2014/06/09 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
twig里使用js变量的方法
2016/02/05 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
新手入门常用代码集锦
2007/01/11 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python实现获取Ip归属地等信息
2016/08/27 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
python 动态加载的实现方法
2017/12/22 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
详解Python3 pickle模块用法
2019/09/16 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
高一化学教学反思
2014/02/05 职场文书