diff --git a/app/core/wecomclient.py b/app/core/wecomclient.py index d1bcaad..9823b9c 100644 --- a/app/core/wecomclient.py +++ b/app/core/wecomclient.py @@ -205,8 +205,11 @@ class WecomClient: # 获取群聊信息 chat_info = await self.get_external_chat_info(chat_id) if not chat_info: + logger.warning(f"无法获取群聊信息: {chat_id}") return False + logger.info(f"获取到群聊信息: {chat_info}") + # 保存群聊信息 chat_db = db.query(WecomExternalChatDB).filter(WecomExternalChatDB.chat_id == chat_id).first() if not chat_db: @@ -236,13 +239,16 @@ class WecomClient: # 获取外部联系人详情 user_info = None if member_type == "EXTERNAL": - user_info = await self.get_external_contact_info(user_id) + try: + user_info = await self.get_external_contact_info(user_id) + except Exception as e: + logger.warning(f"获取外部联系人信息失败: {user_id}, 错误: {str(e)}") member_create = WecomExternalChatMemberCreate( chat_id=chat_id, user_id=user_id, type=member_type, - name=user_info.get("name") if user_info else None, + name=user_info.get("name") if user_info else member.get("name", "未知"), unionid=user_info.get("unionid") if user_info else None ) member_db = WecomExternalChatMemberDB(**member_create.model_dump()) @@ -280,22 +286,46 @@ class WecomClient: ).first() if not member_db: - # 判断是内部成员还是外部联系人 + # 尝试获取群聊成员信息来确定成员类型 member_type = "EXTERNAL" # 默认为外部联系人 + member_name = None + user_info = None - # 获取外部联系人详情 - user_info = await self.get_external_contact_info(join_user_id) + # 获取群聊详情,查找成员类型 + try: + chat_info = await self.get_external_chat_info(chat_id) + if chat_info and "member_list" in chat_info: + for member in chat_info["member_list"]: + if member.get("userid") == join_user_id: + member_type = member.get("type", "EXTERNAL") + member_name = member.get("name") + logger.info(f"从群聊详情中确定成员类型: {member_type}, 成员: {join_user_id}") + break + except Exception as e: + logger.warning(f"获取群聊详情失败: {str(e)}") + + # 如果确定是外部联系人,尝试获取详情 + if member_type == "EXTERNAL": + try: + user_info = await self.get_external_contact_info(join_user_id) + if user_info: + member_name = user_info.get("name") + logger.info(f"获取到外部联系人详情: {member_name}") + except Exception as e: + logger.warning(f"获取外部联系人信息失败,可能是内部成员: {str(e)}") + # 如果获取失败但在群聊详情中找到了,则使用群聊详情中的信息 member_create = WecomExternalChatMemberCreate( chat_id=chat_id, user_id=join_user_id, type=member_type, - name=user_info.get("name") if user_info else None, + name=member_name, unionid=user_info.get("unionid") if user_info else None ) member_db = WecomExternalChatMemberDB(**member_create.model_dump()) db.add(member_db) db.commit() + # 更新群成员数量 if chat_db: @@ -349,6 +379,8 @@ class WecomClient: return False except Exception as e: logger.error(f"处理群聊变更事件异常: {str(e)}") + import traceback + logger.error(traceback.format_exc()) if 'db' in locals(): db.close() return False diff --git a/jobs.sqlite b/jobs.sqlite index f5886f9..628cfce 100644 Binary files a/jobs.sqlite and b/jobs.sqlite differ