写作与公文
通过企业微信 wecom-cli…
当需要通过企业微信机器人给授权人或机器人最近有往来的单聊/群聊发送 Markdown、图片、文件、AMR 语音或视频消息时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
通过企业微信 wecom-cli 向授权特定
解决思路
- 执行任何 `wecom-cli` 命令前,先完整读取并完成 `wecomcli-shared` 技能的公共前置检查。
- 发送对象是授权人时,用 `wecom-cli identity whoami` 获取授权人ID,将其作为 `chat_id`,无需调用 `sessions list`。
- 发送对象是授权人以外的用户或群聊时,只能发给机器人最近有消息往来的聊天会话(单聊和群聊);先调用 `wecom-cli message aibot sessions list` 查询会话范围。
- 若发送对象不是授权人且不在本次 `sessions list` 返回结果中,告知用户当前只能向最近活跃的会话或授权人发送。
- 发送图片、文件、语音或视频时,如果只有本地文件路径、没有可直接复用的 `media_id`,先完整读取 `wecomcli-media` 的 `SKILL.md`,使用其媒体上传接口获取 `media_id`,上传时传入的 `type` 应与发送时的 `msg_type` 对齐。
- 调用 `wecom-cli message aibot sessions list` 获取能发送消息的会话列表。
- 读取返回结构:`sessions` 为数组,按最后一条消息时间从新到旧排序,数量以实际回包为准;每项含 `chat_id`、`chat_name`、`chat_type`(`single` 单聊或 `group` 群聊)、`last_msg_time`(格式 `YYYY-MM-DD HH:MM:SS`),顶层含 `sessions_count`。
- 向授权人以外的用户发送消息前,先调用一次 `sessions list`,然后从本次返回的 `sessions[]` 中选定目标项,把该项的 `chat_id` 原样复制到 `send.chat_id`。
- 不能直接作为 `send.chat_id` 的值包括:用户输入的 ID、之前轮次或历史上下文保存的 `chat_id`、`wecomcli-contact` 返回的 `userid`、根据姓名或群名或其他字段自行构造的值;这些值最多作为匹配线索。
- 按聊天名称匹配目标:在本次 `sessions[]` 中按非空 `chat_name` 精确匹配;不能精确匹配时向用户反问确认发送目标;唯一命中时从匹配项复制 `chat_id`。
- 按“最近第一个/最近某个会话”匹配目标:按 `sessions[]` 原始顺序选择用户明确指定的项。
- 用户提供 ID 时:只能与本次 `sessions[].chat_id` 做完全相等校验;命中后仍从匹配项复制 `chat_id`,不能直接复用用户输入值。
- 匹配结果唯一时继续发送。
- 匹配到多个聊天会话候选时,按返回顺序展示聊天名和最后消息时间,让用户选择。
- 用户完成选择后,必须重新调用 `sessions list`,再用选定对象匹配当次返回值。
- 无匹配时停止发送,如实告知目标不在最近 10 个会话中;不要接受外部 `chat_id` 绕过限制。
- `sessions_count=0` 时停止发送,告知当前没有可发送的最近会话。
- 展示会话列表时保持接口原始顺序;展示名称和时间,不展示内部 `chat_id`。
- 发送消息前完成前置条件:根据发送对象选择调用 `wecom-cli message aibot sessions list` 获取 `chat_id`,或调用 `wecom-cli identity whoami` 获取授权人ID。
- 在本次列表中唯一匹配目标。
- 如果发送授权人以外的对象,从列表中匹配项原样复制 `sessions[].chat_id`。
- 目标是媒体消息时,再准备对应的 `media_id`。
- 在目标会话匹配成功前,不上传媒体,也不调用 `send`。
- 使用发送命令:`wecom-cli message aibot send --json '<JSON 参数>'`。
- 公共参数 `chat_id` 必填,必须取自 `wecom-cli identity whoami` 或当前发送流程中刚调用的 `sessions list` 返回的目标 `sessions[].chat_id`。
- 公共参数 `msg_type` 必填,取值为 `markdown` / `image` / `file` / `voice` / `video`。
- 内容对象条件必填:`msg_type="markdown"` 时传 `markdown`,`msg_type="image"` 时传 `image`,`msg_type="file"` 时传 `file`,`msg_type="voice"` 时传 `voice`,`msg_type="video"` 时传 `video`。
- 每次请求必须且只能携带一个与 `msg_type` 同名的内容对象;不要传空对象,也不要同时传多个消息对象。
- 发送 Markdown:`markdown.content` 必填,最长 20480 UTF-8 字节;普通文本也按 Markdown 发送。命令示例:`wecom-cli message aibot send --json '{"chat_id":"<本次 sessions[].chat_id>","msg_type":"markdown","markdown":{"content":"<markdown 消息内容>"}}'`。
- 发送图片:`image.media_id` 必填,必须由媒体上传接口以 `type=image` 上传获得。命令示例:`wecom-cli message aibot send --json '{"chat_id":"<本次 sessions[].chat_id>","msg_type":"image","image":{"media_id":"<media_id>"}}'`。
- 发送文件:`file.media_id` 必填,必须由媒体上传接口以 `type=file` 上传获得;文件名取上传时的原始文件名。命令示例:`wecom-cli message aibot send --json '{"chat_id":"<本次 sessions[].chat_id>","msg_type":"file","file":{"media_id":"<media_id>"}}'`。
- 发送语音:`voice.media_id` 必填,必须由媒体上传接口以 `type=voice` 上传获得;源文件仅支持 AMR 格式,不能只改扩展名冒充 AMR。命令示例:`wecom-cli message aibot send --json '{"chat_id":"<本次 sessions[].chat_id>","msg_type":"voice","voice":{"media_id":"<media_id>"}}'`。
- 发送视频:`video.media_id` 必填,由媒体上传接口以 `type=video` 上传获得。
- 视频可选字段 `video.title`:最长 128 UTF-8 字节;省略时使用上传时的原始文件名。
- 视频可选字段 `video.description`:最长 512 UTF-8 字节;省略时不展示描述。
- 用户没有提供视频标题或描述时直接省略对应字段,不传空字符串,也不追问非必填字段。命令示例:`wecom-cli message aibot send --json '{"chat_id":"<本次 sessions[].chat_id>","msg_type":"video","video":{"media_id":"<media_id>","title":"产品演示","description":"本周版本的核心功能演示"}}'`。
- 用户明确要求发送且目标与内容完整时直接执行,不重复追问确认;缺少目标、内容或本地文件时只追问缺失项。
- 连续发送多条时,不用每次 `send` 前都重新调用 `sessions list` 或 `wecom-cli identity whoami`,但连续发送中途上下文发生压缩时重新调用以确保 `chat_id` 正确。
- `chat_id`、`userid`、`media_id` 都是内部调用值,禁止面向用户展示。
- Markdown 正文、视频标题和描述的限制按 UTF-8 字节数计算;超限时不静默截断,请用户缩短或明确同意拆分。
- 发送成功后只说明目标和消息类型,不编造消息 ID。
- 接口失败时如实转达错误,不使用 `curl` / `Python` 等方式绕过 `wecom-cli`。
适用边界 · 注意事项
- 发送对象不是授权人且不在本次 `sessions list` 返回结果中时,不能发送。
- 没有 `wecom-cli` 或企业微信机器人授权环境时,本经验不适用。
- 语音源文件不是 AMR 格式时,不能仅改扩展名冒充 AMR 发送。