飞书 CLI `drive +react-reply` 实战:为文档评论回复添加与删除表情回应(Reaction)
CLIAI 技能【免费下载链接】cliThe official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 commands and 20 AI Agent Skills.项目地址https://gitcode.com/gh_mirrors/cli414/cli点击查看免费下载本文以 larksuite 官方飞书 CLIlark-cli云空间Drive技能中的react-reply快捷命令为线索完整讲解如何给 doc/docx/sheet/file/slides/basebitable/apps 等文档的评论回复添加或删除表情回应reaction。你将掌握--url/--token/--type三种目标定位方式、reply_id的获取与根回复即评论的语义、reaction_type枚举的本地校验规则、add/delete 的幂等行为以及读回 reaction 时对残留数据的过滤方法并结合仓库源码理解其底层 API 调用链与 wiki 解包逻辑。前置阅读本文依赖认证、全局参数与权限处理请先阅读共享技能文档 skills/lark-shared/SKILL.md。reaction 的查询规则、语义联想与完整reaction_type枚举是跨切面专题见 skills/lark-drive/references/lark-drive-reactions.md。一、命令概览一条命令完成加/删表情lark-cli drive react-reply是 Drive 评论家族comment/reply中的一个写操作快捷命令对应原生 API 为drive file.comment.reply.reactions update_reaction见 skills/lark-drive/SKILL.md 的 Shortcuts 表与 API Resources 一节。它的作用对象始终是reply_id——即某条评论下的某条回复而不是comment_id。# 加 reaction给指定 reply 添加一个点赞 lark-cli drive react-reply --url https://example.larksuite.com/docx/DOCX_TOKEN --reply-id id --emoji THUMBSUP --action add # 删除自己加的 reaction仍需传要删除的那个 --emoji lark-cli drive react-reply --url https://example.larksuite.com/docx/DOCX_TOKEN --reply-id id --emoji THUMBSUP --action delete删除时必须原样传入当初添加时使用的--emoji大小写敏感命令只取消当前身份自己加的那条 reaction。二、参数详解react-reply的完整参数如下源码定义见 shortcuts/drive/drive_react_reply.go 中DriveReactReply的Flags参数必填说明--url与--token二选一推荐入口。支持 doc/docx/sheet/file/slides/base/bitable/apps/wiki URLapps 妙搭 URL 使用/page/tokenwiki URL 会自动解析到真实文档。--token与--url二选一裸 token 或 URL。裸 token 必须搭配--typewiki token 使用--type wiki。--type裸 token 时必填传 token 对应类型doc、docx、sheet、file、slides、bitable、base、apps、wiki。wiki token 使用wiki传base时CLI 会按bitable类型处理。--reply-id是要操作的回复 ID来自drive list-replies的items[].reply_id。给这条评论加/删表情时取该评论根回复第一页items[0]的reply_id--emoji是reaction_type值大小写敏感本地按平台枚举校验。完整列表与语义映射见 skills/lark-drive/references/lark-drive-reactions.md--action是add添加delete删除当前身份自己加的 reaction2.1--url/--token/--type的目标解析机制从源码看这三个 flag 由driveCommentTargetFlags统一生成shortcuts/drive/drive_comment_common.go--url与--token互斥同时传会报错两者都为空也会报错specify --url or --token。传入 URL 时CLI 通过common.ParseResourceURL解析 URL 路径中的类型与 token如果同时传了--type且与 URL 路径类型不一致会直接报--type冲突错误。传入裸 token 时必须提供--type否则报错提示允许的类型集合。妙搭 apps URL/page/token形态有专门解析逻辑parseDriveListCommentsAppsURL。--type base会在内部通过normalizeDriveCommentType归一化为bitable因此base与bitable等价。2.2 支持的目标类型react-reply的driveCommentOp声明shortcuts/drive/drive_react_reply.go支持的类型为doc, docx, sheet, file, slides, bitable, apps同时任何类型的输入都接受 wikiwiki 会先解包到底层真实文档再落到上述 wire 类型。若传入folder等不支持类型会得到类似 reply reaction supports doc, docx, sheet, file, slides, bitable, base, apps, wiki 的校验错误测试用例见 shortcuts/drive/drive_react_reply_test.go 的TestDriveReactReplyValidation。三、reply_id从哪来先list-replies再定位--reply-id不是评论 ID而是回复 ID统一来自lark-cli drive list-replies的输出items[].reply_id。# 先拿到某条评论下的回复列表注意返回的 items[].reply_id lark-cli drive list-replies --url https://example.larksuite.com/docx/DOCX_TOKEN --comment-id comment_idlist-replies的关键行为见 skills/lark-drive/references/lark-drive-list-replies.md根回复承载评论正文本身是回复列表中创建最早的一条。仅第一页未传--page-token的items[0]是根回复一旦翻页传了--page-token返回的items[0]只是普通回复不要再按位置当作根回复去更新、删除或加 reaction。分页参数--page-size1-100默认 50、--page-tokenhas_moretrue时用返回的page_token续拉。判断回复归属更新/删除前比对items[].user_idopen_id与当前身份确认是不是自己创建的回复。items始终是 JSON 数组服务端省略时会被归一化为[]避免jq遍历.data.items[]时踩到null。因此给这条评论本身加/删表情的标准姿势是先list-replies不带--page-token取第一页用items[0]的reply_id作为--reply-id传给react-reply。四、reaction_type枚举大小写敏感本地校验是唯一防线--emoji接收的是平台定义的reaction_type枚举字符串大小写敏感如THUMBSUP与ThumbsDown是两种不同的混合大小写风格。4.1 为什么必须本地校验源码注释与文档一致地强调了一个关键事实服务端不校验reaction_type——任意字符串都会被接受并持久化成一条损坏的 reaction。因此react-reply --emoji会在本地按平台枚举做兜底校验parseDriveReactReplyEmoji见 shortcuts/drive/drive_react_reply.go这是唯一防线直接调原生命令如drive file.comment.reply.reactions update_reaction时没有这层校验必须自行保证取值合法。校验实现为driveReactReplyReactionTypesmap与平台元数据file.comment.reply.reactions.update_reaction的枚举保持一致。测试TestParseDriveReactReplyEmoji验证了THUMBSUP、ThumbsDown、Yes、2021等通过YES、heart、THUMBS_UP等大小写错误或下划线变体被拒绝。4.2 使用规则只能使用枚举列表中的值不要自由填写、不要根据自然语言临时编造、也不要改写大小写。mixed-case 值必须原样传如Yes、No、Get、EatingFood、CheckMark、CrossMark不要擅自改成全大写。用户给出自然语言语义如点赞在处理中确认一下时在下方枚举中选择语义最接近的现有值若是近似映射执行时应明确告知用户。4.3 常见语义联想reaction_type语义Yes确认 / 同意 / 批准No拒绝 / 不同意 / 否定DONE已完成 / 已处理Typing正在输入 / 正在处理中 / 正在跟进近似语义OK好的 / 收到 / 确认一下THUMBSUP点赞 / 认可LGTM看起来没问题 / 可以继续4.4 完整reaction_type列表以下枚举按当前 Drive 评论 reaction 指引维护skills/lark-drive/references/lark-drive-reactions.md与源码driveReactReplyReactionTypesmap 完全一致使用时保持原样ANGRY, APPLAUSE, ATTENTION, AWESOME, BEAR, BEER, BETRAYED, BIGKISS BLACKFACE, BLUBBER, BLUSH, BOMB, CAKE, CHUCKLE, CLAP, CLEAVER COMFORT, CRAZY, CRY, CUCUMBER, DETERGENT, DIZZY, DONE, DONNOTGO DROOL, DROWSY, DULL, DULLSTARE, EATING, EMBARRASSED, ENOUGH, ERROR EYESCLOSED, FACEPALM, FINGERHEART, FISTBUMP, FOLLOWME, FROWN, GIFT, GLANCE GOODJOB, HAMMER, HAUGHTY, HEADSET, HEART, HEARTBROKEN, HIGHFIVE, HUG HUSKY, INNOCENTSMILE, JIAYI, JOYFUL, KISS, LAUGH, LIPS, LOL LOOKDOWN, LOVE, MONEY, MUSCLE, NOSEPICK, OBSESSED, OK, PARTY PETRIFIED, POOP, PRAISE, PROUD, PUKE, RAINBOWPUKE, ROSE, SALUTE SCOWL, SHAKE, SHHH, SHOCKED, SHOWOFF, SHY, SICK, SILENT SKULL, SLAP, SLEEP, SLIGHT, SMART, SMILE, SMIRK, SMOOCH SMUG, SOB, SPEECHLESS, SPITBLOOD, STRIVE, SWEAT, TEARS, TEASE TERROR, THANKS, THINKING, THUMBSUP, TOASTED, TONGUE, TRICK, UPPERLEFT WAIL, WAVE, WELLDONE, WHAT, WHIMPER, WINK, WITTY, WOW WRONGED, XBLUSH, YAWN, YEAH, FIREWORKS, BULL, CALF, AWESOMEN 2021, CANDIEDHAWS, REDPACKET, FORTUNE, LUCK, FIRECRACKER, Yes, No Get, LGTM, Lemon, EatingFood, Hundred, MinusOne, ThumbsDown, Fire OKR, Drumstick, BubbleTea, Loudspeaker, Pin, Coffee, Alarm, Trophy Music, Typing, Pepper, CheckMark, CrossMark五、行为说明大小写敏感 本地枚举校验兜底--emoji大小写敏感parseDriveReactReplyEmoji在发送请求前完成校验未知值直接报unknown --emoji xxx校验错误参数定位到--emoji。add / delete 幂等重复添加已有 reaction、删除不存在的 reaction 都会成功返回且无副作用delete只取消当前身份自己加的 reaction。源码注释与Tips均明确这一行为。根回复 评论本身对根回复操作等价于给评论本身加/删表情反过来说用户说给这条评论加表情时应取根回复list-replies第一页items[0]的reply_id再操作。读回 reaction在drive list-replies/drive batch-query-comments上带--need-reaction。返回形状为items[].reactions[]{reaction_key, count, ahead_users[]}count0的条目是已删除 reaction 的残留判断是否存在与统计数量都要按count0过滤。--action归一化parseDriveReactReplyAction会先TrimSpace再ToLower因此add、Add、DELETE都能归一为合法值但 flag 本身带Enum: []string{add,delete}CLI 层会直接拒绝toggle之类非法值测试TestParseDriveReactReplyAction覆盖。六、输出格式成功执行后返回如下 JSONdata字段{ file_token: docx_token, file_type: docx, reply_id: reply_id, reaction_type: THUMBSUP, action: add, updated: true }字段说明file_token/file_type最终解析到的底层文档 token 与类型wiki 输入时为解包后的obj_token/obj_type。reply_id/reaction_type/action回显本次操作的参数。updated固定为true写操作成功即返回。若输入是 wiki URL/token输出还会额外包含wiki_token字段组装逻辑见 shortcuts/drive/drive_comment_common.go 的driveCommentTargetOutput测试TestDriveReactReplyExecuteViaWikiDelete验证了file_typeslides且带wiki_token的输出形状。七、源码实现深挖调用链与 wiki 解包react-reply的实现集中在 shortcuts/drive/drive_react_reply.go可以归纳为三步入参解析readDriveReactReplySpec依次解析--url/--token/--typeresolveDriveCommentInput、校验--reply-id非空、校验--emoji枚举、归一化--action最终组装driveReactReplySpec{Ref, ReplyID, ReactionType, Action}。RequestBody()生成{action, reaction_type, reply_id}。目标解析resolveDriveCommentTarget对非 wiki 输入直接使用 URL/token 解析出的类型与 token对 wiki 输入则调用GET /open-apis/wiki/v2/spaces/node_by_token解包出obj_type/obj_token并对 wiki 返回的典型错误码做归类131012→ not found、131013/131016→ invalid parameters、131014→ failed precondition若 node 数据不完整缺obj_type或obj_token会报incomplete node data内部错误测试TestDriveReactReplyWikiNodeIncompleteResponse覆盖。发送请求POST /open-apis/drive/v2/files/:file_token/comments/reactionquery 携带file_typebody 为 spec 的RequestBody()成功后经driveCommentTargetOutput输出结果。7.1 风险与权限DriveReactReply声明了Risk: write写入型操作Scopes: [docs:document.comment:write_only]ConditionalScopes: [wiki:node:read]wiki 解包需要读节点AuthTypes: [user, bot]支持用户身份与机器人身份。执行前请确保当前身份含--as user/--as bot选择对目标文档具备相应评论写权限permission denied等权限问题按共享文档 skills/lark-shared/SKILL.md 处理。7.2 dry-run执行前先预览react-reply支持--dry-runbuildDriveReactReplyDryRun会根据输入类型生成不同的预演计划直接目标docx 等1 步请求——POST /open-apis/drive/v2/files/:file_token/comments/reaction带file_type、body 与reply_idwiki 目标2 步编排——先GET /open-apis/wiki/v2/spaces/node_by_token解包再对解包结果执行POST .../comments/reaction。对应测试TestDriveReactReplyDryRunDirect1 步与TestDriveReactReplyDryRunWiki2 步分别验证了 dry-run 输出中 API 调用数量、方法、URL 与 body 字段。写操作建议先--dry-run确认目标与参数无误。7.3 原生命令兜底在 shortcut 未暴露所需字段等少数场景下可以用原生命令兜底。注意原生路径没有本地枚举校验lark-cli drive file.comment.reply.reactions update_reaction \ --params {file_token:DOC_TOKEN,file_type:docx} \ --data {action:add,reply_id:REPLY_ID,reaction_type:THUMBSUP}调用原生 API 前务必先用lark-cli schema drive.file.comment.reply.reactions update_reaction查看--data/--params参数结构不要猜测字段格式见 skills/lark-drive/SKILL.md 的 API Resources 说明。[!CAUTION]update_reaction以及react-reply是写入操作。执行前必须确认用户意图不要默认替用户点表情。八、完整实战示例场景 A给某条回复点赞# 1. 获取评论 ID lark-cli drive list-comments --url DOC_URL --need-reaction # 2. 获取回复 ID第一页 items[0] 为根回复 lark-cli drive list-replies --url DOC_URL --comment-id COMMENT_ID # 3. 给指定回复添加点赞 reaction lark-cli drive react-reply --url DOC_URL \ --reply-id REPLY_ID --emoji THUMBSUP --action add场景 B删除回复上的 DONE 表情wiki URL 自动解包lark-cli drive react-reply --url WIKI_URL \ --reply-id REPLY_ID --emoji DONE --action delete场景 C用裸 token 操作需--typelark-cli drive react-reply --token DOCX_TOKEN --type docx \ --reply-id REPLY_ID --emoji HEART --action add场景 D读回某评论卡片的 reaction查询侧# 遍历评论卡片并把 reaction 一起拿回来 lark-cli drive list-comments --url DOC_URL --need-reaction # 已知 comment_id批量查询 lark-cli drive batch-query-comments --url DOC_URL --comment-ids COMMENT_ID --need-reaction # 翻某张评论卡片下的 replies 并带 reaction每一页都要持续带 --need-reaction lark-cli drive list-replies --url DOC_URL --comment-id COMMENT_ID --need-reaction查询侧返回的items[].reactions[]为{reaction_key, count, ahead_users[]}统计与判断是否存在时一律按count0过滤残留。九、测试佐证与可验证性仓库为react-reply提供了完整的单元测试shortcuts/drive/drive_react_reply_test.go可以作为行为契约验证TestDriveReactReplyExecuteDocxAdddocx 直连添加断言请求 body 的action/reaction_type/reply_id与输出字段TestDriveReactReplyExecuteViaWikiDeletewiki 输入解包为 slides断言file_typeslides、reaction_typeThumbsDown大小写保留、输出含wiki_tokenTestDriveReactReplyValidation空--reply-id、未知 emoji、emoji 大小写、非法 action、folder 类型等负向用例TestDriveReactReplyPropagatesAPIErrorAPI 错误如1069301 reply not found正确向上传播TestDriveReactReplyDryRunDirect/TestDriveReactReplyDryRunWikidry-run 计划的结构验证。参考skills/lark-drive/references/lark-drive-reactions.md —— reaction 查询规则、语义与完整枚举skills/lark-drive/references/lark-drive-list-replies.md —— 获取reply_idskills/lark-drive/SKILL.md —— 云空间云盘/云存储全部命令与评论操作决策shortcuts/drive/drive_react_reply.go ——react-reply命令实现shortcuts/drive/drive_comment_common.go ——--url/--token/--type解析与 wiki 解包shortcuts/drive/drive_react_reply_test.go —— 行为契约测试skills/lark-shared/SKILL.md —— 认证与全局参数赞分享CLIAI 技能【免费下载链接】cliThe official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 commands and 20 AI Agent Skills.项目地址https://gitcode.com/gh_mirrors/cli414/cli点击查看免费下载相关推荐Lark CLI drive add-reply 命令实战指南为飞书云文档评论添加回复Lark CLI drive add reply 命令实战指南为飞书云文档评论添加回复 本文以 lark cli飞书官方 CLI由 larksuiteCLIAI 技能使用 Lark CLI 的 drive delete-reply 命令安全删除云文档评论回复使用 Lark CLI 的 drive delete reply 命令安全删除云文档评论回复 导读 lark cli drive delete replyCLIAI 技能使用 AWS CLI codecommit put-comment-reaction 为 CodeCommit 评论添加与移除 Emoji 反应使用 AWS CLI codecommit put comment reaction 为 CodeCommit 评论添加与移除 Emoji 反应 导读 本文围绕开发工具云原生运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考