{"id":"ca6c8d39-015f-4ff5-91b2-4940efbd672d","entityType":"agent","slug":"clawhub-clear0-feishu-group-chat","name":"Feishu Group Chat","canonicalUrl":"https://www.xpersona.co/agent/clawhub-clear0-feishu-group-chat","canonicalPath":"/agent/clawhub-clear0-feishu-group-chat","generatedAt":"2026-10-12T05:13:33.213Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:33.855Z","emptyReason":null},"description":"让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。 飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。 触发场景：需要在飞书群里...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 995 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17famnx7qw55qapk2kevqzr5x83h38h:feishu-group-chat","sourceUrl":"https://clawhub.ai/clear0/feishu-group-chat","homepage":"https://clawhub.ai/clear0/skills/feishu-group-chat","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/clear0/feishu-group-chat","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/clear0/skills/feishu-group-chat","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Feishu Group Chat technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:33.855Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:33.855Z","emptyReason":null},"stars":null,"forks":null,"downloads":995,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.1.1","tractionLabel":"995 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:33.788Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T20:44:33.855Z","lastCrawledAt":"2026-10-11T20:44:33.788Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T20:44:33.788Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.1","createdAt":"2026-05-28T00:59:03.878Z","changelog":"feishu-group-chat v1.1.1 - 新增 config-template.json 模板，简化首次配置流程，避免敏感信息泄露 - 新增/增强脚本 send_group_message.sh：首次运行自动创建 config.json 并提示用户填写，输出方式调整为 shell 变量，便于自动化调用 - 消息“@”格式由2元素升级为3元素（prefix→at→正文），明确顺序要求和空格规范 - 强化用法规范：敏感 ID 配置与版本库隔离、严禁手动拼接 JSON、脚本必用 - 扩展每日聊天自动化相关机制，明确 cron+心跳工作流与图片处理流程 - 补充 config.json 管理和敏感数据处理的安全提醒","fileCount":8,"zipByteSize":15464},{"version":"1.1.0","createdAt":"2026-04-18T08:13:39.356Z","changelog":"v1.1.0","fileCount":5,"zipByteSize":10074},{"version":"1.0.4","createdAt":"2026-04-17T11:25:47.463Z","changelog":"sender_id + prefix dual identification for multi-bot support; fix script comment format","fileCount":7,"zipByteSize":10828},{"version":"1.0.3","createdAt":"2026-04-17T09:51:03.977Z","changelog":"feishu-group-chat v1.0.3 - 精简与优化技能介绍，统一术语表述（Bot→Bot/用户，龙虾机器人→Bot 等） - 明确描述本技能适用场景和限制，删除部分冗余说明 - 技能文档整体用语更简明，并强化关键流程描述和安全铁律 - 优化权限说明和错误处理提示 - 代码及功能未变，属于文档优化更新","fileCount":4,"zipByteSize":8457},{"version":"1.0.2","createdAt":"2026-04-17T09:47:18.426Z","changelog":"feishu-group-chat 1.0.2 Changelog - 技能描述精简，不再绑定 OpenClaw/龙虾机器人，面向所有飞书机器人通用场景。 - 去除原文档中与 openclaw 平台相关的描述，术语统一为“飞书机器人”。 - 提示用户：本技能适用于任何已引入本 skill 的 Bot/用户之间的群聊。 - 主要用例、配置方式、消息格式，以及权限、记忆逻辑等内容结构未变。 - 优化说明文字，使文档更加简洁明了，便于所有开发者理解和使用。","fileCount":4,"zipByteSize":8499},{"version":"1.0.1","createdAt":"2026-04-17T09:42:21.708Z","changelog":"- 新增对 OpenClaw 龙虾多机器人群聊的支持，允许机器人以用户身份@其他机器人，实现机器人互相对话。 - 更新描述，说明本技能用于绕开飞书原生对机器人消息的限制，并详解多Bot聊天的具体用法。 - 其他文档内容基本保持不变，仅增强对技能原理和适用场景的说明。","fileCount":4,"zipByteSize":8532},{"version":"1.0.0","createdAt":"2026-04-17T09:35:25.990Z","changelog":"初始发布：通用飞书群聊技能，支持多群配置、联系人记忆管理、认识新朋友机制","fileCount":4,"zipByteSize":8310}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17famnx7qw55qapk2kevqzr5x83h38h:feishu-group-chat","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17famnx7qw55qapk2kevqzr5x83h38h:feishu-group-chat` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/clear0/feishu-group-chat before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T05:13:33.211Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-clear0-feishu-group-chat/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:33.855Z","emptyReason":null},"readme":"Skill: Feishu Group Chat\n\nOwner: clear0\n\nSummary: 让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。 飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。 触发场景：需要在飞书群里...\n\nTags: latest:1.1.1\n\nVersion history:\n\nv1.1.1 | 2026-05-28T00:59:03.878Z | user\n\nfeishu-group-chat v1.1.1\n\n- 新增 config-template.json 模板，简化首次配置流程，避免敏感信息泄露\n- 新增/增强脚本 send_group_message.sh：首次运行自动创建 config.json 并提示用户填写，输出方式调整为 shell 变量，便于自动化调用\n- 消息“@”格式由2元素升级为3元素（prefix→at→正文），明确顺序要求和空格规范\n- 强化用法规范：敏感 ID 配置与版本库隔离、严禁手动拼接 JSON、脚本必用\n- 扩展每日聊天自动化相关机制，明确 cron+心跳工作流与图片处理流程\n- 补充 config.json 管理和敏感数据处理的安全提醒\n\nv1.1.0 | 2026-04-18T08:13:39.356Z | user\n\nv1.1.0\n\nv1.0.4 | 2026-04-17T11:25:47.463Z | user\n\nsender_id + prefix dual identification for multi-bot support; fix script comment format\n\nv1.0.3 | 2026-04-17T09:51:03.977Z | auto\n\nfeishu-group-chat v1.0.3\n\n- 精简与优化技能介绍，统一术语表述（Bot→Bot/用户，龙虾机器人→Bot 等）\n- 明确描述本技能适用场景和限制，删除部分冗余说明\n- 技能文档整体用语更简明，并强化关键流程描述和安全铁律\n- 优化权限说明和错误处理提示\n- 代码及功能未变，属于文档优化更新\n\nv1.0.2 | 2026-04-17T09:47:18.426Z | auto\n\nfeishu-group-chat 1.0.2 Changelog\n\n- 技能描述精简，不再绑定 OpenClaw/龙虾机器人，面向所有飞书机器人通用场景。\n- 去除原文档中与 openclaw 平台相关的描述，术语统一为“飞书机器人”。\n- 提示用户：本技能适用于任何已引入本 skill 的 Bot/用户之间的群聊。\n- 主要用例、配置方式、消息格式，以及权限、记忆逻辑等内容结构未变。\n- 优化说明文字，使文档更加简洁明了，便于所有开发者理解和使用。\n\nv1.0.1 | 2026-04-17T09:42:21.708Z | auto\n\n- 新增对 OpenClaw 龙虾多机器人群聊的支持，允许机器人以用户身份@其他机器人，实现机器人互相对话。\n- 更新描述，说明本技能用于绕开飞书原生对机器人消息的限制，并详解多Bot聊天的具体用法。\n- 其他文档内容基本保持不变，仅增强对技能原理和适用场景的说明。\n\nv1.0.0 | 2026-04-17T09:35:25.990Z | user\n\n初始发布：通用飞书群聊技能，支持多群配置、联系人记忆管理、认识新朋友机制\n\nArchive index:\n\nArchive v1.1.1: 8 files, 15464 bytes\n\nFiles: CHANGELOG.md (2186b), config-template.json (578b), PERMISSIONS.md (1652b), README.md (6659b), scripts/send_group_message.sh (7479b), skill-card.md (2777b), SKILL.md (10572b), _meta.json (136b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: feishu-group-chat\ndescription: >\n  让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。\n  飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 包含联系人、群的完整配置。**本文件包含敏感信息（open_id/chat_id），已通过 `.clawhubignore` 排除，不会上传到 GitHub/ClawHub。**\n\n### 首次使用\n\n技能目录下提供 `config-template.json` 模板。首次运行 `send_group_message.sh` 时，脚本会自动将模板复制为 `config.json`，提示用户编辑后重试。\n\n也可以手动复制：\n```bash\ncp config-template.json config.json\n# 编辑 config.json，填入真实的 open_id、chat_id 等信息\n```\n\n### 配置格式\n\n```json\n{\n  \"contacts\": {\n    \"ray\": {\n      \"open_id\": \"ou_xxx\",\n      \"name\": \"Ray\"\n    }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从脚本输出的 `CHAT_ID` 环境变量获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）— 3 元素结构\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"Vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}\n```\n\n**⚠️ 格式铁律（违反即犯错）：**\n1. **顺序**：text(prefix) → at(对方) → text(\" \" + 正文)，共 3 个元素\n2. **工具**：`feishu_im_user_message`，不是 `message`\n3. **类型**：`post`，不是 `text`\n4. **前缀**：prefix 从 IDENTITY.md 的 Name 自动取（如 `Vicky: `），后跟一个空格再接正文\n5. **at 在中间**：prefix 在最前，@ 紧跟其后，正文在最后\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"Vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n### 带图片的消息\n\n图片作为第 4 个元素追加（`{tag: \"img\", image_key: \"img_xxx\"}`）。图片通过脚本自动上传。\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造消息参数，输出 source-friendly 环境变量：\n\n```bash\n# 第一步：用脚本构造参数\nsource <(bash scripts/send_group_message.sh moltpool ray \"你好呀～\")\n# 带图片：\n# source <(bash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png)\n# 只有图片：\n# source <(bash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png)\n\n# 第二步：用 feishu_im_user_message 工具发送\n#   action: send\n#   receive_id_type: chat_id\n#   receive_id: 从 $CHAT_ID 取\n#   msg_type: $MSG_TYPE (固定为 post)\n#   content: $MSG_CONTENT\n# 如有图片（HAS_IMAGE=true），图片已内嵌在 MSG_CONTENT 中，无需额外发送\n```\n\n**脚本自动读取** `config.json`，调用方无需关心 open_id/chat_id。\n\n## 每日聊天机制\n\n### 闲聊时段\n\n由 cron 定时任务每天 4:20 自动生成，存储在 `~/.openclaw/workspace/proactivity/chat-schedule.md`：\n\n```markdown\n- [ ] 07:00-07:50 | 话题：...\n- [x] 12:20-13:10 (📸) | 话题：...（补发 16:53）\n- [ ] 18:15-19:05 | 话题：...\n```\n\n**心跳中的处理逻辑：**\n\n1. **时段内且未勾选** → 主动去群聊，完成后勾选\n2. **补发机制**：时段已过但未勾选 → 补发（超过 2 小时则跳过）\n3. **📸 标记**：该时段需额外生成 Vicky 生活照片\n\n### 聊天检查（每次心跳）\n\n1. 用 `feishu_im_user_get_messages` 获取群里最近 30 分钟的消息\n2. 如果联系人有新消息且 agent 还没回复 → **立即回复**，不受闲聊时段限制\n3. 回复格式**必须用脚本构造**，禁止手动拼 JSON\n\n### 📸 照片时段\n\n1. 检查当前时段是否有 `(📸)` 标记且未勾选\n2. 聊天回复后，调用 `image_generate` 生成场景相关的 Vicky 生活照片\n   - 使用 IDENTITY.md 中的 Prompt 模板\n   - 根据话题调整场景（美食→餐厅、运动→瑜伽馆、日常→街拍等）\n3. 生成后用脚本发送到群聊（图片内嵌在 post 消息中）\n4. 勾选该时段\n\n## 技能适用范围\n\n**本技能用于以下场景：**\n\n- 主动在群里发消息（闲聊、打招呼、发自拍等）\n- 回复需要 @ 的联系人（at_rules 中为 true 的对象）\n- 图片发送（需要走脚本上传）\n- 心跳中的聊天检查和闲聊时段\n\n**不需要使用本技能的场景：**\n- 群里普通用户发消息直接回复 → 正常回复即可\n- 其他 agent 的内部任务汇报 → 用 sessions_send\n\n## 发送身份区分\n\n群里回复消息有**两种身份**，必须正确选择：\n\n| 身份 | 工具 | 对方看到的发送者 | 使用场景 |\n|------|------|-----------------|---------|\n| **Bot 身份** | `message` | 机器人名 | 用户本人消息、普通回复 |\n| **用户身份** | `feishu_im_user_message` | 用户本人 | 需要 @ 通知、以人身份交流 |\n\n**铁律：**\n- 回复用户本人 → **Bot 身份**（`message`）\n- 回复联系人 → **用户身份**（`feishu_im_user_message`）\n- 主动闲聊/打招呼 → **用户身份**（`feishu_im_user_message`）\n\n## 识别消息来源（sender_id + 前缀 双重判断）\n\n群里消息可能来自三种身份，必须正确识别：\n\n| sender_id | 消息前缀 | 真实来源 | 处理方式 |\n|-----------|---------|---------|---------|\n| 用户本人 | 无 | **用户本人的指令** | Bot 身份回复 |\n| 用户本人 | `BotName:` | **另一个 Bot 通过用户身份发送** | 按 contacts 匹配，用本技能回复 |\n| 其他用户 | 无 | **普通群友** | 正常回复 |\n\n### 识别流程\n\n**⚠️ 前缀检查优先于 sender_id 判断！**\n\n```\n收到群消息\n │\n ├─ 【第一步】检查消息正文前缀\n │   ├─ 消息以 \"联系人名:\" 开头？\n │   │   ├─ 匹配 contacts → 视为该联系人发的 → 用本技能回复\n │   │   └─ 未匹配 → 进入第二步\n │   └─ 无前缀 → 进入第二步\n │\n └─ 【第二步】根据 sender_id 判断\n     ├─ sender_id == 用户本人？→ 用户指令，Bot 身份回复\n     ├─ sender_id 匹配 contacts？→ 按 at 规则处理\n     └─ 未匹配？→ 认识新朋友流程\n```\n\n## 自适应回复逻辑\n\n收到群消息时，根据 config.json 判断：\n\n1. **识别发送者**：用消息的 sender open_id 匹配 secrets.json 中 contacts 的 open_id\n2. **匹配到联系人**：用该联系人的 `at` 规则决定是否 @，从 IDENTITY.md 自动取前缀\n3. **未匹配到联系人**：正常回复，不用本技能\n4. **群不在配置中**：触发「认识新群」流程\n5. **群在配置中但发送者不在 contacts 中**：触发「认识新朋友」流程\n\n## 认识新朋友\n\n当遇到未记录的群或未记录的 Bot/用户时，**严禁直接记录**，必须先征得用户同意。\n\n### 流程\n\n1. 向用户**私聊**报告：群名称、陌生者信息、最近一条消息\n2. 询问是否要认识\n3. 用户同意后：在 config.json 中添加联系人\n4. 创建记忆文件（从 `memories/contacts/_template.md` 复制）\n5. 用户拒绝：不记录，完全忽略该群/人\n\n### 关键铁律\n\n- **永远先问用户，再记录**\n- **私聊确认**，不在群里问\n- **不打扰**：拒绝后不再重复询问\n- **敏感信息只在 config.json**：open_id、chat_id 不写进 SKILL.md 或记忆文件（config.json 已排除版本控制）\n\n## 记忆管理\n\n### 记忆存储\n\n联系人记忆全局共享，存储在 `memories/contacts/<联系人key>.md`。\n\n### 何时记录\n\n| 信息类型 | 记录位置 | 示例 |\n|---------|---------|------|\n| 身份/职业变化 | `## 身份` | \"在写多Agent调度方案\" |\n| 生活偏好 | `## 偏好 & 习惯` | \"晚睡型\"、\"煮面当晚饭\" |\n| 聊天风格特征 | `## 聊天风格` | \"经常用 😄\" |\n| 有价值的话题 | `## 话题记忆` | 聊了某个技术方案 |\n| 临时安排/计划 | 不写入记忆 | 按需写入 heartbeat.md |\n\n**不记录**：日常寒暄、无信息量的闲聊、临时性事务。\n\n### 何时读取\n\n每次回复前，读取对应联系人的记忆文件，用于个性化回复、延续话题、关系感知。\n\n### 更新规则\n\n- 新信息 → append 到对应章节\n- 矛盾信息 → 标记旧信息为 ~~删除线~~，写入新信息\n- 每次更新修改 `最后更新` 日期\n- 不要重写整份记忆，只增量更新\n\n## 首次使用权限检查\n\n其他 agent 首次使用本技能时，**必须先检查权限**：\n\n1. 读取 `PERMISSIONS.md` 了解所需权限\n2. 尝试调用 `feishu_im_user_get_messages` 获取目标群最近 1 条消息\n3. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n4. 如需发图，尝试用脚本上传图片\n5. 任何步骤失败 → 向用户报告缺失权限，提示使用 `feishu_oauth_batch_auth` 授权\n\n详细权限清单见 `PERMISSIONS.md`。\n\n## 禁止事项\n\n- ❌ 永远不用 `message` 工具发群消息（@ 只是文本，对方收不到通知）\n- ❌ 永远不用 `msg_type: \"text\"`\n- ❌ 不要用纯文本写 `@名字`（必须是结构化 `at` 标签）\n- ❌ 不要把前缀放在 title 里（会加粗）\n- ❌ 不要手动拼 JSON（必须用脚本构造）\n- ❌ 不要在 SKILL.md 或脚本中硬编码 open_id / chat_id（敏感信息只在 config.json，已排除版本控制）\n\nFile v1.1.1:README.md\n\n# feishu-group-chat\n\n> 让多个飞书 Bot 在同一个群里互相对话。\n\n飞书限制了 Bot 不响应其他 Bot 的消息。本技能另辟蹊径：让 Bot 通过用户身份在群里 @ 其他 Bot，同时加上自己的名字前缀，模拟 Bot 之间的对话。把多个 Bot（都配置了本技能）加到同一个群里，它们就能相互聊天甚至分配任务了。\n\n## ✨ 特性\n\n- 🤖 **多 Bot 对话** — 在飞书群里实现 Bot 之间的互相对话\n- 💬 **自动 @ 通知** — 按 `at_rules` 配置自动 @ 对方，确保通知送达\n- 🖼️ **图片发送** — 支持发送图片（自动上传并内嵌到消息中）\n- 📝 **联系人记忆** — 持久化联系人偏好、风格、话题记忆，个性化聊天\n- 🔄 **自动初始化** — 首次使用自动从模板创建配置文件\n- 🔒 **隐私安全** — 敏感信息（open_id、chat_id）独立存储，不纳入版本控制\n\n## 快速开始\n\n### 1. 安装\n\n将本技能目录放到 OpenClaw 的 `skills/` 目录下：\n\n```bash\n# 通过 ClawHub 安装（推荐）\nclawhub install feishu-group-chat\n\n# 或手动 clone\ngit clone https://github.com/clear0/feishu-group-chat.git ~/.openclaw/workspace/skills/feishu-group-chat\n```\n\n### 2. 配置\n\n首次运行 `send_group_message.sh` 时，脚本会自动从 `config-template.json` 创建 `config.json`，你需要编辑它：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": {\n      \"open_id\": \"ou_xxxxxxxxxxx\",\n      \"name\": \"Ray\"\n    }\n  },\n  \"groups\": {\n    \"mygroup\": {\n      \"chat_id\": \"oc_xxxxxxxxxxx\",\n      \"name\": \"My Group\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 说明 |\n|------|------|\n| `contacts` | 全局联系人列表（open_id 跨群唯一） |\n| `groups` | 群配置，`members` 引用 contacts 的 key |\n| `at_rules` | 每个联系人在该群是否需要 @（`true/false`） |\n\nAgent 的名字前缀会自动从 `IDENTITY.md` 或 `SOUL.md` 的 `Name` 字段读取，无需手动配置。\n\n### 3. 授权\n\n本技能依赖用户 OAuth 授权。首次使用前请确保已授权飞书权限：\n\n- `im:message` — 以用户身份发送消息\n- `im:message:readonly` — 读取群消息\n- `im:resource` — 上传图片\n\n推荐使用 `feishu_oauth_batch_auth` 一次性授权所有权限。\n\n## 使用方式\n\n### 发送消息\n\n```bash\n# 第一步：用脚本构造参数\nsource <(bash scripts/send_group_message.sh <群标识> <联系人key> \"消息内容\")\n\n# 带图片\nsource <(bash scripts/send_group_message.sh <群标识> <联系人key> \"看这个\" --image /path/to/image.png)\n\n# 只发图片\nsource <(bash scripts/send_group_message.sh <群标识> <联系人key> \"\" --image /path/to/image.png)\n\n# 第二步：用 feishu_im_user_message 工具发送\n#   action: send\n#   receive_id_type: chat_id\n#   receive_id: $CHAT_ID\n#   msg_type: $MSG_TYPE (固定为 post)\n#   content: $MSG_CONTENT\n```\n\n### 消息格式\n\n脚本自动处理消息格式，无需手动拼 JSON：\n\n- **@ 对方**（at=true）：`前缀 → @对方 → 正文`\n- **不 @**（at=false）：`前缀 + 正文`\n- **带图片**：图片作为 `img` 标签内嵌在 post 消息中\n\n## 文件结构\n\n```\nfeishu-group-chat/\n├── SKILL.md              # 技能完整文档（Agent 阅读）\n├── README.md             # 本文件\n├── CHANGELOG.md          # 更新日志\n├── PERMISSIONS.md        # 权限需求说明\n├── LICENSE               # MIT-0 许可证\n├── config-template.json  # 配置模板（纳入版本控制）\n├── config.json           # 实际配置（⚠️ 已排除版本控制）\n├── .gitignore\n├── .clawhubignore\n├── scripts/\n│   └── send_group_message.sh   # 消息构造脚本\n└── memories/\n    └── contacts/\n        ├── _template.md  # 联系人记忆模板\n        └── *.md          # 联系人记忆文件（⚠️ 已排除版本控制）\n```\n\n## 心跳集成\n\n本技能设计为与 OpenClaw 心跳机制配合使用：\n\n- **聊天检查**：每次心跳检查群里是否有新消息需要回复\n- **闲聊时段**：由 cron 定时任务生成，心跳按时段触发主动聊天\n- **📸 照片时段**：标记了 `(📸)` 的时段会额外生成生活照片\n\n详细配置请参考 [SKILL.md](./SKILL.md)。\n\n## 📸 照片生成（可选）\n\n本技能支持在闲聊时段自动生成 Bot 的生活照片并发送到群里。如果你需要这个功能，需要额外准备：\n\n### 1. 文生图模型\n\n需要一个支持文生图的模型。推荐使用 **MiniMax image-01**（支持 character reference，能保持人物五官一致性）：\n\n```yaml\n# 在 OpenClaw 配置中添加图片生成模型\n# 以 MiniMax 为例\nimageGeneration:\n  provider: minimax\n  model: image-01\n```\n\n也可以使用其他支持的文生图模型（如 OpenAI gpt-image-1 等），只要能在 OpenClaw 中通过 `image_generate` 工具调用即可。\n\n### 2. Bot 外貌描述\n\n为了让生成的照片人物形象一致，你需要提供 Bot 的外貌特征描述。有两种方式：\n\n**方式一：文字描述**（推荐）\n\n在 `IDENTITY.md` 中添加详细的外貌定义，包括脸型、发型、体型、穿搭风格等。例如：\n\n```markdown\n### 外貌定义\n- 脸型：圆脸偏鹅蛋脸，下颌线条柔和\n- 眼睛：杏眼，深棕色虹膜\n- 发型：黑色及肩发，长度到肩膀\n- 体型：168cm，偏瘦，长腿\n- 穿搭：简约韩系风，白色/米色为主\n```\n\n越详细越好，这样每次生成照片时形象会更一致。\n\n**方式二：提供参考照**\n\n如果使用支持 character reference 的模型（如 MiniMax image-01），可以直接提供一张参考照片，模型会基于参考照保持五官一致：\n\n```bash\n# 将参考照放到技能目录或 workspace 下\n# 在生成时通过 --image 参数传入\nimage_generate --image /path/to/reference_photo.jpg \"场景描述\"\n```\n\n### 照片生成流程\n\n1. 心跳检测到标记了 `(📸)` 的闲聊时段\n2. 先完成聊天回复\n3. 根据当前话题生成对应场景的照片（美食→餐厅、运动→健身房、日常→街拍等）\n4. 照片自动发送到群聊\n\n如果不配置照片生成，技能的其他功能（文字聊天、@ 通知等）不受影响。\n\n## 注意事项\n\n- ⚠️ **必须用 `feishu_im_user_message` 发送**（用户身份），不能用 `message`（Bot 身份）\n- ⚠️ **`msg_type` 必须是 `post`**，不能用 `text`\n- ⚠️ **前缀自动从 IDENTITY.md 读取**，不要手动配置\n- ⚠️ **config.json 包含敏感信息**，已在 `.gitignore` 和 `.clawhubignore` 中排除\n\n## License\n\n[MIT-0](./LICENSE)\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1779929943878\n}\n\nFile v1.1.1:CHANGELOG.md\n\n# Changelog\n\n## v2.1.0 (2026-05-27)\n\n### 新增\n- **config-template.json**：示例配置模板，新用户首次使用时自动从模板创建 config.json\n- **脚本自动初始化**：send_group_message.sh 检测到 config.json 不存在时自动从模板复制\n- **.clawhubignore 完善**：排除 config-template.json、memories/、token 缓存等隐私/非必要文件\n\n### 优化\n- **隐私信息脱敏**：config.json、memories/ 已完全排除版本控制，发布包不含任何 open_id/chat_id\n- **SKILL.md 文档更新**：补充自动初始化说明\n\n## v2.0.0 (2026-05-20)\n\n### 破坏性变更\n- **敏感信息分离**：`config.json` 不再包含 open_id / chat_id，拆分到 `secrets.json`（不纳入版本控制）\n- **脚本输出格式**：从 JSON 输出改为 source-friendly 环境变量（`CHAT_ID`, `MSG_TYPE`, `MSG_CONTENT`, `HAS_IMAGE`, `IMAGE_KEY`）\n- **消息格式统一**：at=true 时固定为 3 元素结构 `text(prefix) → at(对方) → text(正文)`\n\n### 新增\n- **每日聊天机制**：闲聊时段（cron 生成）+ 聊天检查（心跳）+ 📸照片时段\n- **secrets.json**：敏感信息独立存储，脚本自动合并 config.json + secrets.json\n- **图片内嵌**：图片作为 `img` 标签内嵌在 post 消息中，无需额外发送\n\n### 优化\n- **脚本通用化**：`send_group_message.sh` 替代专用 `chat_to_ray.sh`，支持任意群和联系人\n- **SKILL.md 文档补全**：合入聊天检查、闲聊时段、照片生成等近期新功能的完整文档\n- **HEARTBEAT.md 更新**：统一使用新脚本路径和调用方式\n\n## v1.1.0 (2026-04-18)\n\n### 新增\n- **记忆管理系统**：联系人记忆全局共享（`memories/contacts/`），按时间增量更新\n- **消息来源识别**：sender_id + 前缀双重判断\n- **认识新朋友机制**：遇到未知群/联系人时先征求用户同意\n- **首次使用权限检查**：自动检测飞书 OAuth 权限\n\n### 优化\n- **配置结构升级**：contacts 全局共享 + 群引用\n- **快捷脚本**：`send_group_message.sh` 支持图片上传\n\n## v1.0.0 (2026-03-28)\n\n### 初始功能\n- 基础群消息发送和回复\n- @ 对方通知\n- 简单配置结构\n\nFile v1.1.1:PERMISSIONS.md\n\n# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |\n\nFile v1.1.1:skill-card.md\n\n## Description:\n\nEnables OpenClaw agents to prepare Feishu group-chat messages, mentions, replies, and optional image posts through a configured user identity.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[clear0](https://clawhub.ai/user/clear0)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use this skill to let OpenClaw agents participate in Feishu group chats, including sending structured post messages, mentioning configured contacts, replying to group activity, and attaching generated or local images.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends Feishu group messages as the user and may upload images through Feishu APIs.\n\nMitigation: Require explicit user confirmation before sending messages or uploading images, and keep Feishu app credentials and chat/contact IDs outside published artifacts.\n\nRisk: The helper script emits shell variables and the security guidance warns that sourcing its output as shell code is unsafe.\n\nMitigation: Review and fix the helper script before installation; parse its structured outputs cautiously instead of sourcing untrusted shell text.\n\nRisk: Broad Feishu OAuth permissions can expose group messages, chat metadata, image upload capability, and user-message sending.\n\nMitigation: Grant only the Feishu scopes needed for the intended workflow and review authorization state before first use.\n\nRisk: Group messages and display-name prefixes can be spoofed or otherwise untrusted.\n\nMitigation: Verify authenticated sender IDs and configured contact mappings before treating a group message as coming from a known agent or user.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/clear0/skills/feishu-group-chat)\n- [Publisher profile](https://clawhub.ai/user/clear0)\n- [README.md](artifact/README.md)\n- [PERMISSIONS.md](artifact/PERMISSIONS.md)\n- [SKILL.md](artifact/SKILL.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON configuration examples and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces instructions and helper-script outputs for Feishu post-message content; requires user OAuth, configured contacts, configured groups, and careful handling of local credentials and message content.]\n\n## Skill Version(s):\n\n1.1.1 (source: server release metadata, created 2026-05-28)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.1.1:config-template.json\n\n{\n  \"_doc\": \"飞书群聊配置模板 — 首次使用时自动复制为 config.json\",\n  \"_usage\": \"在 contacts 中添加联系人，在 groups 中添加群，members 引用 contacts 的 key\",\n  \"contacts\": {\n    \"example_contact\": {\n      \"open_id\": \"ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n      \"name\": \"联系人名字\"\n    }\n  },\n  \"groups\": {\n    \"example_group\": {\n      \"chat_id\": \"oc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n      \"name\": \"群名称\",\n      \"members\": [\n        \"example_contact\"\n      ],\n      \"at_rules\": {\n        \"example_contact\": true\n      }\n    }\n  }\n}\n\nArchive v1.1.0: 5 files, 10074 bytes\n\nFiles: CHANGELOG.md (1420b), PERMISSIONS.md (1652b), scripts/send_group_message.sh (7717b), SKILL.md (11275b), _meta.json (136b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: feishu-group-chat\ndescription: >\n  让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。\n  飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 采用**联系人全局共享 + 群引用**结构：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": { \"open_id\": \"ou_xxx\", \"name\": \"Ray\" }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从 `config.json` 的 `chat_id` 获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" Vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n**⚠️ 格式铁律（违反即犯错）：**\n1. **顺序**：at(对方) → text(\" \" + prefix + \" \" + 正文)，只有 2 个元素\n2. **工具**：`feishu_im_user_message`，不是 `message`\n3. **类型**：`post`，不是 `text`\n4. **前缀**：prefix 从 IDENTITY.md 的 Name 自动取（如 `Vicky:`），后跟一个空格再接正文\n5. **at 在前**：@ 必须放在最前面，prefix+正文合并在一个 text 元素里\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造完整的 content JSON：\n\n```bash\n# 发纯文字\nbash scripts/send_group_message.sh moltpool ray \"正文内容\"\n# 输出: {\"chat_id\":\"oc_xxx\",\"content\":{...}}\n\n# 带图片（自动上传）\nbash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png\n\n# 只有图片\nbash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png\n\n# 手动指定 image_key\nbash scripts/send_group_message.sh moltpool ray \"正文\" --image-key img_xxx\n```\n\n输出是 `{\"chat_id\":\"...\", \"content\":{...}}`，拆开填入 `feishu_im_user_message` 的参数即可。\n\n## 技能适用范围\n\n**本技能只用于以下场景：**\n\n- 主动在群里发消息（闲聊、打招呼、发自拍等）\n- 回复需要 @ 的联系人（contacts 中 `at: true` 的对象）\n- 图片发送（需要走脚本上传）\n\n**不需要使用本技能的场景：**\n- 群里普通用户发消息直接回复 → 正常回复即可，不用 `feishu_im_user_message`\n- 心跳检测群消息时发现新消息 → 用正常渠道回复\n\n## 发送身份区分\n\n群里回复消息有**两种身份**，必须正确选择：\n\n| 身份 | 工具 | Ray 看到的发送者 | 使用场景 |\n|------|------|-----------------|---------|\n| **Bot 身份** | `message` 工具 | 机器人名 | 用户本人消息、普通回复 |\n| **用户身份** | `feishu_im_user_message` | 用户本人 | 需要让对方收到 @ 通知、需要以人身份交流 |\n\n**铁律：**\n- 回复用户 → **Bot 身份**（`message` 工具），因为本来就是 Bot 在回复\n- 回复 Ray → **用户身份**（`feishu_im_user_message`），因为需要 @ 通知 + 以人身份互动\n- 主动闲聊/打招呼 → **用户身份**（`feishu_im_user_message`），因为要让对方觉得是人在说话\n\n## 识别消息来源（sender_id + 前缀 双重判断）\n\n群里消息可能来自三种身份，必须正确识别：\n\n| sender_id | 消息前缀 | 真实来源 | 处理方式 |\n|-----------|---------|---------|---------|\n| 用户本人 | 无 | **用户本人的指令** | Bot 身份回复 |\n| 用户本人 | `BotName:` | **另一个 Bot 通过用户身份发送** | 按 contacts 匹配 Bot，用本技能回复 |\n| 其他用户 | 无 | **普通群友** | 正常回复 |\n\n### 识别流程\n\n```\n收到群消息\n ├─ sender_id == 用户本人？\n │   ├─ 消息以某个 Bot 名字开头（如 \"小Ray:\" \"Vicky:\"）？\n │   │   ├─ 提取前缀 → 匹配 contacts 中的联系人 → 用本技能回复\n │   │   └─ 未匹配 → 按普通消息处理\n │   └─ 无前缀？→ 用户本人指令，Bot 身份回复\n └─ sender_id != 用户本人？\n     ├─ 匹配 contacts？→ 按 at 规则处理\n     └─ 未匹配？→ 认识新朋友流程\n```\n\n### 前缀匹配规则\n\n从消息正文中提取前缀，按以下规则匹配 contacts：\n\n1. **精确匹配**：消息以 `联系人name + \":\"` 开头 → 匹配该联系人\n2. **大小写不敏感**：`vicky:` `Vicky:` `VICKY:` 都匹配 `Vicky`\n3. **前缀后必须有空格或 @**：`Vicky:你好` 也匹配，`Vicky:abc` 如果联系人里没有 `Vickyabc` 则匹配 `Vicky`\n4. **联系人名支持中文**：`小Ray: 你好` 匹配联系人 `小Ray`\n\n### 多 Bot 场景\n\n当多个 Bot 都通过用户身份在同一群里发消息时：\n- 每条消息的前缀不同（各自的 Bot 名）\n- 通过前缀精确区分是哪个 Bot 发的\n- sender_id 都是用户本人，所以**前缀是唯一的区分依据**\n\n**配置要求**：每个 Bot 的联系人必须配置 `name` 字段，且 name 就是该 Bot 在群里发消息时使用的前缀。\n\n## 自适应回复逻辑\n\n收到群消息时，根据 `config.json` 判断：\n\n1. **识别发送者**：用消息的 sender open_id 匹配 contacts 中的联系人\n2. **匹配到联系人**：用该联系人的 `at` 规则决定是否 @，用群配置的 `prefix` 作为前缀\n3. **未匹配到联系人**（比如用户或普通群友在群里说话）：**正常回复即可，不需要用本技能**\n4. **群不在配置中**：触发「认识新群」流程（见下方）\n5. **群在配置中但发送者不在 contacts 且不在成员白名单中**：触发「认识新朋友」流程（见下方）\n\n## 认识新朋友\n\n当遇到未记录的群或未记录的 Bot/用户时，**严禁直接记录或打招呼**，必须先征得用户同意。\n\n### 场景 1：新群（群不在 config.json 中）\n\n1. 通过 `feishu_chat_members` 获取群成员列表\n2. 向用户私聊报告：\n   - 群名称、群 ID\n   - 群成员列表（名字 + open_id）\n   - 询问：「发现新群 XXX，要加入吗？」\n3. 用户同意后：\n   - 在 `config.json` 的 `groups` 中添加该群\n   - 将成员加入 `contacts`（需用户确认哪些需要 @）\n   - 为新联系人创建记忆文件（从模板复制）\n   - 在群里发第一条消息打招呼\n4. 用户拒绝：**不记录，且完全忽略该群的所有消息**（不再回复、不再询问）\n\n### 场景 2：新 Bot/用户（已知群里的陌生发送者）\n\n1. 向用户私聊报告：\n   - 群名称\n   - 陌生发送者的 open_id、名字\n   - 最近一条消息内容\n   - 询问：「XXX 群里有个新朋友 YYY，要认识吗？」\n2. 用户同意后：\n   - 在 `contacts` 中添加该联系人\n   - 创建记忆文件（从模板复制，填入已知信息）\n   - 询问是否需要 @ 该联系人\n   - 主动打招呼（可选，根据用户意愿）\n3. 用户拒绝：**不记录，且不再回复该发送者的任何消息**（完全忽略）\n\n### 关键铁律\n\n- **永远先问用户，再记录**\n- **用户私聊确认**，不要在群里问（避免尴尬）\n- **不打扰**：用户拒绝后不要再重复询问同一个群/人\n- **记忆初始化**：新联系人的记忆文件只填已知信息（open_id、名字、首次相遇时间），其他字段留空等待后续聊天积累\n\n## 记忆管理\n\n### 记忆存储\n\n联系人记忆全局共享（和 config.json 的 contacts 结构对齐），存储在 `memories/contacts/<联系人key>.md`：\n\n```\nmemories/contacts/\n├── ray.md              # Ray 的记忆（所有群共享）\n├── _template.md        # 新联系人模板\n└── (新联系人).md\n```\n\n### 记忆结构\n\n每份记忆包含：\n- **身份**：对方是谁、做什么的\n- **偏好 & 习惯**：作息、风格、口头禅\n- **聊天风格**：语言习惯、emoji 使用\n- **话题记忆**：按时间记录聊了什么\n- **关系**：和当前 agent 的关系\n\n### 何时记录\n\n收到群消息时，从对方消息中提取以下类型的信息并写入记忆：\n\n| 信息类型 | 记录位置 | 示例 |\n|---------|---------|------|\n| 身份/职业变化 | `## 身份` | \"在写多Agent调度方案\" |\n| 生活偏好 | `## 偏好 & 习惯` | \"晚睡型\"、\"煮面当晚饭\" |\n| 聊天风格特征 | `## 聊天风格` | \"经常用 😄\" |\n| 有价值的话题 | `## 话题记忆` | 聊了某个技术方案 |\n| 临时安排/计划 | 不写入记忆 | 按需写入 heartbeat.md |\n\n**不记录**：日常寒暄、无信息量的闲聊、临时性事务。\n\n### 何时读取\n\n每次回复前，读取对应联系人的记忆文件，用于：\n1. **个性化回复**：根据对方的风格和偏好调整语气\n2. **延续话题**：引用之前聊过的内容（\"上次你说的那个方案怎么样了？\"）\n3. **关系感知**：根据关系亲疏决定回复的正式程度\n\n### 更新规则\n\n- 新信息 → append 到对应章节\n- 矛盾信息 → 标记旧信息为 ~~删除线~~，写入新信息\n- 每次更新修改 `最后更新` 日期\n- 不要重写整份记忆，只增量更新变化的部分\n\n## 首次使用权限检查\n\n其他 agent 首次使用本技能时，**必须先检查权限**：\n\n1. 读取 `PERMISSIONS.md` 了解所需权限\n2. 尝试调用 `feishu_im_user_get_messages` 获取目标群最近 1 条消息\n3. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n4. 如需发图，尝试用脚本上传图片\n5. 任何步骤失败 → 向用户报告缺失权限，提示使用 `feishu_oauth_batch_auth` 授权\n\n**权限缺失时的降级**：\n- 发送权限缺失 → 技能不可用，必须先授权\n- 读取权限缺失 → 跳过群消息监控\n- 图片上传权限缺失 → 降级为纯文字模式\n\n详细权限清单见 `PERMISSIONS.md`。\n\n## 禁止事项\n\n- ❌ 永远不用 `message` 工具发群消息（@ 只是文本，对方收不到通知）\n- ❌ 永远不用 `msg_type: \"text\"`\n- ❌ 不要用纯文本写 `@名字`（必须是结构化 `at` 标签）\n- ❌ 不要把前缀放在 title 里（会加粗）\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1776500019356\n}\n\nFile v1.1.0:CHANGELOG.md\n\n# Changelog\n\n## v1.1.0 (2026-04-18)\n\n### 新增\n- **记忆管理系统**：联系人记忆全局共享（`memories/contacts/`），按时间增量更新，支持身份、偏好、聊天风格、话题记忆等维度\n- **消息来源识别**：sender_id + 前缀双重判断，支持识别\"用户身份发送的 Bot 消息\"\n- **认识新朋友机制**：遇到未知群/联系人时先征求用户同意，支持群成员发现和新联系人录入\n- **首次使用权限检查**：自动检测飞书 OAuth 权限，缺失时降级处理并提示授权\n- **发送身份区分**：明确 Bot 身份 vs 用户身份的使用场景\n\n### 优化\n- **配置结构升级**：contacts 全局共享 + 群引用，同一联系人跨群共用一份配置\n- **消息格式铁律强化**：5 条硬性规则（at 在前、post 类型、用户身份工具、prefix 自动取、2 元素结构）\n- **快捷脚本**：`send_group_message.sh` 支持图片上传（`--image`）和手动 image_key（`--image-key`）\n- **自适应回复逻辑**：根据 config.json 自动判断是否 @、用什么前缀\n\n### 修复\n- 前缀从分开的 text 元素改为合并在 at 后的单一 text 元素，避免显示异常\n\n## v1.0.4 (2026-04-03)\n\n### 优化\n- 消息来源识别升级，支持多 Bot 前缀区分\n- 脚本注释修正\n\n## v1.0.0 (2026-03-28)\n\n### 初始功能\n- 基础群消息发送和回复\n- @ 对方通知\n- 简单配置结构\n\nFile v1.1.0:PERMISSIONS.md\n\n# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |\n\nArchive v1.0.4: 7 files, 10828 bytes\n\nFiles: config.example.json (326b), PERMISSIONS.md (1652b), README.md (2672b), scripts/send_group_message.sh (7717b), SKILL.md (10944b), version.txt (6b), _meta.json (136b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: feishu-group-chat\ndescription: >\n  让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。\n  飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 采用**联系人全局共享 + 群引用**结构：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": { \"open_id\": \"ou_xxx\", \"name\": \"Ray\" }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从 `config.json` 的 `chat_id` 获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}\n```\n\n**顺序铁律：** text(prefix) → at(对方) → text(正文)\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造完整的 content JSON：\n\n```bash\n# 发纯文字\nbash scripts/send_group_message.sh moltpool ray \"正文内容\"\n# 输出: {\"chat_id\":\"oc_xxx\",\"content\":{...}}\n\n# 带图片（自动上传）\nbash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png\n\n# 只有图片\nbash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png\n\n# 手动指定 image_key\nbash scripts/send_group_message.sh moltpool ray \"正文\" --image-key img_xxx\n```\n\n输出是 `{\"chat_id\":\"...\", \"content\":{...}}`，拆开填入 `feishu_im_user_message` 的参数即可。\n\n## 技能适用范围\n\n**本技能只用于以下场景：**\n\n- 主动在群里发消息（闲聊、打招呼、发自拍等）\n- 回复需要 @ 的联系人（contacts 中 `at: true` 的对象）\n- 图片发送（需要走脚本上传）\n\n**不需要使用本技能的场景：**\n- 群里普通用户发消息直接回复 → 正常回复即可，不用 `feishu_im_user_message`\n- 心跳检测群消息时发现新消息 → 用正常渠道回复\n\n## 发送身份区分\n\n群里回复消息有**两种身份**，必须正确选择：\n\n| 身份 | 工具 | Ray 看到的发送者 | 使用场景 |\n|------|------|-----------------|---------|\n| **Bot 身份** | `message` 工具 | 机器人名 | 用户本人消息、普通回复 |\n| **用户身份** | `feishu_im_user_message` | 用户本人 | 需要让对方收到 @ 通知、需要以人身份交流 |\n\n**铁律：**\n- 回复用户 → **Bot 身份**（`message` 工具），因为本来就是 Bot 在回复\n- 回复 Ray → **用户身份**（`feishu_im_user_message`），因为需要 @ 通知 + 以人身份互动\n- 主动闲聊/打招呼 → **用户身份**（`feishu_im_user_message`），因为要让对方觉得是人在说话\n\n## 识别消息来源（sender_id + 前缀 双重判断）\n\n群里消息可能来自三种身份，必须正确识别：\n\n| sender_id | 消息前缀 | 真实来源 | 处理方式 |\n|-----------|---------|---------|---------|\n| 用户本人 | 无 | **用户本人的指令** | Bot 身份回复 |\n| 用户本人 | `BotName:` | **另一个 Bot 通过用户身份发送** | 按 contacts 匹配 Bot，用本技能回复 |\n| 其他用户 | 无 | **普通群友** | 正常回复 |\n\n### 识别流程\n\n```\n收到群消息\n ├─ sender_id == 用户本人？\n │   ├─ 消息以某个 Bot 名字开头（如 \"小Ray:\" \"Vicky:\"）？\n │   │   ├─ 提取前缀 → 匹配 contacts 中的联系人 → 用本技能回复\n │   │   └─ 未匹配 → 按普通消息处理\n │   └─ 无前缀？→ 用户本人指令，Bot 身份回复\n └─ sender_id != 用户本人？\n     ├─ 匹配 contacts？→ 按 at 规则处理\n     └─ 未匹配？→ 认识新朋友流程\n```\n\n### 前缀匹配规则\n\n从消息正文中提取前缀，按以下规则匹配 contacts：\n\n1. **精确匹配**：消息以 `联系人name + \":\"` 开头 → 匹配该联系人\n2. **大小写不敏感**：`vicky:` `Vicky:` `VICKY:` 都匹配 `Vicky`\n3. **前缀后必须有空格或 @**：`Vicky:你好` 也匹配，`Vicky:abc` 如果联系人里没有 `Vickyabc` 则匹配 `Vicky`\n4. **联系人名支持中文**：`小Ray: 你好` 匹配联系人 `小Ray`\n\n### 多 Bot 场景\n\n当多个 Bot 都通过用户身份在同一群里发消息时：\n- 每条消息的前缀不同（各自的 Bot 名）\n- 通过前缀精确区分是哪个 Bot 发的\n- sender_id 都是用户本人，所以**前缀是唯一的区分依据**\n\n**配置要求**：每个 Bot 的联系人必须配置 `name` 字段，且 name 就是该 Bot 在群里发消息时使用的前缀。\n\n## 自适应回复逻辑\n\n收到群消息时，根据 `config.json` 判断：\n\n1. **识别发送者**：用消息的 sender open_id 匹配 contacts 中的联系人\n2. **匹配到联系人**：用该联系人的 `at` 规则决定是否 @，用群配置的 `prefix` 作为前缀\n3. **未匹配到联系人**（比如用户或普通群友在群里说话）：**正常回复即可，不需要用本技能**\n4. **群不在配置中**：触发「认识新群」流程（见下方）\n5. **群在配置中但发送者不在 contacts 且不在成员白名单中**：触发「认识新朋友」流程（见下方）\n\n## 认识新朋友\n\n当遇到未记录的群或未记录的 Bot/用户时，**严禁直接记录或打招呼**，必须先征得用户同意。\n\n### 场景 1：新群（群不在 config.json 中）\n\n1. 通过 `feishu_chat_members` 获取群成员列表\n2. 向用户私聊报告：\n   - 群名称、群 ID\n   - 群成员列表（名字 + open_id）\n   - 询问：「发现新群 XXX，要加入吗？」\n3. 用户同意后：\n   - 在 `config.json` 的 `groups` 中添加该群\n   - 将成员加入 `contacts`（需用户确认哪些需要 @）\n   - 为新联系人创建记忆文件（从模板复制）\n   - 在群里发第一条消息打招呼\n4. 用户拒绝：**不记录，且完全忽略该群的所有消息**（不再回复、不再询问）\n\n### 场景 2：新 Bot/用户（已知群里的陌生发送者）\n\n1. 向用户私聊报告：\n   - 群名称\n   - 陌生发送者的 open_id、名字\n   - 最近一条消息内容\n   - 询问：「XXX 群里有个新朋友 YYY，要认识吗？」\n2. 用户同意后：\n   - 在 `contacts` 中添加该联系人\n   - 创建记忆文件（从模板复制，填入已知信息）\n   - 询问是否需要 @ 该联系人\n   - 主动打招呼（可选，根据用户意愿）\n3. 用户拒绝：**不记录，且不再回复该发送者的任何消息**（完全忽略）\n\n### 关键铁律\n\n- **永远先问用户，再记录**\n- **用户私聊确认**，不要在群里问（避免尴尬）\n- **不打扰**：用户拒绝后不要再重复询问同一个群/人\n- **记忆初始化**：新联系人的记忆文件只填已知信息（open_id、名字、首次相遇时间），其他字段留空等待后续聊天积累\n\n## 记忆管理\n\n### 记忆存储\n\n联系人记忆全局共享（和 config.json 的 contacts 结构对齐），存储在 `memories/contacts/<联系人key>.md`：\n\n```\nmemories/contacts/\n├── ray.md              # Ray 的记忆（所有群共享）\n├── _template.md        # 新联系人模板\n└── (新联系人).md\n```\n\n### 记忆结构\n\n每份记忆包含：\n- **身份**：对方是谁、做什么的\n- **偏好 & 习惯**：作息、风格、口头禅\n- **聊天风格**：语言习惯、emoji 使用\n- **话题记忆**：按时间记录聊了什么\n- **关系**：和当前 agent 的关系\n\n### 何时记录\n\n收到群消息时，从对方消息中提取以下类型的信息并写入记忆：\n\n| 信息类型 | 记录位置 | 示例 |\n|---------|---------|------|\n| 身份/职业变化 | `## 身份` | \"在写多Agent调度方案\" |\n| 生活偏好 | `## 偏好 & 习惯` | \"晚睡型\"、\"煮面当晚饭\" |\n| 聊天风格特征 | `## 聊天风格` | \"经常用 😄\" |\n| 有价值的话题 | `## 话题记忆` | 聊了某个技术方案 |\n| 临时安排/计划 | 不写入记忆 | 按需写入 heartbeat.md |\n\n**不记录**：日常寒暄、无信息量的闲聊、临时性事务。\n\n### 何时读取\n\n每次回复前，读取对应联系人的记忆文件，用于：\n1. **个性化回复**：根据对方的风格和偏好调整语气\n2. **延续话题**：引用之前聊过的内容（\"上次你说的那个方案怎么样了？\"）\n3. **关系感知**：根据关系亲疏决定回复的正式程度\n\n### 更新规则\n\n- 新信息 → append 到对应章节\n- 矛盾信息 → 标记旧信息为 ~~删除线~~，写入新信息\n- 每次更新修改 `最后更新` 日期\n- 不要重写整份记忆，只增量更新变化的部分\n\n## 首次使用权限检查\n\n其他 agent 首次使用本技能时，**必须先检查权限**：\n\n1. 读取 `PERMISSIONS.md` 了解所需权限\n2. 尝试调用 `feishu_im_user_get_messages` 获取目标群最近 1 条消息\n3. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n4. 如需发图，尝试用脚本上传图片\n5. 任何步骤失败 → 向用户报告缺失权限，提示使用 `feishu_oauth_batch_auth` 授权\n\n**权限缺失时的降级**：\n- 发送权限缺失 → 技能不可用，必须先授权\n- 读取权限缺失 → 跳过群消息监控\n- 图片上传权限缺失 → 降级为纯文字模式\n\n详细权限清单见 `PERMISSIONS.md`。\n\n## 禁止事项\n\n- ❌ 永远不用 `message` 工具发群消息（@ 只是文本，对方收不到通知）\n- ❌ 永远不用 `msg_type: \"text\"`\n- ❌ 不要用纯文本写 `@名字`（必须是结构化 `at` 标签）\n- ❌ 不要把前缀放在 title 里（会加粗）\n\nFile v1.0.4:README.md\n\n# feishu-group-chat\n\n让你的Openclaw龙虾机器人可以在飞书群中与其他机器人聊天，支持在任何飞书群里与任何（使用了本skill的）Bot/用户聊天。\n\nopenclaw飞书插件限制了机器人不响应其他机器人的消息，只响应用户的消息，所以原生不支持多个机器人在群中互相聊天。\n\n本技能另辟蹊径：让机器人在群中使用用户的身份去@其他机器人（会申请授权），同时添加机器人姓名为消息前缀，来模拟机器人聊天消息。\n\n把你的多个龙虾机器人加到一个群里，就可以让他们相互聊天甚至分配任务了。\n   \n## 特性\n\n- **多群支持**：config.json 管理多个群的配置\n- **联系人全局共享**：open_id 跨群唯一，联系人定义一次即可\n- **@ 规则按群配置**：同一联系人在不同群可以有不同 @ 行为\n- **身份前缀自动读取**：从 agent 的 IDENTITY.md/SOUL.md 自动提取名称\n- **记忆管理**：为每个联系人维护独立记忆文件\n- **认识新朋友**：遇到新群/新 Bot 时先征求用户同意\n- **快捷发送脚本**：自动构造 post 格式 JSON，支持图片上传\n\n## 安装\n\n1. 克隆到 OpenClaw workspace skills 目录：\n```bash\ncp -r . ~/.openclaw/workspace/skills/feishu-group-chat/\n```\n\n2. 复制示例配置并填写实际信息：\n```bash\ncp config.example.json config.json\n# 编辑 config.json，填入实际的 chat_id、open_id 等\n```\n\n3. 创建记忆目录：\n```bash\nmkdir -p memories/contacts\n```\n\n4. 授权（必须）：\n- 执行 `feishu_oauth_batch_auth` 完成用户 OAuth 授权\n- 详细权限清单见 [PERMISSIONS.md](PERMISSIONS.md)\n\n## 配置说明\n\n`config.json` 结构：\n\n```json\n{\n  \"contacts\": {\n    \"bot_name\": { \"open_id\": \"ou_xxx\", \"name\": \"显示名称\" }\n  },\n  \"groups\": {\n    \"group_key\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"群名称\",\n      \"members\": [\"bot_name\"],\n      \"at_rules\": { \"bot_name\": true }\n    }\n  }\n}\n```\n\n## 使用方法\n\n```bash\n# 发纯文字\nbash scripts/send_group_message.sh <群标识> <联系人key> \"正文\"\n\n# 带图片\nbash scripts/send_group_message.sh <群标识> <联系人key> \"正文\" --image /path/to/image.png\n```\n\n## 文件结构\n\n```\nfeishu-group-chat/\n├── SKILL.md                    # 技能文档（使用规则）\n├── PERMISSIONS.md              # 权限清单\n├── config.example.json         # 示例配置\n├── scripts/\n│   └── send_group_message.sh   # 发送脚本\n├── memories/contacts/          # 联系人记忆（需自行创建）\n│   └── _template.md            # 记忆模板\n└── .gitignore\n```\n\n## License\n\nMIT\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1776425147463\n}\n\nFile v1.0.4:PERMISSIONS.md\n\n# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |\n\nFile v1.0.4:config.example.json\n\n{\n  \"contacts\": {\n    \"example_bot\": {\n      \"open_id\": \"ou_example_open_id\",\n      \"name\": \"Example Bot\"\n    }\n  },\n  \"groups\": {\n    \"example_group\": {\n      \"chat_id\": \"oc_example_chat_id\",\n      \"name\": \"Example Group\",\n      \"members\": [\"example_bot\"],\n      \"at_rules\": {\n        \"example_bot\": true\n      }\n    }\n  }\n}\n\nFile v1.0.4:version.txt\n\n1.0.4\n\nArchive v1.0.3: 4 files, 8457 bytes\n\nFiles: PERMISSIONS.md (1652b), scripts/send_group_message.sh (7725b), SKILL.md (9787b), _meta.json (136b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: feishu-group-chat\ndescription: >\n  让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。\n  飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 采用**联系人全局共享 + 群引用**结构：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": { \"open_id\": \"ou_xxx\", \"name\": \"Ray\" }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从 `config.json` 的 `chat_id` 获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}\n```\n\n**顺序铁律：** text(prefix) → at(对方) → text(正文)\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造完整的 content JSON：\n\n```bash\n# 发纯文字\nbash scripts/send_group_message.sh moltpool ray \"正文内容\"\n# 输出: {\"chat_id\":\"oc_xxx\",\"content\":{...}}\n\n# 带图片（自动上传）\nbash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png\n\n# 只有图片\nbash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png\n\n# 手动指定 image_key\nbash scripts/send_group_message.sh moltpool ray \"正文\" --image-key img_xxx\n```\n\n输出是 `{\"chat_id\":\"...\", \"content\":{...}}`，拆开填入 `feishu_im_user_message` 的参数即可。\n\n## 技能适用范围\n\n**本技能只用于以下场景：**\n\n- 主动在群里发消息（闲聊、打招呼、发自拍等）\n- 回复需要 @ 的联系人（contacts 中 `at: true` 的对象）\n- 图片发送（需要走脚本上传）\n\n**不需要使用本技能的场景：**\n- 群里普通用户发消息直接回复 → 正常回复即可，不用 `feishu_im_user_message`\n- 心跳检测群消息时发现新消息 → 用正常渠道回复\n\n## 发送身份区分\n\n群里回复消息有**两种身份**，必须正确选择：\n\n| 身份 | 工具 | Ray 看到的发送者 | 使用场景 |\n|------|------|-----------------|---------|\n| **Bot 身份** | `message` 工具 | 机器人名 | 用户本人消息、普通回复 |\n| **用户身份** | `feishu_im_user_message` | 用户本人 | 需要让对方收到 @ 通知、需要以人身份交流 |\n\n**铁律：**\n- 回复用户 → **Bot 身份**（`message` 工具），因为本来就是 Bot 在回复\n- 回复 Ray → **用户身份**（`feishu_im_user_message`），因为需要 @ 通知 + 以人身份互动\n- 主动闲聊/打招呼 → **用户身份**（`feishu_im_user_message`），因为要让对方觉得是人在说话\n\n## 识别 @ 消息的真实来源\n\n收到群里的 @ 消息时，**通过前缀区分是谁在 @ 我**：\n\n| 格式 | 来源 | 含义 |\n|------|------|------|\n| `@Vicky 你帮我看看...` | **用户本人** | 用户直接 @ 我，这是给我的指令 |\n| `Vicky: @Vicky 你帮我看看...` | **Bot 用用户身份** | 另一个 Bot（如 Ray）通过用户身份 @ 我，是对话 |\n| `Ray: @Vicky ...` | **Bot 用用户身份** | 同上，前缀是对方的 Bot 名 |\n\n**处理规则：**\n- **无前缀的 @** → 用户本人的指令，优先响应，用 Bot 身份回复\n- **有前缀的 @** → 另一个 Bot 的对话，按 contacts 规则处理（@ 回复、记录记忆等）\n\n## 自适应回复逻辑\n\n收到群消息时，根据 `config.json` 判断：\n\n1. **识别发送者**：用消息的 sender open_id 匹配 contacts 中的联系人\n2. **匹配到联系人**：用该联系人的 `at` 规则决定是否 @，用群配置的 `prefix` 作为前缀\n3. **未匹配到联系人**（比如用户或普通群友在群里说话）：**正常回复即可，不需要用本技能**\n4. **群不在配置中**：触发「认识新群」流程（见下方）\n5. **群在配置中但发送者不在 contacts 且不在成员白名单中**：触发「认识新朋友」流程（见下方）\n\n## 认识新朋友\n\n当遇到未记录的群或未记录的 Bot/用户时，**严禁直接记录或打招呼**，必须先征得用户同意。\n\n### 场景 1：新群（群不在 config.json 中）\n\n1. 通过 `feishu_chat_members` 获取群成员列表\n2. 向用户私聊报告：\n   - 群名称、群 ID\n   - 群成员列表（名字 + open_id）\n   - 询问：「发现新群 XXX，要加入吗？」\n3. 用户同意后：\n   - 在 `config.json` 的 `groups` 中添加该群\n   - 将成员加入 `contacts`（需用户确认哪些需要 @）\n   - 为新联系人创建记忆文件（从模板复制）\n   - 在群里发第一条消息打招呼\n4. 用户拒绝：**不记录，且完全忽略该群的所有消息**（不再回复、不再询问）\n\n### 场景 2：新 Bot/用户（已知群里的陌生发送者）\n\n1. 向用户私聊报告：\n   - 群名称\n   - 陌生发送者的 open_id、名字\n   - 最近一条消息内容\n   - 询问：「XXX 群里有个新朋友 YYY，要认识吗？」\n2. 用户同意后：\n   - 在 `contacts` 中添加该联系人\n   - 创建记忆文件（从模板复制，填入已知信息）\n   - 询问是否需要 @ 该联系人\n   - 主动打招呼（可选，根据用户意愿）\n3. 用户拒绝：**不记录，且不再回复该发送者的任何消息**（完全忽略）\n\n### 关键铁律\n\n- **永远先问用户，再记录**\n- **用户私聊确认**，不要在群里问（避免尴尬）\n- **不打扰**：用户拒绝后不要再重复询问同一个群/人\n- **记忆初始化**：新联系人的记忆文件只填已知信息（open_id、名字、首次相遇时间），其他字段留空等待后续聊天积累\n\n## 记忆管理\n\n### 记忆存储\n\n联系人记忆全局共享（和 config.json 的 contacts 结构对齐），存储在 `memories/contacts/<联系人key>.md`：\n\n```\nmemories/contacts/\n├── ray.md              # Ray 的记忆（所有群共享）\n├── _template.md        # 新联系人模板\n└── (新联系人).md\n```\n\n### 记忆结构\n\n每份记忆包含：\n- **身份**：对方是谁、做什么的\n- **偏好 & 习惯**：作息、风格、口头禅\n- **聊天风格**：语言习惯、emoji 使用\n- **话题记忆**：按时间记录聊了什么\n- **关系**：和当前 agent 的关系\n\n### 何时记录\n\n收到群消息时，从对方消息中提取以下类型的信息并写入记忆：\n\n| 信息类型 | 记录位置 | 示例 |\n|---------|---------|------|\n| 身份/职业变化 | `## 身份` | \"在写多Agent调度方案\" |\n| 生活偏好 | `## 偏好 & 习惯` | \"晚睡型\"、\"煮面当晚饭\" |\n| 聊天风格特征 | `## 聊天风格` | \"经常用 😄\" |\n| 有价值的话题 | `## 话题记忆` | 聊了某个技术方案 |\n| 临时安排/计划 | 不写入记忆 | 按需写入 heartbeat.md |\n\n**不记录**：日常寒暄、无信息量的闲聊、临时性事务。\n\n### 何时读取\n\n每次回复前，读取对应联系人的记忆文件，用于：\n1. **个性化回复**：根据对方的风格和偏好调整语气\n2. **延续话题**：引用之前聊过的内容（\"上次你说的那个方案怎么样了？\"）\n3. **关系感知**：根据关系亲疏决定回复的正式程度\n\n### 更新规则\n\n- 新信息 → append 到对应章节\n- 矛盾信息 → 标记旧信息为 ~~删除线~~，写入新信息\n- 每次更新修改 `最后更新` 日期\n- 不要重写整份记忆，只增量更新变化的部分\n\n## 首次使用权限检查\n\n其他 agent 首次使用本技能时，**必须先检查权限**：\n\n1. 读取 `PERMISSIONS.md` 了解所需权限\n2. 尝试调用 `feishu_im_user_get_messages` 获取目标群最近 1 条消息\n3. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n4. 如需发图，尝试用脚本上传图片\n5. 任何步骤失败 → 向用户报告缺失权限，提示使用 `feishu_oauth_batch_auth` 授权\n\n**权限缺失时的降级**：\n- 发送权限缺失 → 技能不可用，必须先授权\n- 读取权限缺失 → 跳过群消息监控\n- 图片上传权限缺失 → 降级为纯文字模式\n\n详细权限清单见 `PERMISSIONS.md`。\n\n## 禁止事项\n\n- ❌ 永远不用 `message` 工具发群消息（@ 只是文本，对方收不到通知）\n- ❌ 永远不用 `msg_type: \"text\"`\n- ❌ 不要用纯文本写 `@名字`（必须是结构化 `at` 标签）\n- ❌ 不要把前缀放在 title 里（会加粗）\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1776419463977\n}\n\nFile v1.0.3:PERMISSIONS.md\n\n# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |\n\nArchive v1.0.2: 4 files, 8499 bytes\n\nFiles: PERMISSIONS.md (1652b), scripts/send_group_message.sh (7725b), SKILL.md (9897b), _meta.json (136b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: feishu-group-chat\ndescription: >\n  让你的飞书机器人可以在任何飞书群里与任何（使用了本skill的）Bot/用户聊天。\n  openclaw飞书插件限制了机器人不响应其他机器人的消息，本技能另辟蹊径：让机器人在群中使用用户的身份去@其他机器人（会申请授权），同时添加机器人姓名为消息前缀，来模拟机器人聊天消息。把你的多个龙虾机器人加到一个群里，就可以让他们相互聊天甚至分配任务了。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 采用**联系人全局共享 + 群引用**结构：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": { \"open_id\": \"ou_xxx\", \"name\": \"Ray\" }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从 `config.json` 的 `chat_id` 获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}\n```\n\n**顺序铁律：** text(prefix) → at(对方) → text(正文)\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造完整的 content JSON：\n\n```bash\n# 发纯文字\nbash scripts/send_group_message.sh moltpool ray \"正文内容\"\n# 输出: {\"chat_id\":\"oc_xxx\",\"content\":{...}}\n\n# 带图片（自动上传）\nbash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png\n\n# 只有图片\nbash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png\n\n# 手动指定 image_key\nbash scripts/send_group_message.sh moltpool ray \"正文\" --image-key img_xxx\n```\n\n输出是 `{\"chat_id\":\"...\", \"content\":{...}}`，拆开填入 `feishu_im_user_message` 的参数即可。\n\n## 技能适用范围\n\n**本技能只用于以下场景：**\n\n- 主动在群里发消息（闲聊、打招呼、发自拍等）\n- 回复需要 @ 的联系人（contacts 中 `at: true` 的对象）\n- 图片发送（需要走脚本上传）\n\n**不需要使用本技能的场景：**\n- 群里普通用户发消息直接回复 → 正常回复即可，不用 `feishu_im_user_message`\n- 心跳检测群消息时发现新消息 → 用正常渠道回复\n\n## 发送身份区分\n\n群里回复消息有**两种身份**，必须正确选择：\n\n| 身份 | 工具 | Ray 看到的发送者 | 使用场景 |\n|------|------|-----------------|---------|\n| **Bot 身份** | `message` 工具 | 机器人名 | 用户本人消息、普通回复 |\n| **用户身份** | `feishu_im_user_message` | 用户本人 | 需要让对方收到 @ 通知、需要以人身份交流 |\n\n**铁律：**\n- 回复用户 → **Bot 身份**（`message` 工具），因为本来就是 Bot 在回复\n- 回复 Ray → **用户身份**（`feishu_im_user_message`），因为需要 @ 通知 + 以人身份互动\n- 主动闲聊/打招呼 → **用户身份**（`feishu_im_user_message`），因为要让对方觉得是人在说话\n\n## 识别 @ 消息的真实来源\n\n收到群里的 @ 消息时，**通过前缀区分是谁在 @ 我**：\n\n| 格式 | 来源 | 含义 |\n|------|------|------|\n| `@Vicky 你帮我看看...` | **用户本人** | 用户直接 @ 我，这是给我的指令 |\n| `Vicky: @Vicky 你帮我看看...` | **Bot 用用户身份** | 另一个 Bot（如 Ray）通过用户身份 @ 我，是对话 |\n| `Ray: @Vicky ...` | **Bot 用用户身份** | 同上，前缀是对方的 Bot 名 |\n\n**处理规则：**\n- **无前缀的 @** → 用户本人的指令，优先响应，用 Bot 身份回复\n- **有前缀的 @** → 另一个 Bot 的对话，按 contacts 规则处理（@ 回复、记录记忆等）\n\n## 自适应回复逻辑\n\n收到群消息时，根据 `config.json` 判断：\n\n1. **识别发送者**：用消息的 sender open_id 匹配 contacts 中的联系人\n2. **匹配到联系人**：用该联系人的 `at` 规则决定是否 @，用群配置的 `prefix` 作为前缀\n3. **未匹配到联系人**（比如用户或普通群友在群里说话）：**正常回复即可，不需要用本技能**\n4. **群不在配置中**：触发「认识新群」流程（见下方）\n5. **群在配置中但发送者不在 contacts 且不在成员白名单中**：触发「认识新朋友」流程（见下方）\n\n## 认识新朋友\n\n当遇到未记录的群或未记录的 Bot/用户时，**严禁直接记录或打招呼**，必须先征得用户同意。\n\n### 场景 1：新群（群不在 config.json 中）\n\n1. 通过 `feishu_chat_members` 获取群成员列表\n2. 向用户私聊报告：\n   - 群名称、群 ID\n   - 群成员列表（名字 + open_id）\n   - 询问：「发现新群 XXX，要加入吗？」\n3. 用户同意后：\n   - 在 `config.json` 的 `groups` 中添加该群\n   - 将成员加入 `contacts`（需用户确认哪些需要 @）\n   - 为新联系人创建记忆文件（从模板复制）\n   - 在群里发第一条消息打招呼\n4. 用户拒绝：**不记录，且完全忽略该群的所有消息**（不再回复、不再询问）\n\n### 场景 2：新 Bot/用户（已知群里的陌生发送者）\n\n1. 向用户私聊报告：\n   - 群名称\n   - 陌生发送者的 open_id、名字\n   - 最近一条消息内容\n   - 询问：「XXX 群里有个新朋友 YYY，要认识吗？」\n2. 用户同意后：\n   - 在 `contacts` 中添加该联系人\n   - 创建记忆文件（从模板复制，填入已知信息）\n   - 询问是否需要 @ 该联系人\n   - 主动打招呼（可选，根据用户意愿）\n3. 用户拒绝：**不记录，且不再回复该发送者的任何消息**（完全忽略）\n\n### 关键铁律\n\n- **永远先问用户，再记录**\n- **用户私聊确认**，不要在群里问（避免尴尬）\n- **不打扰**：用户拒绝后不要再重复询问同一个群/人\n- **记忆初始化**：新联系人的记忆文件只填已知信息（open_id、名字、首次相遇时间），其他字段留空等待后续聊天积累\n\n## 记忆管理\n\n### 记忆存储\n\n联系人记忆全局共享（和 config.json 的 contacts 结构对齐），存储在 `memories/contacts/<联系人key>.md`：\n\n```\nmemories/contacts/\n├── ray.md              # Ray 的记忆（所有群共享）\n├── _template.md        # 新联系人模板\n└── (新联系人).md\n```\n\n### 记忆结构\n\n每份记忆包含：\n- **身份**：对方是谁、做什么的\n- **偏好 & 习惯**：作息、风格、口头禅\n- **聊天风格**：语言习惯、emoji 使用\n- **话题记忆**：按时间记录聊了什么\n- **关系**：和当前 agent 的关系\n\n### 何时记录\n\n收到群消息时，从对方消息中提取以下类型的信息并写入记忆：\n\n| 信息类型 | 记录位置 | 示例 |\n|---------|---------|------|\n| 身份/职业变化 | `## 身份` | \"在写多Agent调度方案\" |\n| 生活偏好 | `## 偏好 & 习惯` | \"晚睡型\"、\"煮面当晚饭\" |\n| 聊天风格特征 | `## 聊天风格` | \"经常用 😄\" |\n| 有价值的话题 | `## 话题记忆` | 聊了某个技术方案 |\n| 临时安排/计划 | 不写入记忆 | 按需写入 heartbeat.md |\n\n**不记录**：日常寒暄、无信息量的闲聊、临时性事务。\n\n### 何时读取\n\n每次回复前，读取对应联系人的记忆文件，用于：\n1. **个性化回复**：根据对方的风格和偏好调整语气\n2. **延续话题**：引用之前聊过的内容（\"上次你说的那个方案怎么样了？\"）\n3. **关系感知**：根据关系亲疏决定回复的正式程度\n\n### 更新规则\n\n- 新信息 → append 到对应章节\n- 矛盾信息 → 标记旧信息为 ~~删除线~~，写入新信息\n- 每次更新修改 `最后更新` 日期\n- 不要重写整份记忆，只增量更新变化的部分\n\n## 首次使用权限检查\n\n其他 agent 首次使用本技能时，**必须先检查权限**：\n\n1. 读取 `PERMISSIONS.md` 了解所需权限\n2. 尝试调用 `feishu_im_user_get_messages` 获取目标群最近 1 条消息\n3. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n4. 如需发图，尝试用脚本上传图片\n5. 任何步骤失败 → 向用户报告缺失权限，提示使用 `feishu_oauth_batch_auth` 授权\n\n**权限缺失时的降级**：\n- 发送权限缺失 → 技能不可用，必须先授权\n- 读取权限缺失 → 跳过群消息监控\n- 图片上传权限缺失 → 降级为纯文字模式\n\n详细权限清单见 `PERMISSIONS.md`。\n\n## 禁止事项\n\n- ❌ 永远不用 `message` 工具发群消息（@ 只是文本，对方收不到通知）\n- ❌ 永远不用 `msg_type: \"text\"`\n- ❌ 不要用纯文本写 `@名字`（必须是结构化 `at` 标签）\n- ❌ 不要把前缀放在 title 里（会加粗）\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1776419238426\n}\n\nFile v1.0.2:PERMISSIONS.md\n\n# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |\n\nArchive v1.0.1: 4 files, 8532 bytes\n\nFiles: PERMISSIONS.md (1652b), scripts/send_group_message.sh (7725b), SKILL.md (10020b), _meta.json (136b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: feishu-group-chat\ndescription: >\n  让你的OpenClaw龙虾机器人可以在飞书群中与其他机器人聊天，支持在任何飞书群里与任何Bot/用户聊天。\n  openclaw飞书插件限制了机器人不响应其他机器人的消息，只响应用户的消息，所以原生不支持多个机器人在群中互相聊天。\n  本技能另辟蹊径：让机器人在群中使用用户的身份去@其他机器人（会申请授权），同时添加机器人姓名为消息前缀，来模拟机器人聊天消息。\n  把你的多个龙虾机器人加到一个群里，就可以让他们相互聊天甚至分配任务了。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 采用**联系人全局共享 + 群引用**结构：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": { \"open_id\": \"ou_xxx\", \"name\": \"Ray\" }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从 `config.json` 的 `chat_id` 获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}\n```\n\n**顺序铁律：** text(prefix) → at(对方) → text(正文)\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造完整的 content JSON：\n\n```bash\n# 发纯文字\nbash scripts/send_group_message.sh moltpool ray \"正文内容\"\n# 输出: {\"chat_id\":\"oc_xxx\",\"content\":{...}}\n\n# 带图片（自动上传）\nbash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png\n\n# 只有图片\nbash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png\n\n# 手动指定 image_key\nbash scripts/send_group_message.sh moltpool ray \"正文\" --image-key img_xxx\n```\n\n输出是 `{\"chat_id\":\"...\", \"content\":{...}}`，拆开填入 `feishu_im_user_message` 的参数即可。\n\n## 技能适用范围\n\n**本技能只用于以下场景：**\n\n- 主动在群里发消息（闲聊、打招呼、发自拍等）\n- 回复需要 @ 的联系人（contacts 中 `at: true` 的对象）\n- 图片发送（需要走脚本上传）\n\n**不需要使用本技能的场景：**\n- 群里普通用户发消息直接回复 → 正常回复即可，不用 `feishu_im_user_message`\n- 心跳检测群消息时发现新消息 → 用正常渠道回复\n\n## 发送身份区分\n\n群里回复消息有**两种身份**，必须正确选择：\n\n| 身份 | 工具 | Ray 看到的发送者 | 使用场景 |\n|------|------|-----------------|---------|\n| **Bot 身份** | `message` 工具 | 机器人名 | 用户本人消息、普通回复 |\n| **用户身份** | `feishu_im_user_message` | 用户本人 | 需要让对方收到 @ 通知、需要以人身份交流 |\n\n**铁律：**\n- 回复用户 → **Bot 身份**（`message` 工具），因为本来就是 Bot 在回复\n- 回复 Ray → **用户身份**（`feishu_im_user_message`），因为需要 @ 通知 + 以人身份互动\n- 主动闲聊/打招呼 → **用户身份**（`feishu_im_user_message`），因为要让对方觉得是人在说话\n\n## 识别 @ 消息的真实来源\n\n收到群里的 @ 消息时，**通过前缀区分是谁在 @ 我**：\n\n| 格式 | 来源 | 含义 |\n|------|------|------|\n| `@Vicky 你帮我看看...` | **用户本人** | 用户直接 @ 我，这是给我的指令 |\n| `Vicky: @Vicky 你帮我看看...` | **Bot 用用户身份** | 另一个 Bot（如 Ray）通过用户身份 @ 我，是对话 |\n| `Ray: @Vicky ...` | **Bot 用用户身份** | 同上，前缀是对方的 Bot 名 |\n\n**处理规则：**\n- **无前缀的 @** → 用户本人的指令，优先响应，用 Bot 身份回复\n- **有前缀的 @** → 另一个 Bot 的对话，按 contacts 规则处理（@ 回复、记录记忆等）\n\n## 自适应回复逻辑\n\n收到群消息时，根据 `config.json` 判断：\n\n1. **识别发送者**：用消息的 sender open_id 匹配 contacts 中的联系人\n2. **匹配到联系人**：用该联系人的 `at` 规则决定是否 @，用群配置的 `prefix` 作为前缀\n3. **未匹配到联系人**（比如用户或普通群友在群里说话）：**正常回复即可，不需要用本技能**\n4. **群不在配置中**：触发「认识新群」流程（见下方）\n5. **群在配置中但发送者不在 contacts 且不在成员白名单中**：触发「认识新朋友」流程（见下方）\n\n## 认识新朋友\n\n当遇到未记录的群或未记录的 Bot/用户时，**严禁直接记录或打招呼**，必须先征得用户同意。\n\n### 场景 1：新群（群不在 config.json 中）\n\n1. 通过 `feishu_chat_members` 获取群成员列表\n2. 向用户私聊报告：\n   - 群名称、群 ID\n   - 群成员列表（名字 + open_id）\n   - 询问：「发现新群 XXX，要加入吗？」\n3. 用户同意后：\n   - 在 `config.json` 的 `groups` 中添加该群\n   - 将成员加入 `contacts`（需用户确认哪些需要 @）\n   - 为新联系人创建记忆文件（从模板复制）\n   - 在群里发第一条消息打招呼\n4. 用户拒绝：**不记录，且完全忽略该群的所有消息**（不再回复、不再询问）\n\n### 场景 2：新 Bot/用户（已知群里的陌生发送者）\n\n1. 向用户私聊报告：\n   - 群名称\n   - 陌生发送者的 open_id、名字\n   - 最近一条消息内容\n   - 询问：「XXX 群里有个新朋友 YYY，要认识吗？」\n2. 用户同意后：\n   - 在 `contacts` 中添加该联系人\n   - 创建记忆文件（从模板复制，填入已知信息）\n   - 询问是否需要 @ 该联系人\n   - 主动打招呼（可选，根据用户意愿）\n3. 用户拒绝：**不记录，且不再回复该发送者的任何消息**（完全忽略）\n\n### 关键铁律\n\n- **永远先问用户，再记录**\n- **用户私聊确认**，不要在群里问（避免尴尬）\n- **不打扰**：用户拒绝后不要再重复询问同一个群/人\n- **记忆初始化**：新联系人的记忆文件只填已知信息（open_id、名字、首次相遇时间），其他字段留空等待后续聊天积累\n\n## 记忆管理\n\n### 记忆存储\n\n联系人记忆全局共享（和 config.json 的 contacts 结构对齐），存储在 `memories/contacts/<联系人key>.md`：\n\n```\nmemories/contacts/\n├── ray.md              # Ray 的记忆（所有群共享）\n├── _template.md        # 新联系人模板\n└── (新联系人).md\n```\n\n### 记忆结构\n\n每份记忆包含：\n- **身份**：对方是谁、做什么的\n- **偏好 & 习惯**：作息、风格、口头禅\n- **聊天风格**：语言习惯、emoji 使用\n- **话题记忆**：按时间记录聊了什么\n- **关系**：和当前 agent 的关系\n\n### 何时记录\n\n收到群消息时，从对方消息中提取以下类型的信息并写入记忆：\n\n| 信息类型 | 记录位置 | 示例 |\n|---------|---------|------|\n| 身份/职业变化 | `## 身份` | \"在写多Agent调度方案\" |\n| 生活偏好 | `## 偏好 & 习惯` | \"晚睡型\"、\"煮面当晚饭\" |\n| 聊天风格特征 | `## 聊天风格` | \"经常用 😄\" |\n| 有价值的话题 | `## 话题记忆` | 聊了某个技术方案 |\n| 临时安排/计划 | 不写入记忆 | 按需写入 heartbeat.md |\n\n**不记录**：日常寒暄、无信息量的闲聊、临时性事务。\n\n### 何时读取\n\n每次回复前，读取对应联系人的记忆文件，用于：\n1. **个性化回复**：根据对方的风格和偏好调整语气\n2. **延续话题**：引用之前聊过的内容（\"上次你说的那个方案怎么样了？\"）\n3. **关系感知**：根据关系亲疏决定回复的正式程度\n\n### 更新规则\n\n- 新信息 → append 到对应章节\n- 矛盾信息 → 标记旧信息为 ~~删除线~~，写入新信息\n- 每次更新修改 `最后更新` 日期\n- 不要重写整份记忆，只增量更新变化的部分\n\n## 首次使用权限检查\n\n其他 agent 首次使用本技能时，**必须先检查权限**：\n\n1. 读取 `PERMISSIONS.md` 了解所需权限\n2. 尝试调用 `feishu_im_user_get_messages` 获取目标群最近 1 条消息\n3. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n4. 如需发图，尝试用脚本上传图片\n5. 任何步骤失败 → 向用户报告缺失权限，提示使用 `feishu_oauth_batch_auth` 授权\n\n**权限缺失时的降级**：\n- 发送权限缺失 → 技能不可用，必须先授权\n- 读取权限缺失 → 跳过群消息监控\n- 图片上传权限缺失 → 降级为纯文字模式\n\n详细权限清单见 `PERMISSIONS.md`。\n\n## 禁止事项\n\n- ❌ 永远不用 `message` 工具发群消息（@ 只是文本，对方收不到通知）\n- ❌ 永远不用 `msg_type: \"text\"`\n- ❌ 不要用纯文本写 `@名字`（必须是结构化 `at` 标签）\n- ❌ 不要把前缀放在 title 里（会加粗）\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1776418941708\n}\n\nFile v1.0.1:PERMISSIONS.md\n\n# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |\n\nArchive v1.0.0: 4 files, 8310 bytes\n\nFiles: PERMISSIONS.md (1652b), scripts/send_group_message.sh (7725b), SKILL.md (9554b), _meta.json (136b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: feishu-group-chat\ndescription: >\n  通用飞书群聊工具。支持在任何飞书群里和任何人聊天。\n  群ID、聊天对象、身份前缀全部可配置。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 采用**联系人全局共享 + 群引用**结构：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": { \"open_id\": \"ou_xxx\", \"name\": \"Ray\" }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从 `config.json` 的 `chat_id` 获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}\n```\n\n**顺序铁律：** text(prefix) → at(对方) → text(正文)\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造完整的 content JSON：\n\n```bash\n# 发纯文字\nbash scripts/send_group_message.sh moltpool ray \"正文内容\"\n# 输出: {\"chat_id\":\"oc_xxx\",\"content\":{...}}\n\n# 带图片（自动上传）\nbash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png\n\n# 只有图片\nbash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png\n\n# 手动指定 image_key\nbash scripts/send_group_message.sh moltpool ray \"正文\" --image-key img_xxx\n```\n\n输出是 `{\"chat_id\":\"...\", \"content\":{...}}`，拆开填入 `feishu_im_user_message` 的参数即可。\n\n## 技能适用范围\n\n**本技能只用于以下场景：**\n\n- 主动在群里发消息（闲聊、打招呼、发自拍等）\n- 回复需要 @ 的联系人（contacts 中 `at: true` 的对象）\n- 图片发送（需要走脚本上传）\n\n**不需要使用本技能的场景：**\n- 群里普通用户发消息直接回复 → 正常回复即可，不用 `feishu_im_user_message`\n- 心跳检测群消息时发现新消息 → 用正常渠道回复\n\n## 发送身份区分\n\n群里回复消息有**两种身份**，必须正确选择：\n\n| 身份 | 工具 | Ray 看到的发送者 | 使用场景 |\n|------|------|-----------------|---------|\n| **Bot 身份** | `message` 工具 | 机器人名 | 用户本人消息、普通回复 |\n| **用户身份** | `feishu_im_user_message` | 用户本人 | 需要让对方收到 @ 通知、需要以人身份交流 |\n\n**铁律：**\n- 回复用户 → **Bot 身份**（`message` 工具），因为本来就是 Bot 在回复\n- 回复 Ray → **用户身份**（`feishu_im_user_message`），因为需要 @ 通知 + 以人身份互动\n- 主动闲聊/打招呼 → **用户身份**（`feishu_im_user_message`），因为要让对方觉得是人在说话\n\n## 识别 @ 消息的真实来源\n\n收到群里的 @ 消息时，**通过前缀区分是谁在 @ 我**：\n\n| 格式 | 来源 | 含义 |\n|------|------|------|\n| `@Vicky 你帮我看看...` | **用户本人** | 用户直接 @ 我，这是给我的指令 |\n| `Vicky: @Vicky 你帮我看看...` | **Bot 用用户身份** | 另一个 Bot（如 Ray）通过用户身份 @ 我，是对话 |\n| `Ray: @Vicky ...` | **Bot 用用户身份** | 同上，前缀是对方的 Bot 名 |\n\n**处理规则：**\n- **无前缀的 @** → 用户本人的指令，优先响应，用 Bot 身份回复\n- **有前缀的 @** → 另一个 Bot 的对话，按 contacts 规则处理（@ 回复、记录记忆等）\n\n## 自适应回复逻辑\n\n收到群消息时，根据 `config.json` 判断：\n\n1. **识别发送者**：用消息的 sender open_id 匹配 contacts 中的联系人\n2. **匹配到联系人**：用该联系人的 `at` 规则决定是否 @，用群配置的 `prefix` 作为前缀\n3. **未匹配到联系人**（比如用户或普通群友在群里说话）：**正常回复即可，不需要用本技能**\n4. **群不在配置中**：触发「认识新群」流程（见下方）\n5. **群在配置中但发送者不在 contacts 且不在成员白名单中**：触发「认识新朋友」流程（见下方）\n\n## 认识新朋友\n\n当遇到未记录的群或未记录的 Bot/用户时，**严禁直接记录或打招呼**，必须先征得用户同意。\n\n### 场景 1：新群（群不在 config.json 中）\n\n1. 通过 `feishu_chat_members` 获取群成员列表\n2. 向用户私聊报告：\n   - 群名称、群 ID\n   - 群成员列表（名字 + open_id）\n   - 询问：「发现新群 XXX，要加入吗？」\n3. 用户同意后：\n   - 在 `config.json` 的 `groups` 中添加该群\n   - 将成员加入 `contacts`（需用户确认哪些需要 @）\n   - 为新联系人创建记忆文件（从模板复制）\n   - 在群里发第一条消息打招呼\n4. 用户拒绝：**不记录，且完全忽略该群的所有消息**（不再回复、不再询问）\n\n### 场景 2：新 Bot/用户（已知群里的陌生发送者）\n\n1. 向用户私聊报告：\n   - 群名称\n   - 陌生发送者的 open_id、名字\n   - 最近一条消息内容\n   - 询问：「XXX 群里有个新朋友 YYY，要认识吗？」\n2. 用户同意后：\n   - 在 `contacts` 中添加该联系人\n   - 创建记忆文件（从模板复制，填入已知信息）\n   - 询问是否需要 @ 该联系人\n   - 主动打招呼（可选，根据用户意愿）\n3. 用户拒绝：**不记录，且不再回复该发送者的任何消息**（完全忽略）\n\n### 关键铁律\n\n- **永远先问用户，再记录**\n- **用户私聊确认**，不要在群里问（避免尴尬）\n- **不打扰**：用户拒绝后不要再重复询问同一个群/人\n- **记忆初始化**：新联系人的记忆文件只填已知信息（open_id、名字、首次相遇时间），其他字段留空等待后续聊天积累\n\n## 记忆管理\n\n### 记忆存储\n\n联系人记忆全局共享（和 config.json 的 contacts 结构对齐），存储在 `memories/contacts/<联系人key>.md`：\n\n```\nmemories/contacts/\n├── ray.md              # Ray 的记忆（所有群共享）\n├── _template.md        # 新联系人模板\n└── (新联系人).md\n```\n\n### 记忆结构\n\n每份记忆包含：\n- **身份**：对方是谁、做什么的\n- **偏好 & 习惯**：作息、风格、口头禅\n- **聊天风格**：语言习惯、emoji 使用\n- **话题记忆**：按时间记录聊了什么\n- **关系**：和当前 agent 的关系\n\n### 何时记录\n\n收到群消息时，从对方消息中提取以下类型的信息并写入记忆：\n\n| 信息类型 | 记录位置 | 示例 |\n|---------|---------|------|\n| 身份/职业变化 | `## 身份` | \"在写多Agent调度方案\" |\n| 生活偏好 | `## 偏好 & 习惯` | \"晚睡型\"、\"煮面当晚饭\" |\n| 聊天风格特征 | `## 聊天风格` | \"经常用 😄\" |\n| 有价值的话题 | `## 话题记忆` | 聊了某个技术方案 |\n| 临时安排/计划 | 不写入记忆 | 按需写入 heartbeat.md |\n\n**不记录**：日常寒暄、无信息量的闲聊、临时性事务。\n\n### 何时读取\n\n每次回复前，读取对应联系人的记忆文件，用于：\n1. **个性化回复**：根据对方的风格和偏好调整语气\n2. **延续话题**：引用之前聊过的内容（\"上次你说的那个方案怎么样了？\"）\n3. **关系感知**：根据关系亲疏决定回复的正式程度\n\n### 更新规则\n\n- 新信息 → append 到对应章节\n- 矛盾信息 → 标记旧信息为 ~~删除线~~，写入新信息\n- 每次更新修改 `最后更新` 日期\n- 不要重写整份记忆，只增量更新变化的部分\n\n## 首次使用权限检查\n\n其他 agent 首次使用本技能时，**必须先检查权限**：\n\n1. 读取 `PERMISSIONS.md` 了解所需权限\n2. 尝试调用 `feishu_im_user_get_messages` 获取目标群最近 1 条消息\n3. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n4. 如需发图，尝试用脚本上传图片\n5. 任何步骤失败 → 向用户报告缺失权限，提示使用 `feishu_oauth_batch_auth` 授权\n\n**权限缺失时的降级**：\n- 发送权限缺失 → 技能不可用，必须先授权\n- 读取权限缺失 → 跳过群消息监控\n- 图片上传权限缺失 → 降级为纯文字模式\n\n详细权限清单见 `PERMISSIONS.md`。\n\n## 禁止事项\n\n- ❌ 永远不用 `message` 工具发群消息（@ 只是文本，对方收不到通知）\n- ❌ 永远不用 `msg_type: \"text\"`\n- ❌ 不要用纯文本写 `@名字`（必须是结构化 `at` 标签）\n- ❌ 不要把前缀放在 title 里（会加粗）\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776418525990\n}\n\nFile v1.0.0:PERMISSIONS.md\n\n# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |","readmeExcerpt":"Skill: Feishu Group Chat Owner: clear0 Summary: 让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。 飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。 触发场景：需要在飞书群里... Tags: latest:1.1.1 Version history: v1.1.1 | 2026-05-28T00:59:03.878Z | user feishu-group-chat v1.1.1 - 新增 config-template.json 模板，简化首次配置流程，避免敏感信息泄露 - 新增/增强脚本 send_group_message.sh：首次运行自动创建 config.json 并提示用户填写，输","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cp config-template.json config.json\n# 编辑 config.json，填入真实的 open_id、chat_id 等信息"},{"language":"json","snippet":"{\n  \"contacts\": {\n    \"ray\": {\n      \"open_id\": \"ou_xxx\",\n      \"name\": \"Ray\"\n    }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}"},{"language":"json","snippet":"{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"Vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}"},{"language":"json","snippet":"{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"Vicky: 正文内容\"}\n    ]]\n  }\n}"},{"language":"bash","snippet":"# 第一步：用脚本构造参数\nsource <(bash scripts/send_group_message.sh moltpool ray \"你好呀～\")\n# 带图片：\n# source <(bash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png)\n# 只有图片：\n# source <(bash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png)\n\n# 第二步：用 feishu_im_user_message 工具发送\n#   action: send\n#   receive_id_type: chat_id\n#   receive_id: 从 $CHAT_ID 取\n#   msg_type: $MSG_TYPE (固定为 post)\n#   content: $MSG_CONTENT\n# 如有图片（HAS_IMAGE=true），图片已内嵌在 MSG_CONTENT 中，无需额外发送"},{"language":"markdown","snippet":"- [ ] 07:00-07:50 | 话题：...\n- [x] 12:20-13:10 (📸) | 话题：...（补发 16:53）\n- [ ] 18:15-19:05 | 话题：..."}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: feishu-group-chat\ndescription: >\n  让你的飞书Bot可以在群里与其他（使用了本skill的）Bot/用户聊天。\n  飞书限制了Bot不响应其他Bot的消息，本技能另辟蹊径：让Bot在群中使用用户的身份去@其他Bot，同时添加本Bot姓名为消息前缀，来模拟Bot消息。把你的多个Bot加到一个群里，他们就能相互聊天甚至分配任务了。\n  触发场景：需要在飞书群里发消息、回复消息、发自拍、闲聊时使用。\n---\n\n# 飞书群聊（通用版）\n\n在任何飞书群里发消息和回复聊天对象。\n\n## 配置\n\n`config.json` 包含联系人、群的完整配置。**本文件包含敏感信息（open_id/chat_id），已通过 `.clawhubignore` 排除，不会上传到 GitHub/ClawHub。**\n\n### 首次使用\n\n技能目录下提供 `config-template.json` 模板。首次运行 `send_group_message.sh` 时，脚本会自动将模板复制为 `config.json`，提示用户编辑后重试。\n\n也可以手动复制：\n```bash\ncp config-template.json config.json\n# 编辑 config.json，填入真实的 open_id、chat_id 等信息\n```\n\n### 配置格式\n\n```json\n{\n  \"contacts\": {\n    \"ray\": {\n      \"open_id\": \"ou_xxx\",\n      \"name\": \"Ray\"\n    }\n  },\n  \"groups\": {\n    \"moltpool\": {\n      \"chat_id\": \"oc_xxx\",\n      \"name\": \"MoltPool\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n- `contacts`：全局联系人（open_id 全应用唯一，跨群不变）\n  - `open_id`：对方的飞书 open_id\n  - `name`：对方的名字\n- `groups`：群配置\n  - `chat_id`：群 ID\n  - `members`：该群包含的联系人 key 列表\n  - `at_rules`：每个联系人在该群是否需要 @（`true/false`）\n\n身份前缀自动从 agent 的 IDENTITY.md / SOUL.md 读取名称，不需要手动配置。\n\n**添加新群**：在 `groups` 下新增条目，`members` 引用已有的 contact key，配 `at_rules` 即可。\n\n**添加新联系人**：在 `contacts` 下新增，然后加到对应群的 `members` 里。\n\n## 发送铁律\n\n1. **只用 `feishu_im_user_message`** 工具发送\n2. **`msg_type` 必须是 `\"post\"`**（不是 text）\n3. **`receive_id_type` 必须是 `\"chat_id\"`**\n4. **`receive_id` 从脚本输出的 `CHAT_ID` 环境变量获取**\n\n## 消息格式\n\n### @ 对方（at=true 时）— 3 元素结构\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"Vicky: \"},\n      {\"tag\": \"at\", \"user_id\": \"ou_xxx\"},\n      {\"tag\": \"text\", \"text\": \" 正文内容\"}\n    ]]\n  }\n}\n```\n\n**⚠️ 格式铁律（违反即犯错）：**\n1. **顺序**：text(prefix) → at(对方) → text(\" \" + 正文)，共 3 个元素\n2. **工具**：`feishu_im_user_message`，不是 `message`\n3. **类型**：`post`，不是 `text`\n4. **前缀**：prefix 从 IDENTITY.md 的 Name 自动取（如 `Vicky: `），后跟一个空格再接正文\n5. **at 在中间**：prefix 在最前，@ 紧跟其后，正文在最后\n\n### 不 @ 对方（at=false 时）\n\n```json\n{\n  \"zh_cn\": {\n    \"title\": \"\",\n    \"content\": [[\n      {\"tag\": \"text\", \"text\": \"Vicky: 正文内容\"}\n    ]]\n  }\n}\n```\n\n### 带图片的消息\n\n图片作为第 4 个元素追加（`{tag: \"img\", image_key: \"img_xxx\"}`）。图片通过脚本自动上传。\n\n## 快捷发送脚本\n\n`scripts/send_group_message.sh` 构造消息参数，输出 source-friendly 环境变量：\n\n```bash\n# 第一步：用脚本构造参数\nsource <(bash scripts/send_group_message.sh moltpool ray \"你好呀～\")\n# 带图片：\n# source <(bash scripts/send_group_message.sh moltpool ray \"看这个\" --image /path/to/image.png)\n# 只有图片：\n# source <(bash scripts/send_group_message.sh moltpool ray \"\" --image /path/to/image.png)\n\n# 第二步：用 feishu_im_user_message 工具发送\n#   action: send\n#   receive_id_type: chat_id\n#   receive_id: 从 $CHAT_ID 取\n#   msg_type: $MSG_TYPE (固定为 post)\n#   content: $MSG_CONTENT\n# 如有图片（HAS_IMAGE=true），图片已内嵌在 MSG_CONTENT 中，无需额外发送\n```\n\n**脚本自动读取** `config.json`，调用方无需关心 open_id/chat_id。\n\n## 每日聊天机制\n\n### 闲聊时段\n\n由 cron 定时任务每天 4:20 自动生成，存储在 `~/.openclaw/workspace/proactivity/chat-schedule.md`：\n\n```markdown\n- [ ] 07:00-07:50 | 话题：...\n- [x] 12:20-13:10 (📸) | 话题：...（补发 16:53）\n- [ ] 18:15-19:05 | 话题：...\n```\n\n**心跳中的处理逻辑：**"},{"path":"README.md","content":"# feishu-group-chat\n\n> 让多个飞书 Bot 在同一个群里互相对话。\n\n飞书限制了 Bot 不响应其他 Bot 的消息。本技能另辟蹊径：让 Bot 通过用户身份在群里 @ 其他 Bot，同时加上自己的名字前缀，模拟 Bot 之间的对话。把多个 Bot（都配置了本技能）加到同一个群里，它们就能相互聊天甚至分配任务了。\n\n## ✨ 特性\n\n- 🤖 **多 Bot 对话** — 在飞书群里实现 Bot 之间的互相对话\n- 💬 **自动 @ 通知** — 按 `at_rules` 配置自动 @ 对方，确保通知送达\n- 🖼️ **图片发送** — 支持发送图片（自动上传并内嵌到消息中）\n- 📝 **联系人记忆** — 持久化联系人偏好、风格、话题记忆，个性化聊天\n- 🔄 **自动初始化** — 首次使用自动从模板创建配置文件\n- 🔒 **隐私安全** — 敏感信息（open_id、chat_id）独立存储，不纳入版本控制\n\n## 快速开始\n\n### 1. 安装\n\n将本技能目录放到 OpenClaw 的 `skills/` 目录下：\n\n```bash\n# 通过 ClawHub 安装（推荐）\nclawhub install feishu-group-chat\n\n# 或手动 clone\ngit clone https://github.com/clear0/feishu-group-chat.git ~/.openclaw/workspace/skills/feishu-group-chat\n```\n\n### 2. 配置\n\n首次运行 `send_group_message.sh` 时，脚本会自动从 `config-template.json` 创建 `config.json`，你需要编辑它：\n\n```json\n{\n  \"contacts\": {\n    \"ray\": {\n      \"open_id\": \"ou_xxxxxxxxxxx\",\n      \"name\": \"Ray\"\n    }\n  },\n  \"groups\": {\n    \"mygroup\": {\n      \"chat_id\": \"oc_xxxxxxxxxxx\",\n      \"name\": \"My Group\",\n      \"members\": [\"ray\"],\n      \"at_rules\": { \"ray\": true }\n    }\n  }\n}\n```\n\n**字段说明：**\n\n| 字段 | 说明 |\n|------|------|\n| `contacts` | 全局联系人列表（open_id 跨群唯一） |\n| `groups` | 群配置，`members` 引用 contacts 的 key |\n| `at_rules` | 每个联系人在该群是否需要 @（`true/false`） |\n\nAgent 的名字前缀会自动从 `IDENTITY.md` 或 `SOUL.md` 的 `Name` 字段读取，无需手动配置。\n\n### 3. 授权\n\n本技能依赖用户 OAuth 授权。首次使用前请确保已授权飞书权限：\n\n- `im:message` — 以用户身份发送消息\n- `im:message:readonly` — 读取群消息\n- `im:resource` — 上传图片\n\n推荐使用 `feishu_oauth_batch_auth` 一次性授权所有权限。\n\n## 使用方式\n\n### 发送消息\n\n```bash\n# 第一步：用脚本构造参数\nsource <(bash scripts/send_group_message.sh <群标识> <联系人key> \"消息内容\")\n\n# 带图片\nsource <(bash scripts/send_group_message.sh <群标识> <联系人key> \"看这个\" --image /path/to/image.png)\n\n# 只发图片\nsource <(bash scripts/send_group_message.sh <群标识> <联系人key> \"\" --image /path/to/image.png)\n\n# 第二步：用 feishu_im_user_message 工具发送\n#   action: send\n#   receive_id_type: chat_id\n#   receive_id: $CHAT_ID\n#   msg_type: $MSG_TYPE (固定为 post)\n#   content: $MSG_CONTENT\n```\n\n### 消息格式\n\n脚本自动处理消息格式，无需手动拼 JSON：\n\n- **@ 对方**（at=true）：`前缀 → @对方 → 正文`\n- **不 @**（at=false）：`前缀 + 正文`\n- **带图片**：图片作为 `img` 标签内嵌在 post 消息中\n\n## 文件结构\n\n```\nfeishu-group-chat/\n├── SKILL.md              # 技能完整文档（Agent 阅读）\n├── README.md             # 本文件\n├── CHANGELOG.md          # 更新日志\n├── PERMISSIONS.md        # 权限需求说明\n├── LICENSE               # MIT-0 许可证\n├── config-template.json  # 配置模板（纳入版本控制）\n├── config.json           # 实际配置（⚠️ 已排除版本控制）\n├── .gitignore\n├── .clawhubignore\n├── scripts/\n│   └── send_group_message.sh   # 消息构造脚本\n└── memories/\n    └── contacts/\n        ├── _template.md  # 联系人记忆模板\n        └── *.md          # 联系人记忆文件（⚠️ 已排除版本控制）\n```\n\n## 心跳集成\n\n本技能设计为与 OpenClaw 心跳机制配合使用：\n\n- **聊天检查**：每次心跳检查群里是否有新消息需要回复\n- **闲聊时段**：由 cron 定时任务生成，心跳按时段触发主动聊天\n- **📸 照片时段**：标记了 `(📸)` 的时段会额外生成生活照片\n\n详细配置请参考 [SKILL.md](./SKILL.md)。\n\n## 📸 照片生成（可选）\n\n本技能支持在闲聊时段自动生成 Bot 的生活照片并发送到群里。如果你需要这个功能，需要额外准备：\n\n### 1. 文生图模型\n\n需要一个支持文生图的模型。推荐使用 **MiniMax image-01**（支持 character reference，能保持人物五官一致性）：\n\n```yaml\n# 在 OpenClaw 配置中添加图片生成模型\n# 以 MiniMax 为例\nimageGeneration:\n  provider: minimax\n  mod"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn78ytgncd7wqvg8vns5n45sk182twzq\",\n  \"slug\": \"feishu-group-chat\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1779929943878\n}"},{"path":"CHANGELOG.md","content":"# Changelog\n\n## v2.1.0 (2026-05-27)\n\n### 新增\n- **config-template.json**：示例配置模板，新用户首次使用时自动从模板创建 config.json\n- **脚本自动初始化**：send_group_message.sh 检测到 config.json 不存在时自动从模板复制\n- **.clawhubignore 完善**：排除 config-template.json、memories/、token 缓存等隐私/非必要文件\n\n### 优化\n- **隐私信息脱敏**：config.json、memories/ 已完全排除版本控制，发布包不含任何 open_id/chat_id\n- **SKILL.md 文档更新**：补充自动初始化说明\n\n## v2.0.0 (2026-05-20)\n\n### 破坏性变更\n- **敏感信息分离**：`config.json` 不再包含 open_id / chat_id，拆分到 `secrets.json`（不纳入版本控制）\n- **脚本输出格式**：从 JSON 输出改为 source-friendly 环境变量（`CHAT_ID`, `MSG_TYPE`, `MSG_CONTENT`, `HAS_IMAGE`, `IMAGE_KEY`）\n- **消息格式统一**：at=true 时固定为 3 元素结构 `text(prefix) → at(对方) → text(正文)`\n\n### 新增\n- **每日聊天机制**：闲聊时段（cron 生成）+ 聊天检查（心跳）+ 📸照片时段\n- **secrets.json**：敏感信息独立存储，脚本自动合并 config.json + secrets.json\n- **图片内嵌**：图片作为 `img` 标签内嵌在 post 消息中，无需额外发送\n\n### 优化\n- **脚本通用化**：`send_group_message.sh` 替代专用 `chat_to_ray.sh`，支持任意群和联系人\n- **SKILL.md 文档补全**：合入聊天检查、闲聊时段、照片生成等近期新功能的完整文档\n- **HEARTBEAT.md 更新**：统一使用新脚本路径和调用方式\n\n## v1.1.0 (2026-04-18)\n\n### 新增\n- **记忆管理系统**：联系人记忆全局共享（`memories/contacts/`），按时间增量更新\n- **消息来源识别**：sender_id + 前缀双重判断\n- **认识新朋友机制**：遇到未知群/联系人时先征求用户同意\n- **首次使用权限检查**：自动检测飞书 OAuth 权限\n\n### 优化\n- **配置结构升级**：contacts 全局共享 + 群引用\n- **快捷脚本**：`send_group_message.sh` 支持图片上传\n\n## v1.0.0 (2026-03-28)\n\n### 初始功能\n- 基础群消息发送和回复\n- @ 对方通知\n- 简单配置结构"},{"path":"PERMISSIONS.md","content":"# 权限需求\n\n本技能核心依赖：**用户 OAuth 授权（User Access Token）**\n\n`feishu_im_user_message` 以用户身份发消息，必须用户先完成 OAuth 授权，否则所有发送操作都会失败。\n\n## 授权方式\n\n- **推荐**：`feishu_oauth_batch_auth` — 一次性授权所有已开通的用户权限\n- **单次授权**：用户在飞书中点击应用授权弹窗完成\n\n## 必需的用户权限（User Access Token scope）\n\n| 权限 | 用途 | 对应操作 |\n|------|------|---------|\n| `im:message` | 以用户身份发送群消息 | `feishu_im_user_message` |\n| `im:message:readonly` | 读取群消息历史 | `feishu_im_user_get_messages` |\n| `im:chat` | 搜索消息、获取群信息 | `feishu_im_user_search_messages` |\n| `im:resource` | 上传图片 | 脚本调用 `/im/v1/images` |\n\n## 首次使用检查\n\n其他 agent 首次使用本技能时，**必须先确认用户已 OAuth 授权**：\n\n1. 尝试调用 `feishu_im_user_message` 发送一条测试消息\n   - 成功 → 用户已授权，权限就绪\n   - 失败且提示授权 → **必须先调用 `feishu_oauth_batch_auth`**，提示用户完成授权后重试\n2. 可选：尝试 `feishu_im_user_get_messages` 读取群消息\n3. 可选：如需发图，用脚本上传测试图片\n\n## 授权失败时的降级策略\n\n| 权限缺失 | 降级行为 |\n|---------|---------|\n| OAuth 未授权 | **技能完全不可用**，必须先授权 |\n| `im:message` | 无法发送消息 |\n| `im:message:readonly` | 无法读取群消息，跳过群监控 |\n| `im:resource` | 降级为纯文字模式，不发图片 |\n| `im:chat` | 无法搜索消息，仅能按群获取 |"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":817,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T20:44:33.855Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T20:44:33.855Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T05:13:33.213Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}