Python微信操控(itchat)

系统 1507 0

itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。

开源地址

https://github.com/littlecodersh/ItChat

文档:

https://itchat.readthedocs.io/zh/latest/

安装:

            pip3 install itchat
          

登入与登出

登入并向文件助手发送一句话,登入时会经过扫码操作,类似于电脑微信登入

            
              1
            
            
              import
            
            
               itchat

            
            
              2
            
            
              #
            
            
              登入并保存登入状态,实现第一次运行时扫码,一定时间内再次运行就不用扫码了,手机微信上将显示:网页微信已登入.....
            
            
              3
            
             itchat.auto_login(hotReload=
            
              True)

            
            
              4
            
            
              #
            
            
              发送文本数据到文件助手
            
            
              5
            
             itchat.send(
            
              "
            
            
              东小东你好123
            
            
              "
            
            ,toUserName=
            
              "
            
            
              filehelper
            
            
              "
            
            )
          

登出:

            itchat.logout() 
          

注册登入登出的回调方法

            
              1
            
            
              def
            
            
               ldong():

            
            
              2
            
            
              print
            
            (
            
              '
            
            
              微信登入
            
            
              '
            
            
              )

            
            
              3
            
            
              def
            
            
               edong():

            
            
              4
            
            
              print
            
            (
            
              '
            
            
              微信登出
            
            
              '
            
            
              )

            
            
              5
            
            
              #
            
            
              登入
            
            
              6
            
             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次发送的效果

监听函数只有在对方发送数据时进入

文本

            
               1
            
            
              import
            
            
               itchat

            
            
               2
            
            
              #
            
            
              自动回复
            
            
               3
            
            
              @itchat.msg_register(itchat.content.TEXT)

            
            
               4
            
            
              def
            
            
               text_reply(msg):

            
            
               5
            
            
              return
            
            
              "
            
            
              东小东回复数据:
            
            
              "
            
            +msg[
            
              "
            
            
              Text
            
            
              "
            
            
              ]

            
            
               6
            
            
               7
            
            
              #
            
            
              登入
            
            
               8
            
            
              itchat.auto_login()

            
            
               9
            
            
              #
            
            
              保持运行
            
            
              10
            
             itchat.run()
          

文件下载

            
               1
            
            
              import
            
            
               itchat

            
            
               2
            
            
              #
            
            
              PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT
            
            
               3
            
            
              #
            
            
               图片、录制、附件、视频、文本
            
            
               4
            
            
              from
            
             itchat.content 
            
              import
            
            
               PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT

            
            
               5
            
            
               6
            
            
              @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])

            
            
               7
            
            
              def
            
            
               download_files(msg):

            
            
               8
            
                 filedpx=
            
              "
            
            
              ./filex/
            
            
              "
            
            +msg[
            
              "
            
            
              FileName
            
            
              "
            
            ] 
            
              #
            
            
              得到文件路径,目录需要手动创建
            
            
               9
            
                 msg.download(filedpx) 
            
              #
            
            
              下载
            
            
              10
            
            
              return
            
            
              "
            
            
              你发送的文件类型
            
            
              "
            
            +msg[
            
              '
            
            
              Type
            
            
              '
            
            ]+
            
              "
            
            
                保存地址为:filex/
            
            
              "
            
            +msg.fileName
          

针对群聊的自动监测

如果想添加针对群聊的监测,则在监听函数加入isGroupChat=True

监听函数只要有数据发送就会进入,包括自己发送的数据

            
               1
            
            
              import
            
            
               itchat

            
            
               2
            
            
              #
            
            
              只对群消息有效
            
            
               3
            
             @itchat.msg_register(itchat.content.TEXT,isGroupChat=
            
              True)

            
            
               4
            
            
              def
            
            
               text_reply(msg):

            
            
               5
            
            
              if
            
            (msg[
            
              "
            
            
              Text
            
            
              "
            
            ]==
            
              "
            
            
              11
            
            
              "
            
            
              ):

            
            
               6
            
            
              return
            
            
              "
            
            
              东小东回复数据xx:
            
            
              "
            
            +msg[
            
              "
            
            
              Text
            
            
              "
            
            
              ]

            
            
               7
            
            
              #
            
            
              只对个人用户有效
            
            
               8
            
            
              @itchat.msg_register(itchat.content.TEXT)

            
            
               9
            
            
              def
            
            
               text_reply(msg):

            
            
              10
            
            
              return
            
            
              "
            
            
              东小东回复数据:
            
            
              "
            
            +msg[
            
              "
            
            
              Text
            
            
              "
            
            
              ]

            
            
              11
            
            
              #
            
            
              登入
            
            
              12
            
            
              itchat.auto_login()

            
            
              13
            
            
              #
            
            
              保持运行
            
            
              14
            
             itchat.run()
          

@我信息监测

            
               1
            
            
              import
            
            
               itchat

            
            
               2
            
            
              #
            
            
              只对群消息有效
            
            
               3
            
             @itchat.msg_register(itchat.content.TEXT,isGroupChat=
            
              True)

            
            
               4
            
            
              def
            
            
               text_reply(msg):

            
            
               5
            
            
              #
            
            
              判断是否是@本人
            
            
               6
            
            
              if
            
             msg[
            
              "
            
            
              Text
            
            
              "
            
            ].find(
            
              "
            
            
              @
            
            
              "
            
            +usermsgx[
            
              "
            
            
              NickName
            
            
              "
            
            ])==
            
              0:

            
            
               7
            
            
              return
            
            
              "
            
            
              @
            
            
              "
            
            +msg.actualNickName+
            
              "
            
            
               东你发的信息为:
            
            
              "
            
            +
            
              msg.text

            
            
               8
            
            
               9
            
             itchat.auto_login()
            
              #
            
            
              登入
            
            
              10
            
             usermsgx=itchat.search_friends()
            
              #
            
            
              得到当前用户的信息
            
            
              11
            
             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']表示指定用户为触发用户

            
              1
            
             res=itchat.send(
            
              '
            
            
              文本信息的发送......!
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            
              ])

            
            
              2
            
             res=itchat.send(
            
              '
            
            
              @img@%s
            
            
              '
            
             % 
            
              '
            
            
              ./filex/zcy.gif
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            
              ])

            
            
              3
            
             res=itchat.send(
            
              '
            
            
              @fil@%s
            
            
              '
            
             % 
            
              '
            
            
              ./filex/tt.txt
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            
              ])

            
            
              4
            
             res=itchat.send(
            
              '
            
            
              @vid@%s
            
            
              '
            
             % 
            
              '
            
            
              ./filex/videox.mp4
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            ])
          

指定类型发送2

参数:(地址,用户)

返回值:发送结果,是否发送成功,json数据

注意:文件地址不可为中文

            
              1
            
             bb = itchat.send_msg(
            
              '
            
            
              文字信息2
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            
              ])

            
            
              2
            
             bb = itchat.send_image(
            
              '
            
            
              ./filex/zcy.gif
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            
              ])

            
            
              3
            
             bb = itchat.send_file(
            
              '
            
            
              ./filex/tt.txt
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            
              ])

            
            
              4
            
             bb = itchat.send_video(
            
              '
            
            
              ./filex/videox.mp4
            
            
              '
            
            , toUserName=msg[
            
              '
            
            
              FromUserName
            
            
              '
            
            
              ])

            
            
              5
            
            
              print
            
            (
            
              "
            
            
              返回值:
            
            
              "
            
            ,bb)
          

msg.user.send()

使用与itchat.send()相同,但是可以已经确定toUserName=msg['FromUserName'],不可更换

指定用户(toUserName):

文件助手(发送给自己,必备):toUserName="filehelper"

发送者:toUserName=msg['FromUserName']

例子:

通过群名向群里发送内容,该微信群需要在运行代码前进行手动添加到通讯录

            
               1
            
            
              import
            
            
               itchat

            
            
               2
            
            
               3
            
            
              #
            
            
              登入
            
            
               4
            
            
              itchat.auto_login()

            
            
               5
            
             chatroomName=
            
              '
            
            
              傻逼群
            
            
              '
            
            
              #
            
            
              群名
            
            
               6
            
             itchat.get_chatrooms(update=
            
              True)

            
            
               7
            
             chatrooms = itchat.search_chatrooms(name=
            
              chatroomName)

            
            
               8
            
            
              if
            
             len(chatrooms)==
            
              0 :

            
            
               9
            
            
              print
            
            (
            
              '
            
            
              没有找到群聊:
            
            
              '
            
             +
            
               chatroomName)

            
            
              10
            
            
                  exit(0)

            
            
              11
            
            
              else
            
            
              :

            
            
              12
            
            
              print
            
            (chatrooms[0][
            
              '
            
            
              UserName
            
            
              '
            
            ])
            
              #
            
            
              输出群聊标识符
            
            
              13
            
                 itchat.send_msg(
            
              '
            
            
              大家好,这是发送的内容
            
            
              '
            
            , toUserName=chatrooms[0][
            
              '
            
            
              UserName
            
            
              '
            
            ])
            
              #
            
            
              发送消息
            
            
              14
            
            
              15
            
            
              #
            
            
              保持运行
            
            
              16
            
             itchat.run()
          

个人的基本信息

获取本人信息

            usermsgx=
            
              itchat.search_friends()

            
            
              print
            
            
              (usermsgx)

            
            
              print
            
            (usermsgx[
            
              "
            
            
              NickName
            
            
              "
            
            ]) 
            
              #
            
            
              得到昵称
            
          

获取所有朋友信息

            friendx=
            
              itchat.get_friends()

            
            
              print
            
            (friendx)
          

条件获取朋友或者自己信息

            
              1
            
            
              #
            
            
               获取特定UserName的用户信息
            
            
              2
            
             itchat.search_friends(userName=
            
              '
            
            
              @abcdefg1234567
            
            
              '
            
            
              )

            
            
              3
            
            
              #
            
            
               获取任何一项等于name键值的用户
            
            
              4
            
             itchat.search_friends(name=
            
              '
            
            
              littlecodersh
            
            
              '
            
            
              )

            
            
              5
            
            
              #
            
            
               获取分别对应相应键值的用户
            
            
              6
            
             itchat.search_friends(wechatAccount=
            
              '
            
            
              littlecodersh
            
            
              '
            
            
              )

            
            
              7
            
            
              #
            
            
               三、四项功能可以一同使用
            
            
              8
            
             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方法改为如下内容:

            
               1
            
            
              def
            
            
               format_header_param(name, value):

            
            
               2
            
            
              if
            
            
              not
            
             any(ch 
            
              in
            
             value 
            
              for
            
             ch 
            
              in
            
            
              '
            
            
              "\\\r\n
            
            
              '
            
            
              ):

            
            
               3
            
                     result = 
            
              '
            
            
              %s="%s"
            
            
              '
            
             %
            
               (name, value)

            
            
               4
            
            
              try
            
            
              :

            
            
               5
            
                         result.encode(
            
              '
            
            
              ascii
            
            
              '
            
            
              )

            
            
               6
            
            
              except
            
            
               UnicodeEncodeError:

            
            
               7
            
            
              pass
            
            
               8
            
            
              else
            
            
              :

            
            
               9
            
            
              return
            
            
               result

            
            
              10
            
            
              if
            
            
              not
            
             six.PY3:  
            
              #
            
            
               Python 2:
            
            
              11
            
                     value = value.encode(
            
              '
            
            
              utf-8
            
            
              '
            
            
              )

            
            
              12
            
                 value = email.utils.encode_rfc2231(value, 
            
              '
            
            
              utf-8
            
            
              '
            
            
              )

            
            
              13
            
                 value = 
            
              '
            
            
              %s="%s"
            
            
              '
            
             % (name, value.decode(
            
              '
            
            
              utf8
            
            
              '
            
            
              ))

            
            
              14
            
            
              return
            
             value
          

命令行显示二维码

Q: 为什么我在设定了itchat.auto_login()的enableCmdQR为True后还是没有办法在命令行显示二维码?

A: 这是由于没有安装可选的包pillow,可以使用右边的命令安装:pip install pillow

综合:

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

Python微信操控(itchat)_第1张图片

            
               1
            
            
              import
            
            
               itchat

            
            
               2
            
            
              from
            
             itchat.content 
            
              import
            
            
               PICTURE, RECORDING, ATTACHMENT, VIDEO,TEXT,MAP

            
            
               3
            
            
              #
            
            
              只对个人用户有效
            
            
               4
            
            
              @itchat.msg_register([TEXT])

            
            
               5
            
            
              def
            
            
               text_reply(msg):

            
            
               6
            
            
              #
            
            
               查询数据的接收者
            
            
               7
            
                touserx=
            
              "
            
            
              filehelper
            
            
              "
            
            
              #
            
            
              默认为文件助手发送信息
            
            
               8
            
            
              if
            
             msg[
            
              "
            
            
              ToUserName
            
            
              "
            
            ]!=
            
              "
            
            
              filehelper
            
            
              "
            
            :
            
              #
            
            
              如果非文件助手信息
            
            
               9
            
                     touserx=itchat.search_friends(userName=msg[
            
              "
            
            
              ToUserName
            
            
              "
            
            ])[
            
              "
            
            
              NickName
            
            
              "
            
            
              ]

            
            
              10
            
                inuserx = itchat.search_friends(userName=msg[
            
              "
            
            
              FromUserName
            
            
              "
            
            ])[
            
              "
            
            
              NickName
            
            
              "
            
            ]
            
              #
            
            
              查询数据的发送者
            
            
              11
            
                totouserx=itchat.search_friends(name=
            
              '
            
            
              东里个咚
            
            
              '
            
            )[0][
            
              "
            
            
              UserName
            
            
              "
            
            ] 
            
              #
            
            
              通过昵称查询到username
            
            
              12
            
                texts=msg.text 
            
              #
            
            
              得到接收的数据
            
            
              13
            
                itchat.send_msg(
            
              "
            
            
            
              "
            
            +thisuserx+
            
              "
            
            
              】\n
            
            
              "
            
            +inuserx+
            
              "
            
            
              -->
            
            
              "
            
            +touserx+
            
              "
            
            
               :\n
            
            
              "
            
            +texts,toUserName=totouserx) 
            
              #
            
            
              发送给目标
            
            
              14
            
            
              15
            
            
              #
            
            
              登入
            
            
              16
            
            
              itchat.auto_login()

            
            
              17
            
             thisuserx=itchat.search_friends()[
            
              "
            
            
              NickName
            
            
              "
            
            ] 
            
              #
            
            
              得到当前用户昵称
            
            
              18
            
            
              #
            
            
              保持运行
            
            
              19
            
             itchat.run()
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论