wecomteam/wecom-cli

wecomcli-message

查询当前可以发送消息的聊天会话范围,并向会话列表中的单聊或群聊发送文本、Markdown、图片、文件、语音、视频消息。用户要求“给某人发消息”“在某个群里通知”“给最近会话发消息”或“把图片/文件/语音/视频发到企业微信”时使用。

View source
Original skill document

Rendered from the source repository. Headings, examples, code, tables, links, and referenced images are preserved.

企业微信发送消息

执行任何 wecom-cli 命令前,必须先读取并完成 wecomcli-shared 技能的公共前置检查。
  1. 可以向授权人发送消息。
  2. 可以向授权人以外的、机器人最近有消息往来的聊天会话(单聊和群聊)发送消息。

适用范围

适用

  • 适用于给授权人发消息,使用 wecom-cli identity whoami 获取授权人ID,可作为 chat_id 使用,无需调用 sessions list
  • 适用于查询当前有权限发送消息的聊天会话范围并给这些范围中的成员或群聊发送 Markdown 消息、图片、文件、AMR 语音或视频

不适用

  • 发送对象不是授权人且不在本次 sessions list 返回结果中 → 告知用户当前只能向最近活跃的会话或授权人发送

技能依赖

调用依赖技能前,必须先完整读取对应 SKILL.md

依赖技能触发场景数据流向
wecomcli-media发送图片、文件、语音或视频时只有本地文件路径,没有可直接复用的 media_id包含媒体上传接口,如没有已有的 media_id,必须先阅读该技能获取 media_id,上传时传入的 type 应和发送时的msg_type 对齐

获取能发送消息的会话列表

命令

bash
wecom-cli message aibot sessions list

返回

字段类型说明
sessionsarray会话列表,按最后一条消息时间从新到旧排序,具体数量以实际回包为准
sessions[].chat_idstring会话 ID
sessions[].chat_namestring群名称或单聊名称
sessions[].chat_typestringsingle 单聊或 group 群聊
sessions[].last_msg_timestring最后一条消息时间,格式 YYYY-MM-DD HH:MM:SS
sessions_countintegersessions 数组元素数量

chat_id 来源

向授权人以外的用户发送消息,调用 wecom-cli message aibot send 前,需要先调用一次 sessions list,然后从本次返回的 sessions[] 中选定目标项,把该项的 chat_id 原样复制到 send.chat_id

以下值都不能直接作为 send.chat_id

  • 用户输入的 ID
  • 之前轮次或历史上下文保存的 chat_id
  • wecomcli-contact 返回的 userid
  • 根据姓名、群名或其他字段自行构造的值

这些值最多只能作为匹配线索;最终发送参数必须重新取自本次 sessions list 的匹配项。

目标会话匹配

  • 聊天名称:在本次 sessions[] 中按非空 chat_name 精确匹配;不能精确匹配需要向用户反问确认发送目标,唯一命中时从匹配项复制 chat_id
  • 最近第一个/最近某个会话:按 sessions[] 原始顺序选择用户明确指定的项。
  • 用户提供 ID:只能与本次 sessions[].chat_id 做完全相等校验;命中后仍从匹配项复制 chat_id,不能直接复用用户输入值。

匹配结果处理:

  • 唯一匹配时继续发送。
  • 多个聊天会话候选时,按返回顺序展示聊天名和最后消息时间,让用户选择。
  • 用户完成选择后,必须重新调用 sessions list,再用选定对象匹配当次返回值。
  • 无匹配时停止发送,如实告知目标不在最近 10 个会话中;不要接受外部 chat_id 绕过限制。
  • sessions_count=0 时停止发送,告知当前没有可发送的最近会话。
  • 展示会话列表时保持接口原始顺序;展示名称和时间,不展示内部 chat_id

发送消息

前置条件

调用本接口前必须完成以下步骤:

  1. 根据发送对象选择调用 wecom-cli message aibot sessions list获取 chat_idwecom-cli identity whoami 获取授权人ID。
  2. 在本次列表中唯一匹配目标。
  3. 如果发送授权人以外的对象,从列表中匹配项原样复制 sessions[].chat_id
  4. 目标是媒体消息时,再准备对应的 media_id

在目标会话匹配成功前,不上传媒体,也不调用 send

命令

bash
wecom-cli message aibot send --json '<JSON 参数>'

公共参数

字段类型必填说明
chat_idstring必须取自 wecom-cli identity whoami 或当前发送流程中刚调用的 sessions list 返回的目标 sessions[].chat_id
msg_typestringmarkdown / image / file / voice / video
markdownobject条件必填msg_type="markdown" 时传
imageobject条件必填msg_type="image" 时传
fileobject条件必填msg_type="file" 时传
voiceobject条件必填msg_type="voice" 时传
videoobject条件必填msg_type="video" 时传

每次请求必须且只能携带一个与 msg_type 同名的内容对象。不要传空对象,也不要同时传多个消息对象。

Markdown 消息

markdown.content 必填,最长 20480 UTF-8 字节。普通文本也按 Markdown 发送。

bash
wecom-cli message aibot send --json '{
  "chat_id": "<本次 sessions[].chat_id>",
  "msg_type": "markdown",
  "markdown": {
    "content": "<markdown 消息内容>"
  }
}'

图片消息

image.media_id 必填,必须由媒体上传接口以 type=image 上传获得。

bash
wecom-cli message aibot send --json '{
  "chat_id": "<本次 sessions[].chat_id>",
  "msg_type": "image",
  "image": {
    "media_id": "<media_id>"
  }
}'

文件消息

file.media_id 必填,必须由媒体上传接口以 type=file 上传获得;文件名取上传时的原始文件名。

bash
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。

bash
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 字节;省略时不展示描述
bash
wecom-cli message aibot send --json '{
  "chat_id": "<本次 sessions[].chat_id>",
  "msg_type": "video",
  "video": {
    "media_id": "<media_id>",
    "title": "产品演示",
    "description": "本周版本的核心功能演示"
  }
}'

用户没有提供视频标题或描述时直接省略对应字段,不传空字符串,也不追问非必填字段。

关键约束

  • 用户明确要求发送且目标与内容完整时直接执行,不重复追问确认;缺少目标、内容或本地文件时只追问缺失项。
  • 连续发送多条时,不用每次 send 前都重新调用 sessions listwecom-cli identity whoami,但连续发送中途上下文发生压缩时重新调用确保 chat_id 正确。
  • chat_iduseridmedia_id 都是内部调用值,禁止面向用户展示。
  • Markdown 正文、视频标题和描述限制按 UTF-8 字节数计算;超限时不静默截断,请用户缩短或明确同意拆分。
  • 发送成功后只说明目标和消息类型,不编造消息 ID。
  • 接口失败时如实转达错误,不使用 curl / Python 等方式绕过 wecom-cli
from this repository

More skills

All skills
wecomteam
Community

wecomcli-calendar

企业微信日程管理。当用户需要预约日程、预订会议室、查看/更新/取消日程或查忙闲时触发。本技能负责『日程』——即不含在线会议链接的安排(也涵盖纯线下面对面碰头);若用户要的是『在线会议』(含会议号/入会链接、可远程或视频参会),改用 wecomcli-meeting 技能。用户仅说'开会/约个会/某会'等、未明确要创建的是日程还是在线会议时,必须先读取本技能并按其中的消歧流程向用户追问确认后再处理,不可臆断直接创建。

installs
7
GitHub stars
2987
Updated
25. Aug.
wecomteam
Community

wecomcli-contact

使用 wecom-cli 按姓名、拼音、英文名或别名搜索企业微信通讯录中的人员,并查询匹配人员的 userid、部门和职务。适用于查找联系人、区分同名人员、获取用户 userid,以及列出全部同名人员。

installs
7
GitHub stars
2987
Updated
25. Aug.
wecomteam
Community

wecomcli-disk

企业微信微盘(Disk / 网盘)文件操作技能。承接"微盘 / 网盘"里的文件列出、搜索、读取元信息、上传、下载、重命名、新建文件夹操作。用户明确提到"微盘"/"网盘"/"共享空间"时必须先读取本技能获取完整指引,不得凭记忆处理。用户说"上传到微盘"、"帮我在微盘里搜一下 xxx"、"微盘那个 PPT 在哪"、"下载微盘那个文件"、"把微盘那个文件重命名成 xxx"、或直接给出 https://drive.weixin.qq.com/s?k=... 形式的微盘文件链接时使用本技能。与 wecomcli-doc / wecomcli-sheet / wecomcli-smartsheet / wecomcli-smartpage 的区别:本技能处理微盘里所有文件(含在线文档)的搜索/列表/基础信息/位置/路径/重命名等文件级操作;在线文档(doc/sheet/smartsheet/smartpage 类型)的内容读写走对应文档技能,不由本技能接管。当用户问「这个文档在微盘哪里」或问某文件在微盘的位置时,由本技能用 get 返回空间名/文件夹名/路径等元信息。

installs
7
GitHub stars
2987
Updated
25. Aug.
wecomteam
Community

wecomcli-doc

企微 doc 内容操作技能,包含新建在线文档、导入、读取、追加、覆盖写入等功能。仅当用户明确指定 'doc'、'docx'、'word'、'在线文档'、'office文档',或提供 https://doc.weixin.qq.com/doc/xxx 链接时触发。本技能不处理未指明类型的“文档”请求;凡是“创建文档 / 写文档 / 整理成文档 / 输出到文档”等泛化表达,默认都必须路由到 wecomcli-smartpage(智能文档),本技能不得抢占。若请求包含字段、记录、筛选、排序、统计、分组等结构化数据语义,严禁用 doc + markdown 静态表格变通替代,应考虑使用智能文档或者智能表格。公共管理操作请使用 wecomcli-doc-manage;在线表格操作请使用 wecomcli-sheet;智能表格操作请使用 wecomcli-smartsheet。

installs
7
GitHub stars
2987
Updated
25. Aug.