feat:识别群昵称

This commit is contained in:
2025-12-23 16:46:41 +08:00
parent cc250e1f1e
commit 2c564d2870
6 changed files with 320 additions and 15 deletions

View File

@@ -600,7 +600,7 @@ class WechatHookClient:
async def get_chatroom_members(self, chatroom_id: str) -> List[Dict]:
"""
获取群成员列表(使用协议 API
获取群成员列表(优先 11032失败则降级协议 API
Args:
chatroom_id: 群聊 ID
@@ -608,6 +608,25 @@ class WechatHookClient:
Returns:
群成员列表,每个成员包含: wxid, nickname, display_name, avatar
"""
# 方案1type=11032包含 display_name=群内昵称/群名片)
try:
raw_members = await self._get_chatroom_members_via_11032(chatroom_id, timeout=6)
if raw_members:
members = []
for m in raw_members:
members.append(
{
"wxid": m.get("wxid", ""),
"nickname": m.get("nickname", ""),
"display_name": m.get("display_name", ""),
"avatar": m.get("avatar", ""),
}
)
logger.success(f"获取群成员成功(11032): {chatroom_id}, 成员数: {len(members)}")
return members
except Exception as e:
logger.debug(f"11032 获取群成员失败,降级协议 API: {chatroom_id}, {e}")
# 生成唯一请求ID
request_id = str(uuid.uuid4())
@@ -633,6 +652,41 @@ class WechatHookClient:
return members
async def _get_chatroom_members_via_11032(self, chatroom_id: str, timeout: int = 10) -> List[Dict]:
"""
获取群成员信息type=11032返回原始 member_list
请求:
type=11032
data={"room_wxid": chatroom_id}
"""
request_id = str(uuid.uuid4())
event = asyncio.Event()
result_data = {"members": [], "success": False}
request_key = f"chatroom_members_{chatroom_id}"
self.pending_requests[request_key] = {
"request_id": request_id,
"event": event,
"result": result_data,
"type": "chatroom_members",
"chatroom_id": chatroom_id,
}
try:
await self._send_data_async(11032, {"room_wxid": chatroom_id})
logger.info(f"请求群成员信息(11032): {chatroom_id}, request_id: {request_id}")
await asyncio.wait_for(event.wait(), timeout=timeout)
if result_data.get("success"):
return result_data.get("members") or []
return []
except asyncio.TimeoutError:
logger.debug(f"获取群成员信息(11032)超时: {chatroom_id}")
return []
finally:
# 清理请求
self.pending_requests.pop(request_key, None)
async def _wait_for_chatroom_info(self, chatroom_id: str, timeout: int = 15) -> List[Dict]:
"""等待群信息回调type=11174"""
request_key = f"chatroom_info_{chatroom_id}"
@@ -1083,17 +1137,28 @@ class WechatHookClient:
logger.info(f"收到群成员信息响应: group_wxid={group_wxid}, 成员数={len(member_list)}")
# 查找对应的待处理请求
if group_wxid in self.pending_requests:
request_info = self.pending_requests[group_wxid]
# 存储结果数据
# 查找对应的待处理请求(兼容不同 key 方案)
request_info = None
key_candidates = []
if group_wxid:
key_candidates.extend([group_wxid, f"chatroom_members_{group_wxid}"])
for k in key_candidates:
if k in self.pending_requests:
request_info = self.pending_requests[k]
break
# 最后兜底:按类型/目标群匹配
if request_info is None and group_wxid:
for _, info in list(self.pending_requests.items()):
if info.get("type") == "chatroom_members" and info.get("chatroom_id") == group_wxid:
request_info = info
break
if request_info:
request_info["result"]["members"] = member_list
request_info["result"]["success"] = True
# 触发等待事件
request_info["event"].set()
logger.success(f"群成员信息处理完成: {group_wxid}")
else:
logger.warning(f"未找到对应的群成员请求: {group_wxid}")