claw-lark Patches

自动重应用飞书插件自定义补丁,修复更新后功能失效问题。

已扫描
适合谁
飞书机器人开发者、需要自定义消息路由的企业管理员
不适合谁
无技术背景的普通用户、不使用飞书插件的个人用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @pengxiao-wang/claw-lark-patches

Skill 说明

命令、参数、文件名以原文为准

claw-lark 补丁

claw-lark 是一个编译后的插件——我们直接修改 dist 文件。每次插件更新都会清除这些补丁。 本技能文档详细说明了需要修改的内容,并提供自动应用脚本。

快速应用

bash scripts/apply-patches.sh

然后重启网关:openclaw gateway restart

补丁概览

共修改四个文件:

  1. channel.js — 消息目标解析(目标 ID 识别) + 外部账户解析
  2. monitor.js — requireMention 过滤 + deliver 回调中的回复到线程
  3. provider.js — sendTextMessage 中的回复到线程
  4. send.js — SDK 回复调用中的 reply_in_thread

补丁详情

0. channel.js — 目标解析 + 账户解析(2026-02-22)

问题 1message(send, lark, "oc_xxx") 返回 "未知目标",因为 claw-lark 缺少 messaging.targetResolver.looksLikeId。核心无法识别 oc_/ou_/on_ 为有效 ID,会降级到目录查找,导致失败。

修复:在 larkPlugin 导出中添加 messaging 属性:

  • ./utils.js 导入 looksLikeLarkId, normalizeLarkTarget
  • 添加 messaging.targetResolver.looksLikeId,使用现有的 looksLikeLarkId()
  • 添加 messaging.normalizeTarget,使用现有的 normalizeLarkTarget()

问题 2outbound.sendText 从核心获取 { cfg, to, accountId },但期望的是 { account, recipientId }account 对象为 undefined → "Cannot read properties of undefined (reading 'appId')"

修复:所有 5 个外部方法(sendText, sendMedia, downloadMedia, addReaction, removeReaction)均添加:

const account = args.account ?? resolveAccount(args.cfg, args.accountId ?? "default");
const recipientId = args.recipientId ?? args.to;

1. monitor.js — requireMention 过滤

位置routeMessage() 函数中,parseMessage(event) 和日志行之后。

作用:在群聊中,跳过未 @ 到机器人的问题。

关键信息

  • event.message 是正确路径(不是 event.event.message
  • Lark Webhook 的 message.mentions 包含提及数据,其中 id.open_id 为提及对象的 open_id
  • 机器人的 open_id:通过运行 apply-patches.sh 时设置的 BOT_OPEN_ID 环境变量
  • 所有机器人均无 user_id(空字符串)——不能用 !user_id 判断“是否是我”
  • @_user_N 文本占位符对所有被提及的机器人出现,不要用正则匹配判断是否是自己
  • 备用方案:若 mentions 数组为空,检查 parsed.text.includes("@" + BOT_NAME)(通过 BOT_NAME 环境变量设置)

2. monitor.js — 回复到线程(deliver 回调)

位置dispatchReplyWithBufferedBlockDispatcher 的 deliver 回调内部。

作用

  • 设置 replyToId = payload.replyToId || parsed.threadId || parsed.messageId(确保始终有值)
  • 使用 client.im.message.reply() 并设置 reply_in_thread: true,而非使用 client.im.message.create() 并设置 root_id

关键信息

  • root_id 在 create 时仅用于关联已有线程,不会创建新线程
  • reply_in_thread: true 在 reply API 中可创建新线程
  • 在点对点和群聊中均有效

3. provider.js — sendTextMessage 线程回复

位置sendTextMessage() 函数中。

作用:当提供 threadId 时,使用 client.im.message.reply() 而非 client.im.message.create()

4. send.js — SDK 回复中的 reply_in_thread

位置sendMessageLark()sendCardLark() 的回复分支中。

作用:在 client.im.message.reply() 调用的数据对象中添加 reply_in_thread: true

验证

应用补丁并重启网关后:

  1. 发送一条群聊消息,不 @ 机器人 → 应静默忽略
  2. 发送一条群聊消息,@ 机器人 → 应在子线程中回复
  3. 发送一条私聊消息 → 应在子线程中回复
  4. @ 其他机器人 → 应静默忽略

参考

  • references/patch-details.md — 每个补丁的完整代码差异
PW
@pengxiao-wang

已收录 1 个 Skill

相关推荐