zoukankan      html  css  js  c++  java
  • Python微信操控(itchat)

    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 '"\
    '):
     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

    综合:

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

     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+""+inuserx+"-->"+touserx+" :
    "+texts,toUserName=totouserx) #发送给目标
    14 
    15 #登入
    16 itchat.auto_login()
    17 thisuserx=itchat.search_friends()["NickName"] #得到当前用户昵称
    18 #保持运行
    19 itchat.run()
  • 相关阅读:
    iot 表索引dump《2》
    heap表和iot表排序规则不同
    Cannot complete the install because one or more required items could not be found.
    iot表输出按主键列排序,heap表不是
    iot 表主键存放所有数据,且按数据插入顺序排序
    iot表和heap表排序规则不同
    org.eclipse.graphiti.ui.editor.DiagramEditorInput.
    Oracle 排序规则
    perl 异步超时 打印错误
    14.6.3 Grouping DML Operations with Transactions 组DML操作
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/10490563.html
Copyright © 2011-2022 走看看