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
|
content = message.content
|
||||||
sender = event.sender
|
sender = event.sender
|
||||||
|
|
||||||
# 获取发送者ID和群信息(优先 open_id,user_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}")
|
||||||
|
|||||||
Reference in New Issue
Block a user