feat:识别群昵称
This commit is contained in:
@@ -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
|
||||
"""
|
||||
# 方案1:type=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}")
|
||||
|
||||
Reference in New Issue
Block a user