• 微信非群管理员,我实现了@所有人


     🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝

    🥰 博客首页:knighthood2001

    😗 欢迎点赞👍评论🗨️

    ❤️ 热爱python,期待与大家一同进步成长!!❤️

    👀给大家推荐一款很火爆的刷题、面试求职网站👀

    笔者已经在刷的路上了,诚挚邀请您来和我一起刷题!!😁

    目录

    一、前言

    二、前期准备

    三、代码实现

    模块导入

    获取微信群聊群成员昵称

    逐一艾特

    四、结尾


    实现结果如下:

    (艾特人数太多,为了将所有人显示在同一页面内才最大化的)

    一、前言

            这里采用的是我之前一直使用的uiautomation模块。

            针对微信群聊的@所有人,你如果不是群管理,是没有这个功能,笔者想通过一个一个艾特来实现艾特所有人。因此,以下内容只适用于普通人,毕竟管理才几个呀,满足普通人的需要才最重要😗😗。

    二、前期准备

            ①在输入@后,微信会弹出一个框,里面最多有42个联系人

            ②当你选择其中 一个后,其会在后面多出类似空格的东西,此外,@+群成员+类似空格的内容,组成了一个整体。

     

    如果不符合以上要求,就不算真正意义上的@,其他人也收不到被@。

    此外笔者发现,@+群成员+类似空格,其在其他地方粘贴后没有内容。

    以上内容导致,笔者最终只能通过@,然后输入用户昵称,然后回车,而无其他更好更快捷的方式。


    三、代码实现

    模块导入

    1. import subprocess
    2. import uiautomation as auto
    3. import time

    subprocess用来打开微信页面,当然也可以使用time.sleep()设置足够找到需要@所有人的群的时间。

    获取微信群聊群成员昵称

    首先点击群聊右上角的三个点,然后如果有查看更多的话,需要点击,这样才能显示所有群成员昵称

    1. # ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
    2. subprocess.Popen('E:\微信\WeChat\WeChat.exe')
    3. # 获取微信窗体对象
    4. wechatWindow = auto.WindowControl(Name='微信', ClassName="WeChatMainWndForPC")
    5. b = wechatWindow.ButtonControl(Name='聊天信息')
    6. b.Click()
    7. b2 = wechatWindow.ButtonControl(Name='查看更多')
    8. if b2.Exists():
    9. b2.Click()

     聊天成员下就是群成员昵称了。

    1. # SessionChatRoomDetailWnd = auto.WindowControl(Name='SessionChatRoomDetailWnd', className="SessionChatRoomDetailWnd")
    2. # men_list = SessionChatRoomDetailWnd.ListControl(Name='聊天成员')
    3. # 以上两行尽量改为这行
    4. men_list = wechatWindow.ListControl(Name='聊天成员')
    5. # print(len(men_list.GetChildren()))
    6. c = []
    7. for mem in men_list.GetChildren():
    8. # print(mem.Name)
    9. if mem.Name == '添加' or mem.Name == '删除':
    10. pass
    11. else:
    12. c.append(mem.Name)
    13. print(c)
    14. print(len(c))

    这里我们一步一步的获取到昵称,然后放到列表中。

    注意:群成员中会有添加或者删除的,我们不要获取。

    当然这里笔者把自己也算进去了,大家可以自己在那个判断里面加上

    or mem.Name == '自己的群昵称'。如下

    if mem.Name == '添加' or mem.Name == '删除' or mem.Name == 'knighthood2001':

    逐一艾特

    ChatContactMenu = wechatWindow.PaneControl(Name='ChatContactMenu', ClassName='ChatContactMenu')

    这是打出@后的框的对象。

    接下来,我们需要点击一下输入框,方便后续输入

    1. ChatContactMenu = wechatWindow.PaneControl(Name='ChatContactMenu', ClassName='ChatContactMenu')
    2. edit = wechatWindow.EditControl(Name='输入')
    3. edit.Click(50, 50)

    刚开始,笔者写了以下代码,后来发现交互功能太差了,根本不知道艾特到第几个了,因此进行更改。 

    1. '''1'''
    2. for i in c:
    3. edit.SendKeys('@')
    4. edit.SendKeys(i)
    5. # 回车发送消息
    6. if ChatContactMenu.Exists():
    7. wechatWindow.SendKeys('{Enter}')
    8. print('成功艾特:', i)
    9. else:
    10. print(' {}:艾特失败'.format(i))
    11. continue
    12. # time.sleep(1)
    13. # wechatWindow.SendKeys('{Enter}')

     以下就是进行更改的内容

    1. '''2'''
    2. fail = ''
    3. for i, v in enumerate(c):
    4. edit.SendKeys('@')
    5. edit.SendKeys(v)
    6. # 判断@框是否出现
    7. if ChatContactMenu.Exists():
    8. wechatWindow.SendKeys('{Enter}')
    9. print('{}/{}成功艾特:'.format(i+1, len(c)), v)
    10. else:
    11. print('{}/{} {}:艾特失败'.format(i+1, len(c), v))
    12. fail += "{} ".format(v)
    13. continue
    14. print("艾特失败:", fail)
    15. # time.sleep(1)
    16. # wechatWindow.SendKeys('{Enter}')

    其中fail存放的是艾特失败的人,使用enumera函数,获取列表中元素下标。

    注意:uiautomation中的SendKeys()函数的功能和鼠标键入一样,而不是粘贴。粘贴群成员名称在这里是不会跳出@框的。

    接下来,我们要判断输入的内容是否会弹出@框,如果没有,我们就判断为没有艾特成功,并将其存在fail中。

    由于笔者能力有限,对于表情包,其有些会进行unicode转换,导致从c列表中那个提取后,有些表情显示不出,而是很多个空格,这样也就导致了昵称输入不对,没有出现@框。

    如上图,这里的CN表示的是中国国旗,但是表情包存储之间的方式,笔者仍在努力尝试。

    因此,要彻底解决@所有人,需要去了解微信表情包存储相关知识。

    以上就实现了@功能,需要将其发送出来,只要在后面加

    1. time.sleep(1)
    2. wechatWindow.SendKeys('{Enter}')

     这样就大致实现了@所有人,也具有良好的交互功能。

    四、结尾

            以上内容,有些可能不是那么完善,比如群聊@自己,如何把这一点排除在外,有待思考。

            关于uiautomation模块自动化,笔者觉得非常有趣,可玩性极高,大家可以自己去试试

  • 相关阅读:
    混剪功能开发——抖音账号矩阵系统源码解析
    在css3中如何添加圆角边框、盒子阴影以及文字阴影
    在雷电模拟器9上安装magisk并安装LSPosed模块以及其Manager管理器(一)
    Python基础之网络编程:2、OSI协议之七层协议
    【云原生】k8s存储管理中ConfigMap & Secret的使用
    如何搭建一套指标体系?
    SSM+医保业财一体化管理系统 毕业设计-附源码151023
    Maven多模块管理(转载)
    windows查询端口占用
    STL(C++)
  • 原文地址:https://blog.csdn.net/knighthood2001/article/details/126189446