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统计文本字符串里单词出现频率的方法
May 26 Python
python字典基本操作实例分析
Jul 11 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
python访问抓取网页常用命令总结
Apr 11 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
python文件拆分与重组实例
Dec 10 Python
python监测当前联网状态并连接的实例
Dec 18 Python
基于Python中random.sample()的替代方案
May 23 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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
牡丹941资料
2021/03/01 无线电
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Python的多维空数组赋值方法
2018/04/13 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
个人实用简单的自我评价
2013/10/19 职场文书
服装设计专业毕业生推荐信
2013/11/09 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
社会实践评语
2014/04/28 职场文书
大学活动总结范文
2014/04/29 职场文书
县级文明单位申报材料
2014/05/23 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
简易版租房协议书范本
2014/10/13 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书