fix: 长连接 sender_id 提取修复 + 去重复赋值

- 移除重复的 sender_id = sender.sender_id.user_id 赋值(会覆盖已修复的值)
- 添加 sender_id 属性调试日志,方便排查 SDK 对象结构
- 优先用 open_id 构造会话标识,避免 user_id 为 None 的问题
- get_user_info 无权限时用 open_id 缩写作为标识
This commit is contained in:
2026-04-02 15:58:31 +08:00
parent eb127ed897
commit b7627927d4
2 changed files with 29 additions and 21 deletions

Binary file not shown.

View File

@@ -78,27 +78,39 @@ class FeishuLongConnService:
content = message.content content = message.content
sender = event.sender sender = event.sender
# 获取发送者ID和群信息(优先 open_iduser_id 可能为 None # 获取发送者ID和群信息
sender_open_id = getattr(sender.sender_id, 'open_id', '') or '' sender_id_obj = sender.sender_id
sender_user_id = getattr(sender.sender_id, 'user_id', '') or '' # 调试:打印 sender 对象的所有属性
sender_id = sender_user_id or sender_open_id or 'unknown'
try: try:
tenant_key = sender.sender_id.tenant_key sender_attrs = {k: getattr(sender_id_obj, k, None) for k in ['user_id', 'open_id', 'union_id'] if getattr(sender_id_obj, k, None)}
if not sender_attrs:
# 尝试 __dict__ 或 dir
sender_attrs = {k: v for k, v in vars(sender_id_obj).items() if v and not k.startswith('_')} if hasattr(sender_id_obj, '__dict__') else {}
logger.info(f"🔍 sender_id 属性: {sender_attrs}")
except Exception as e:
logger.warning(f"🔍 无法解析 sender_id 属性: {e}, type={type(sender_id_obj)}")
sender_attrs = {}
sender_open_id = getattr(sender_id_obj, 'open_id', '') or ''
sender_user_id = getattr(sender_id_obj, 'user_id', '') or ''
sender_union_id = getattr(sender_id_obj, 'union_id', '') or ''
sender_id = sender_open_id or sender_user_id or sender_union_id or 'unknown'
sender_type = getattr(sender, 'sender_type', 'user')
try:
tenant_key = sender_id_obj.tenant_key
except: except:
tenant_key = "unknown" tenant_key = "unknown"
# 获取发送者姓名(用 open_id 查询,不需要 contact 权限) # 获取发送者姓名
sender_name = sender_id sender_name = f"用户_{sender_id[-8:]}" if len(sender_id) > 8 else sender_id
try: if sender_open_id:
from src.integrations.feishu_service import FeishuService try:
fs = FeishuService() from src.integrations.feishu_service import FeishuService
id_for_query = sender_open_id or sender_user_id fs = FeishuService()
id_type = 'open_id' if sender_open_id else 'user_id' user_info = fs.get_user_info(sender_open_id, id_type='open_id')
if id_for_query: sender_name = user_info.get('name') or user_info.get('en_name') or sender_name
user_info = fs.get_user_info(id_for_query, id_type=id_type) except Exception as e:
sender_name = user_info.get('name') or user_info.get('en_name') or sender_id logger.debug(f"获取发送者姓名失败: {e}")
except Exception as e:
logger.warning(f"获取发送者信息失败: {e}")
# 详细日志记录 # 详细日志记录
chat_type_desc = '群聊(group)' if chat_type == 'group' else '私聊(p2p)' if chat_type == 'p2p' else chat_type chat_type_desc = '群聊(group)' if chat_type == 'group' else '私聊(p2p)' if chat_type == 'p2p' else chat_type
@@ -145,11 +157,7 @@ class FeishuLongConnService:
logger.info(f"✅ 清理后内容: {text_content}") logger.info(f"✅ 清理后内容: {text_content}")
# 获取发送者ID
sender_id = sender.sender_id.user_id
# 构造会话用户ID群聊隔离 # 构造会话用户ID群聊隔离
# 格式: feishu_群聊ID_用户ID
session_user_id = f"feishu_{chat_id}_{sender_id}" session_user_id = f"feishu_{chat_id}_{sender_id}"
logger.info(f"🔑 会话标识: {session_user_id}") logger.info(f"🔑 会话标识: {session_user_id}")