问题描述
在飞书平台推送包含文字和图片的混合消息时,实际只发送图片,文字内容被吞。
问题出在 astrbot/core/platform/sources/lark/lark_event.py 的 _convert_to_lark 方法(约 L240-L244):
ret = []
_stage = [] # 缓冲文字段落
for comp in message.chain:
if isinstance(comp, Plain):
_stage.append({"tag": "md", "text": comp.text})
elif isinstance(comp, AstrBotImage):
# ... 上传图片得到 image_key ...
ret.append(_stage) # ← 按引用入队(非拷贝)
ret.append([{"tag": "img", "image_key": image_key}])
_stage.clear() # ← 原地清空,同时清空已入队的文字段
ret.append(_stage) 将 _stage 列表对象按引用加入 ret,而非拷贝。随后的 _stage.clear() 会原地清空该列表,导致刚刚入队的文字段同时变为空列表。最终构造的飞书 post 消息内容变成:
{"zh_cn": {"title": "", "content": [[], [{"tag": "img", "image_key": "..."}]]}}
飞书客户端渲染时跳过空段落,用户只看到图片。
修复方案:
将引用入队改为快照拷贝:
if _stage:
ret.append(list(_stage)) # 快照拷贝,避免后续 clear 影响已入队内容
_stage.clear()
ret.append([{"tag": "img", "image_key": image_key}])
如何复现?
1.配置飞书(Lark)平台适配器并启动 AstrBot
2.通过任意方式(插件、AI 回复等)向飞书会话发送一条包含文字和图片的消息
3.观察飞书客户端:只收到图片,文字内容丢失
AstrBot 版本
v4.27.4
操作系统
Linux
部署方式
uv
使用的消息平台适配器
lark(飞书)
错误日志
辅助信息
No response
检查清单
问题描述
在飞书平台推送包含文字和图片的混合消息时,实际只发送图片,文字内容被吞。
问题出在 astrbot/core/platform/sources/lark/lark_event.py 的 _convert_to_lark 方法(约 L240-L244):
ret.append(_stage) 将 _stage 列表对象按引用加入 ret,而非拷贝。随后的 _stage.clear() 会原地清空该列表,导致刚刚入队的文字段同时变为空列表。最终构造的飞书 post 消息内容变成:
飞书客户端渲染时跳过空段落,用户只看到图片。
修复方案:
将引用入队改为快照拷贝:
如何复现?
1.配置飞书(Lark)平台适配器并启动 AstrBot
2.通过任意方式(插件、AI 回复等)向飞书会话发送一条包含文字和图片的消息
3.观察飞书客户端:只收到图片,文字内容丢失
AstrBot 版本
v4.27.4
操作系统
Linux
部署方式
uv
使用的消息平台适配器
lark(飞书)
错误日志
辅助信息
No response
检查清单