企业微信消息技能
wecom-cli 是企业微信提供的命令行程序,所有操作通过执行 wecom-cli 命令完成。通过 wecom-cli msg <接口名> '<json入参>' 与企业微信消息系统交互。
接口列表
get_msg_chat_list — 获取会话列表
wecom-cli msg get_msg_chat_list '{"begin_time": "2026-03-11 00:00:00", "end_time": "2026-03-17 23:59:59"}'
按时间范围查询有消息的会话列表,支持分页。
get_message — 拉取会话消息
wecom-cli msg get_message '{"chat_type": 1, "chatid": "zhangsan", "begin_time": "2026-03-17 09:00:00", "end_time": "2026-03-17 18:00:00"}'
根据会话类型和 ID 拉取指定时间范围内的消息记录,支持分页。支持 text/image/file/voice/video 消息类型,仅支持 7 天内。
get_msg_media — 获取消息文件内容
wecom-cli msg get_msg_media '{"media_id": "MEDIAID_xxxxxx"}'
根据文件 ID 自动下载文件到本地,返回文件的本地路径(local_path)、名称、类型、大小及 MIME 类型。用于获取图片、文件、语音、视频等非文本消息的实际内容。
send_message — 发送文本消息
wecom-cli msg send_message '{"chat_type": 1, "chatid": "zhangsan", "msgtype": "text", "text": {"content": "hello world"}}'
向单聊或群聊发送文本消息。
核心规则
时间范围规则:所有时间参数使用 YYYY-MM-DD HH:mm:ss 格式;用户未指定时默认使用最近 7 天(当前时间往前推 7 天);开始时间不能早于当前时间的 7 天前,不能晚于当前时间;支持"昨天"、"最近三天"等相对时间自动推算。
chatid 查找规则:当用户提供人名或群名而非 ID 时,调用 get_msg_chat_list 获取会话列表(时间范围与目标查询一致),在 chats 中按 chat_name 匹配。精确匹配唯一结果直接使用;模糊匹配多个结果展示候选列表让用户选择;无匹配结果告知用户未找到。chat_type 判断:get_msg_chat_list 返回中不含会话类型字段,需根据上下文推断,用户明确提到「群」时使用 chat_type=2,否则默认 chat_type=1(单聊)。
userid 转 name:调用 wecomcli-contact 技能的 get_userlist 获取用户列表,建立 userid 到 name 的映射关系;精确匹配显示 name,无匹配保持显示 userid。
强制交互步骤(不可跳过):涉及非文本消息下载时必须逐一执行,不得合并、省略或跳过,即使用户未主动询问:必须主动告知文件位置,下载完成后必须立即向用户展示所有文件的完整路径和存放目录;必须询问是否删除,告知位置后必须立即询问用户是否需要清理临时文件。
典型工作流
查看会话列表:用户 query 如"看看我最近一周有哪些聊天"、"这几天谁给我发过消息"。执行流程:确定时间范围(用户指定或默认最近 7 天);调用 get_msg_chat_list 获取会话列表;展示会话名称、最后消息时间、消息数量;若 has_more 为 true,告知用户还有更多会话可继续查看。
查看聊天记录:用户 query 如"帮我看看和张三最近的聊天记录"、"看看项目群里最近的消息"。执行流程:确定时间范围;通过 chatid 查找规则确定目标会话的 chatid 和 chat_type;调用 get_message 拉取消息列表;调用 wecomcli-contact 技能的 get_userlist 获取通讯录,建立 userid→姓名 映射;统计非文本消息(遍历消息列表,统计 msgtype 非 text 的 image/file/voice/video 消息数量和类型);展示时将 userid 替换为可读姓名,格式为文本消息"姓名 [时间]: 内容"、图片消息"姓名 [时间]:[图片]"、文件消息"姓名 [时间]:[文件] 文件名称"、语音消息"姓名 [时间]:[语音] 语音内容"、视频消息"姓名 [时间]:[视频]"。
非文本消息处理:展示完消息后,如存在非文本消息,主动询问是否下载,告知用户非文本消息数量和类型(如"以上聊天中包含 2 张图片、1 个文件,是否需要下载到本地?");用户确认后逐个调用 get_msg_media 接口,接口会自动下载文件并返回 local_path;检查文件后缀,根据返回的 content_type(MIME 类型)和 name 字段判断,若文件名缺少后缀则按 content_type 自动补上正确后缀(如 image/png → .png,application/pdf → .pdf,audio/amr → .amr,video/mp4 → .mp4),若后缀与 content_type 不一致以 content_type 为准修正,补全或修正后缀后将文件重命名为正确的文件名;确认文件可正常读取(文件大小 > 0),若文件为空或损坏则告知用户该文件下载异常。不要对下载的文件使用 MEDIA: 指令:这些文件是从聊天记录中下载的历史附件,仅需告知用户本地存放路径即可,严禁通过 MEDIA: 指令重新发送给用户。必须主动告知文件位置(此步骤不可跳过):所有文件下载并检查完成后,必须立即、主动以汇总形式向用户展示文件存放目录和每个文件的完整路径,不要等用户询问。必须询问是否删除(此步骤不可跳过):告知文件位置后,必须立即、主动询问用户是否需要删除已下载的临时文件;用户确认删除后删除 local_path 对应的文件,用户不需要删除则保留文件。若 next_cursor 不为空,告知用户还有更多消息可继续查看。
发送消息:用户 query 如"帮我给张三发一条消息:明天会议改到下午3点"、"在项目群里发一条消息:今天下午3点开会"。执行流程:通过 chatid 查找规则确定目标会话的 chatid 和 chat_type;发送前确认,向用户确认发送对象和内容(如"即将向 张三 发送:'明天会议改到下午3点',确认发送吗?"),用户确认后再执行;调用 send_message 发送(msgtype 固定为 text);展示发送结果。
查看消息并回复:用户 query 如"看看张三给我发了什么,然后帮我回复收到"。执行流程:先执行"查看聊天记录"流程(复用已获取的 chatid 和 chat_type);展示消息后执行"发送消息"流程(需确认后再发送)。
错误处理:时间范围超限时告知用户 7 天限制并调整为有效范围;会话未找到时明确告知用户未找到对应会话;API 错误时展示具体错误信息,必要时重试;网络问题时 HTTP 错误主动重试最多 3 次。