冰凌汇编

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 51|回复: 0
收起左侧

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

[复制链接]
HQ0731 发表于 2022-8-17 15:36:06
这里采用的是我之前一直使用的uiautomation模块。
针对微信群聊的@所有人,你如果不是群管理,是没有这个功能,笔者想通过一个一个艾特来实现艾特所有人。因此,以下内容只适用于普通人,毕竟管理才几个呀,满足普通人的需要才最重要🧐
一、前期准备
1、在输入@后,微信会弹出一个框,里面最多有42个联系人
微信非群管理员,我实现了@所有人 - HQ0731_冰凌汇编

微信非群管理员,我实现了@所有人 - HQ0731_冰凌汇编

   2、当你选择其中 一个后,其会在后面多出类似空格的东西,此外,@+群成员+类似空格的内容,组成了一个整体。
微信非群管理员,我实现了@所有人 - HQ0731_冰凌汇编

如果不符合以上要求,就不算真正意义上的@,其他人也收不到被@。
此外笔者发现,@+群成员+类似空格,其在其他地方粘贴后没有内容。
以上内容导致,笔者最终只能通过@,然后输入用户昵称,然后回车,而无其他更好更快捷的方式。

二、代码实现
   1、模块导入
[Python] 纯文本查看 复制代码
import subprocess
import uiautomation as auto
import time

subprocess用来打开微信页面,当然也可以使用time.sleep()设置足够找到需要@所有人的群的时间。
   
   2、获取微信群聊群成员昵称
微信非群管理员,我实现了@所有人 - HQ0731_冰凌汇编

首先点击群聊右上角的三个点,然后如果有查看更多的话,需要点击,这样才能显示所有群成员昵称
[Python] 纯文本查看 复制代码
# ToDo 这里需要更改微信所在地址,可通过桌面微信图标右键打开文件所在的位置查找到路径
subprocess.Popen('E:\微信\WeChat\WeChat.exe')
# 获取微信窗体对象
wechatWindow = auto.WindowControl(Name='微信', ClassName="WeChatMainWndForPC")
b = wechatWindow.ButtonControl(Name='聊天信息')
b.Click()
b2 = wechatWindow.ButtonControl(Name='查看更多')
if b2.Exists():
    b2.Click()

微信非群管理员,我实现了@所有人 - HQ0731_冰凌汇编

聊天成员下就是群成员昵称了。
[Python] 纯文本查看 复制代码
# SessionChatRoomDetailWnd = auto.WindowControl(Name='SessionChatRoomDetailWnd', className="SessionChatRoomDetailWnd")
# men_list = SessionChatRoomDetailWnd.ListControl(Name='聊天成员')
# 以上两行尽量改为这行
men_list = wechatWindow.ListControl(Name='聊天成员')
# print(len(men_list.GetChildren()))
c = []
for mem in men_list.GetChildren():
    # print(mem.Name)
    if mem.Name == '添加' or mem.Name == '删除':
        pass
    else:
        c.append(mem.Name)
print(c)
print(len(c))

这里我们一步一步的获取到昵称,然后放到列表中。
注意:群成员中会有添加或者删除的,我们不要获取。

当然这里笔者把自己也算进去了,大家可以自己在那个判断里面加上
or mem.Name == '自己的群昵称'。如下
[Python] 纯文本查看 复制代码
if mem.Name == '添加' or mem.Name == '删除' or mem.Name == 'knighthood2001':

3、逐一艾特
[Python] 纯文本查看 复制代码
ChatContactMenu = wechatWindow.PaneControl(Name='ChatContactMenu', ClassName='ChatContactMenu')

这是打出@后的框的对象。
接下来,我们需要点击一下输入框,方便后续输入
[Python] 纯文本查看 复制代码
ChatContactMenu = wechatWindow.PaneControl(Name='ChatContactMenu', ClassName='ChatContactMenu')
edit = wechatWindow.EditControl(Name='输入')
edit.Click(50, 50)

刚开始,笔者写了以下代码,后来发现交互功能太差了,根本不知道艾特到第几个了,因此进行更改。
[Python] 纯文本查看 复制代码
'''1'''
for i in c:
    edit.SendKeys('@')
    edit.SendKeys(i)
    # 回车发送消息
    if ChatContactMenu.Exists():
        wechatWindow.SendKeys('{Enter}')
        print('成功艾特:', i)
    else:
        print('                  {}:艾特失败'.format(i))
        continue
# time.sleep(1)
# wechatWindow.SendKeys('{Enter}')

以下就是进行更改的内容
[Python] 纯文本查看 复制代码
'''2'''
fail = ''
for i, v in enumerate(c):
    edit.SendKeys('@')
    edit.SendKeys(v)
    # 判断@框是否出现
    if ChatContactMenu.Exists():
        wechatWindow.SendKeys('{Enter}')
        print('{}/{}成功艾特:'.format(i+1, len(c)), v)
    else:
        print('{}/{}                  {}:艾特失败'.format(i+1, len(c), v))
        fail += "{} ".format(v)
        continue
print("艾特失败:", fail)
# time.sleep(1)
# wechatWindow.SendKeys('{Enter}')

其中fail存放的是艾特失败的人,使用enumera函数,获取列表中元素下标。
注意:uiautomation中的SendKeys()函数的功能和鼠标键入一样,而不是粘贴。粘贴群成员名称在这里是不会跳出@框的。

接下来,我们要判断输入的内容是否会弹出@框,如果没有,我们就判断为没有艾特成功,并将其存在fail中。
由于笔者能力有限,对于表情包,其有些会进行unicode转换,导致从c列表中那个提取后,有些表情显示不出,而是很多个空格,这样也就导致了昵称输入不对,没有出现@框。
微信非群管理员,我实现了@所有人 - HQ0731_冰凌汇编

如上图,这里的CN表示的是中国国旗,但是表情包存储之间的方式,笔者仍在努力尝试。
因此,要彻底解决@所有人,需要去了解微信表情包存储相关知识。

微信非群管理员,我实现了@所有人 - HQ0731_冰凌汇编

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

[Python] 纯文本查看 复制代码
time.sleep(1)
wechatWindow.SendKeys('{Enter}')

这样就大致实现了@所有人,也具有良好的交互功能。
四、结尾
以上内容,有些可能不是那么完善,比如群聊@自己,如何把这一点排除在外,有待思考。
关于uiautomation模块自动化,笔者觉得非常有趣,可玩性极高,大家可以自己去试试
冰凌汇编免责声明
以上内容均来自网友转发或原创,如存在侵权请发送到站方邮件9003554@qq.com处理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|站点统计|Archiver|小黑屋|RSS|冰凌汇编 ( 滇ICP备2022002049号 滇公网安备 53032102000029号)|网站地图

GMT+8, 2022-9-25 05:58 , Processed in 0.127752 second(s), 8 queries , Redis On.

冰凌汇编 - 建立于2021年12月20日

Powered by Discuz! © 2001-2022 Comsenz Inc.

快速回复 返回顶部 返回列表