Skip to content

新增群聊消息发送者识别与成员管理功能 #13

Open
yeafel666 wants to merge 12 commits intoclaw-codes:mainfrom
yeafel666:main
Open

新增群聊消息发送者识别与成员管理功能 #13
yeafel666 wants to merge 12 commits intoclaw-codes:mainfrom
yeafel666:main

Conversation

@yeafel666
Copy link
Copy Markdown
Contributor

@yeafel666 yeafel666 commented Apr 11, 2026

啊~ 好累, 思考了很久,实现了很久,也测试了很久。
给群聊监听功能添加上识别发送者的昵称和微信id,以便能否区分不同的消息是谁发送的。

初衷是这样的,今天我把微信群聊监听机制接入自己的龙虾,那么问题来了,虽然可以自动回复群聊,但是其实就是单纯的使用配置的大模型的。然后呢,我就把每个微信群的聊天记录接入我的记忆系统,让微信监听到某位群友进行自动回复的时候可以先扫描之前的记忆,特别是他自己说过的话,这样可以更好的更有针对性的回复他(调侃他),会觉得很好玩,而且呢,这套系统也能够越用越让我的智能体更懂我的每个群,乃至于每一位群友,让它更像是我的数字分身,让它更了解我身边的人。

但是,问题来了,目前微信4.x在当前机制下,收到消息时无法获取到发送者是谁,那还谈何分类记忆,如何记忆哪句话是谁说的? 如何让它下次回复这位群友的时候搜索这位群友以前说过的话?所以就有了这次的提交。

效果实图:(初步实现肯定还有没发现的BUG,希望这一步能够抛砖引玉吧)
本次运行需要把requirements.txt新增的包安装上。 环境问题解决后直接运行listen_with_sender_info.py就可以测试。
用小号发消息:
Snipaste_2026-04-12_03-01-05

用当前登录的账号发消息(会声明是 “自己”,且不需要记录自己的微信id):
Snipaste_2026-04-12_03-07-02

啊,好困~ 晚安了。

…的问题, 新增通过托盘图标唤醒隐藏的微信窗口

- 新增 _try_wake_and_retry_uia 方法,通过托盘图标点击激活微信窗口
- 解决微信隐藏到托盘时 Qt 辅助功能树不可访问问题
- 引入 activate_wechat_via_tray_icon 方法,使用 UIA 访问系统通知区域托盘图标
- 优化 bring_window_to_front 逻辑,支持窗口隐藏状态恢复显示
- 在 UIA 健康检查中调用唤醒方法,减少重启微信频率
- 保持兼容隐藏任务栏工具,提升无障碍辅助功能的稳定性
- 确保窗口在Win32层面隐藏以正确处理托盘图标toggle行为
- 增加托盘图标唤醒尝试次数和异常捕获,提升唤醒稳定性
- 唤醒后重新查找微信窗口句柄以处理新窗口创建情况
- 延长UIA健康检查重试次数和间隔,支持Qt恢复辅助功能树
- 防止窗口被错误激活到前台,避免干扰托盘唤醒流程
- 改进登录界面判定逻辑,确保自动点击“进入微信”按钮完成登录
- 新增 _purge_ghost_tray_icons 方法,模拟鼠标移动触发系统自动清理
- 在唤醒微信托盘图标前先调用幽灵图标清理,避免点击失效图标
- 优化 activate_wechat_via_tray_icon 函数,增加托盘图标触发的多种尝试方式
- 精确限制微信图标查找范围,避免匹配到任务栏按钮
- 清理主通知区域和溢出区的失效图标,提升托盘交互的稳定性
# Conflicts:
#	src/core/window.py
- 新增 MemberRegistry 类,实现群成员昵称与微信ID的注册表管理
- 支持从文件加载和保存群成员信息,支持模糊匹配昵称查找微信ID
- WeChatGroupListener 监听器新增 member_registry 参数,支持发送者识别关联
- 新增解析消息Name属性的parse_message_name,提取发送者昵称和消息内容
- 实现消息事件MessageEvent增加sender_name和sender_wxid属性
- 增加多个示例脚本:群聊消息监听与发送者信息识别、群成员自动管理、OCR使用示例及OCR发送者识别测试
- 添加截图相关功能支持包括窗口区域截屏和PrintWindow全窗口静默截图
- 优化微信窗口查找逻辑,支持独立聊天窗口标题模糊匹配和排除主窗口干扰
- 整体提升微信群消息发送者识别准确度,解决UI自动化无法直接获取发送者微信ID问题
@claw-codes
Copy link
Copy Markdown
Owner

辛苦啦!我也尝试着写了一个方案来着,发现识别不够精准,然后想改用OCR,但是考虑到监听多个群的时候,OCR可能会成为识别的瓶颈,我先测试看看,感谢感谢

@claw-codes
Copy link
Copy Markdown
Owner

测试下来ocr速度挺快的。不过我在测试下来发现AI不会回复被艾特的消息了。排查发现你这边的代码少了两个步骤,

1、监听窗口的时候,读取群昵称。读取群昵称是为了记录下来,用于监听被艾特的消息。

2、在消息处理后,缺少了 @的前缀了。如图:

image

下面这里是用来判断是否被艾特的代码片段,可以看到缺少了群昵称的数据
image

@yeafel666
Copy link
Copy Markdown
Contributor Author

yeafel666 commented Apr 12, 2026

我测试了下确实是的,@的消息不回复了,我昨天光顾着测试识别这一块去了。 然后现在还有个问题就是如果搞个多群聊监听的情况下,在打开第一个群聊的独立窗口并且把该群的所有成员都注册到json中去之后,再开第二个群聊时会一直报“尝试通过原生托盘消息恢复微信窗口” 这个错(也不算是错,但是它会一直反复弹这个日志,其实主界面是弹出来了),也就是说只要有独立窗口存在时,再运行群聊监听程序去打开微信主窗口时现在会反复报这个日志。

@claw-codes
Copy link
Copy Markdown
Owner

我测试了下确实是的,@的消息不回复了,我昨天光顾着测试识别这一块去了。 然后现在还有个问题就是如果搞个多群聊监听的情况下,在打开第一个群聊的独立窗口并且把该群的所有成员都注册到json中去之后,再开第二个群聊时会一直报“尝试通过原生托盘消息恢复微信窗口” 这个错(也不算是错,但是它会一直反复弹这个日志,其实主界面是弹出来了),也就是说只要有独立窗口存在时,再运行群聊监听程序去打开微信主窗口时现在会反复报这个日志。

是的,不过你说的第二种情况,我主分支上测试过三个群同时监听,没出现过这样的情况。

@yeafel666
Copy link
Copy Markdown
Contributor Author

我测试了下确实是的,@的消息不回复了,我昨天光顾着测试识别这一块去了。 然后现在还有个问题就是如果搞个多群聊监听的情况下,在打开第一个群聊的独立窗口并且把该群的所有成员都注册到json中去之后,再开第二个群聊时会一直报“尝试通过原生托盘消息恢复微信窗口” 这个错(也不算是错,但是它会一直反复弹这个日志,其实主界面是弹出来了),也就是说只要有独立窗口存在时,再运行群聊监听程序去打开微信主窗口时现在会反复报这个日志。

是的,不过你说的第二种情况,我主分支上测试过三个群同时监听,没出现过这样的情况。

是的,主分支没有问题,可能是我这边改出问题了,留了BUG。 2333

@claw-codes
Copy link
Copy Markdown
Owner

了解了,可别熬夜了,身体是革命的本钱

@yeafel666
Copy link
Copy Markdown
Contributor Author

了解了,可别熬夜了,身体是革命的本钱

嗯嗯,谢谢关心, 今天好好休息下。

- 启用自动回复及@判断,改善消息响应能力
- 修复窗口管理,避免操作主窗口时频繁触发托盘恢复循环
- 启动阶段先关闭所有独立窗口,确保主窗口操作稳定
- 统一读取群昵称,提升@消息识别准确性
- 优化群成员自动注册逻辑,校验成员数量一致性以防数据过期
- 新增确保主窗口可见方法,最小化所有独立窗口避免窗口隐藏问题
- 改进OCR发送者昵称识别算法,增加多种匹配与过滤策略
- 通过窗口坐标及OCR结果判断消息发送者,区分自己与他人消息
- OCR完成后若窗口原本最小化,恢复最小化状态防止界面异常
- 增强@消息内容归一化处理,提高@自身判断准确度
- 添加详细日志记录,便于调试发送者识别及窗口管理过程
- 将监听群聊从单个改为多个,支持同时监听多个群聊
- 优化群成员加载统计,显示所有群成员总数
- 调整窗口优先级评分,区分主窗口和独立窗口
- 关闭独立窗口后确保主窗口可见,避免界面隐藏问题
- 启动阶段批量注册所有群成员,提升初始化效率
- 批量打开多个独立窗口进行监听,改进多群处理逻辑
- 主窗口不可见时主动激活并等待UI完全加载,保证操作稳定
- 在打开新聊天窗口前确保主窗口可见,解决微信隐藏主窗口问题
- 采用 OCR 识别消息发送者昵称,结合 MemberRegistry 映射微信ID
- 修正消息匹配算法,优先选择左侧候选,避免误判自己消息
- 修改昵称查找逻辑,按消息左右位置匹配昵称区域
- 发送者判定时延后“自己”判断,增强识别准确率
- 添加群聊监听示例,配置多个监听群组支持
- 调整监听器参数,默认关闭自动回复示例更清晰
- 新增使用说明,展示发送者识别和 AI 自动回复整合方法
- 更新 README 和技能文档,增加发送者识别的使用和注意事项详细说明
- 始终加载群昵称,确保 is_at_me 函数中能正确使用昵称判断@
- 去除群昵称两端空白,防止因空格导致匹配失败
- 支持识别半角 @ 和全角 @ 两种@符号形式
- 归一化消息内容中的不可见空格字符,提升匹配准确率
- 添加详细日志用于调试@消息匹配过程及字符编码情况
@yeafel666
Copy link
Copy Markdown
Contributor Author

以上问题修复完毕。

- 为查找会话项添加滚动到顶部选项,确保置顶群聊可见
- 在打开独立窗口时增加异常捕获,避免部分群聊失败导致整体中断
- 增加群聊窗口间等待时间,减少微信资源竞争
- 扩展 _ensure_subwindow 方法,新增最大重试次数参数以支持多次尝试
- 提升refactor(messaging): 优化独立聊天窗口打开逻辑和会话列表滚动

- 新增_find_session_item函数中滚动到顶部的功能,确保置顶群聊可见
- 为独立窗口打开过程添加异常捕获,打开失败时继续尝试其他群
- 在打开独立窗口时增加窗口间等待时间,减少微信资源竞争
- _ensure_subwindow函数支持最大重试机制,增强打开独立窗口的健壮性
- 重试时关闭可能的残留窗口,避免冲突
- 延长等待独立窗口打开的超时时间,提高成功率
- 优化日志输出,增强调试信息的详细程度
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants