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:
Binary file not shown.
@@ -78,27 +78,39 @@ class FeishuLongConnService:
|
||||
content = message.content
|
||||
sender = event.sender
|
||||
|
||||
# 获取发送者ID和群信息(优先 open_id,user_id 可能为 None)
|
||||
sender_open_id = getattr(sender.sender_id, 'open_id', '') or ''
|
||||
sender_user_id = getattr(sender.sender_id, 'user_id', '') or ''
|
||||
sender_id = sender_user_id or sender_open_id or 'unknown'
|
||||
# 获取发送者ID和群信息
|
||||
sender_id_obj = sender.sender_id
|
||||
# 调试:打印 sender 对象的所有属性
|
||||
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:
|
||||
tenant_key = "unknown"
|
||||
|
||||
# 获取发送者姓名(用 open_id 查询,不需要 contact 权限)
|
||||
sender_name = sender_id
|
||||
try:
|
||||
from src.integrations.feishu_service import FeishuService
|
||||
fs = FeishuService()
|
||||
id_for_query = sender_open_id or sender_user_id
|
||||
id_type = 'open_id' if sender_open_id else 'user_id'
|
||||
if id_for_query:
|
||||
user_info = fs.get_user_info(id_for_query, id_type=id_type)
|
||||
sender_name = user_info.get('name') or user_info.get('en_name') or sender_id
|
||||
except Exception as e:
|
||||
logger.warning(f"获取发送者信息失败: {e}")
|
||||
# 获取发送者姓名
|
||||
sender_name = f"用户_{sender_id[-8:]}" if len(sender_id) > 8 else sender_id
|
||||
if sender_open_id:
|
||||
try:
|
||||
from src.integrations.feishu_service import FeishuService
|
||||
fs = FeishuService()
|
||||
user_info = fs.get_user_info(sender_open_id, id_type='open_id')
|
||||
sender_name = user_info.get('name') or user_info.get('en_name') or sender_name
|
||||
except Exception as e:
|
||||
logger.debug(f"获取发送者姓名失败: {e}")
|
||||
|
||||
# 详细日志记录
|
||||
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}")
|
||||
|
||||
# 获取发送者ID
|
||||
sender_id = sender.sender_id.user_id
|
||||
|
||||
# 构造会话用户ID(群聊隔离)
|
||||
# 格式: feishu_群聊ID_用户ID
|
||||
session_user_id = f"feishu_{chat_id}_{sender_id}"
|
||||
|
||||
logger.info(f"🔑 会话标识: {session_user_id}")
|
||||
|
||||
Reference in New Issue
Block a user