Skip to content

feat(lark): 支持 im.message.recalled_v1 消息撤回事件转换为 message-deleted - #447

Open
VincentZyu233 wants to merge 1 commit into
satorijs:mainfrom
VincentZyu233:fix/lark-recalled-event
Open

VincentZyu233 wants to merge 1 commit into
satorijs:mainfrom
VincentZyu233:fix/lark-recalled-event

Conversation

@VincentZyu233

@VincentZyu233 VincentZyu233 commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

📝 变更概述

本 PR 为飞书适配器 (@satorijs/adapter-lark) 增加了对飞书消息撤回事件 (im.message.recalled_v1) 的支持,并将其规范转换为 Satori 标准的 message-deleted 会话事件。

🔍 背景与实现细节

  • 飞书官方开放平台事件文档:接收消息撤回 (im.message.recalled_v1)
  • 当用户在飞书客户端撤回消息时,飞书网关会推送 event_type: "im.message.recalled_v1" 事件。
  • 此前在 adapters/lark/src/utils.ts 的 adaptSession 中未处理该事件类型,导致下游插件和 Koishi 生态无法监听到飞书平台的 message-deleted 事件。
  • 改动内容:
    1. 在 Events 接口中补充 im.message.recalled_v1 事件的数据结构定义;
    2. 在 adaptSession 中增加 im.message.recalled_v1 的映射分支,将 session.type 设置为 'message-deleted';
    3. 规范解析并填充以下会话字段:
      • session.messageId:对应 body.event.message_id(真实被撤回的消息 ID);
      • session.channelId 与 session.guildId:对应 body.event.chat_id;
      • session.userId:优先取操作者 open_id(body.event.operator_id?.open_id || body.event.sender_id?.open_id);
      • session.isDirect:当 body.event.chat_type === 'p2p' 时为 true,否则为 false;
      • session.timestamp:对应 +body.event.recall_time。

🧪 实测验证

  • 在飞书单聊 (p2p) 与群聊环境下均完成实测验证;
  • 下游插件监听 ctx.on('message-deleted') 能够准确实时捕获被撤回的消息 ID 并联动处理。

- Add im.message.recalled_v1 event structure to Events interface
- Adapt im.message.recalled_v1 to Satori session.type = 'message-deleted'
- Populate session.messageId, channelId, guildId, userId, isDirect, and timestamp

Co-authored-by: gemini-code-assist <200291788+gemini-code-assist@users.noreply.github.com>
@VincentZyu233 VincentZyu233 changed the title feat(lark): support im.message.recalled_v1 message-deleted event feat(lark): 支持 im.message.recalled_v1 消息撤回事件转换为 message-deleted Nov 5, 2026
@VincentZyu233

VincentZyu233 commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor Author

🎬 飞书实机实测有效性验证与动图演示

本 PR 的改动已在飞书官方客户端(桌面端单聊与群聊场景)完成全流程实测验证:

  • 实测环境与插件:koishi-plugin-let-me-quote-and-recall
  • 测试动作:用户发送 dev 触发指令 ➔ Bot 正常回复并添加引用 dev! ➔ 用户在右键菜单中点击“撤回” ➔ 飞书下发 im.message.recalled_v1 事件 ➔ 成功转换为标准 Satori message-deleted 事件 ➔ 下游插件成功捕获并秒级联动撤回了对应的回复消息。
  • 动图演示(600×600 高清 1:1 实机录屏):

Lark 联动撤回实测动图演示


⚙️ 飞书开放平台后台配置指引(开发者配置要求)

在飞书平台使用消息撤回感知能力,需要在 飞书开放平台开发者后台 完成以下两项配置:

  1. 添加事件订阅:
    • 登录开发者后台 ➔ 进入对应 Bot 应用 ➔ 开发配置 ➔ 事件与回调 ➔ 事件配置;
    • 点击“添加事件”,搜索并添加 接收消息撤回 (im.message.recalled_v1)。
  2. 开通必要权限并发布版本:
    • 在 权限管理 中确认拥有 获取与发送单聊、群组消息 (im:message) 权限;
    • ⚠️ 重要:飞书的权限与事件配置变更必须创建新版本并申请发布后才会正式在网关生效下发。

@VincentZyu233
VincentZyu233 marked this pull request as ready for review November 5, 2026 01:50
@MaikoTan
MaikoTan requested a balanced review from Copilot November 6, 2026 03:06

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Private-message recalls are misclassified because the payload lacks chat_type, causing downstream private-message filters to miss deletions; chat_mode should be resolved through a chat lookup.

1 open issue
What changed in this PR

本 PR 为飞书适配器增加消息撤回事件转换,使下游 Satori/Koishi 插件能够通过 message-deleted 监听撤回通知。

Changes:

  • 补充 im.message.recalled_v1 事件类型定义。
  • 新增撤回事件处理分支,映射消息、会话、用户及时间戳等字段。
File Description
adapters/​lark/​src/​utils.ts 定义撤回事件数据结构,并将其转换为标准 message-deleted 会话事件。

Review effort: Balanced

session.channelId = body.event.chat_id
session.guildId = body.event.chat_id
session.userId = body.event.operator_id?.open_id || body.event.sender_id?.open_id
session.isDirect = body.event.chat_type === 'p2p'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants