企业微信消息技能
wecom-cli
是企业微信提供的命令行程序,所有操作通过执行
wecom-cli
命令完成。
通过
wecom-cli msg <接口名> ''
与企业微信消息系统交互。
接口列表
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"}'
按时间范围查询有消息的会话列表,支持分页。参见
API 详情
。
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 天内。参见
API 详情
。
get_msg_media — 获取消息文件内容
wecom-cli msg get_msg_media
'{"media_id": "MEDIAID_xxxxxx"}'
根据文件 ID 自动下载文件到本地,返回文件的本地路径(
local_path
)、名称、类型、大小及 MIME 类型。用于获取图片、文件、语音、视频等非文本消息的实际内容。参见
API 详情
。
send_message — 发送文本消息
wecom-cli msg send_message
'{"chat_type": 1, "chatid": "zhangsan", "msgtype": "text", "text": {"content": "hello world"}}'
向单聊或群聊发送文本消息。参见
API 详情
。
核心规则
时间范围规则
格式
:所有时间参数使用
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示例
:
"帮我看看和张三最近的聊天记录"
"看看项目群里最近的消息"
执行流程
:
确定时间范围(用户指定或默认最近7天)
通过
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
检查文件后缀
:每个文件下载完成后,检查
local_path
对应的文件是否具有正确的后缀名:
根据
get_msg_media
返回的
content_type
(MIME 类型)和
name
字段判断:
如果文件名缺少后缀(如
screenshot
而非
screenshot.png
),根据
content_type
自动补上正确后缀(如
image/png
→
.png
,
application/pdf
→
.pdf
,
audio/amr
→
.amr
,
video/mp4
→
.mp4
)
如果文件名后缀与
content_type
不一致,以
content_type
为准进行修正
补全或修正后缀后,将文件重命名为正确的文件名
确认文件可正常读取(文件大小 > 0),若文件为空或损坏则告知用户该文件下载异常
⚠️
不要对下载的文件使用
MEDIA:
指令
:这些文件是从聊天记录中下载的历史附件,仅需告知用户本地存放路径即可,
严禁
通过
MEDIA:
指令重新发送给用户
⚠️
必须主动告知文件位置
(此步骤不可跳过):所有文件下载并检查完成后,
必须立即、主动
以汇总形式向用户展示文件存放目录和每个文件的完整路径,不要等用户询问。示例:
📁 文件已下载到以下位置:
图片:
xxx/yyy.png
文件:
xxx/yyy.pdf
你可以在
xxx/yyy/
目录下找到所有下载的文件。
⚠️
必须询问是否删除
(此步骤不可跳过):告知文件位置后,
必须立即、主动
询问用户是否需要删除已下载的临时文件(如:"如果不再需要这些文件,是否需要我帮你清理?")
用户确认删除后,删除
local_path
对应的文件
用户不需要删除则保留文件
若
next_cursor
不为空,告知用户还有更多消息可继续查看
发送消息
用户query示例
:
"帮我给张三发一条消息:明天会议改到下午3点"
"在项目群里发一条消息:今天下午3点开会"
执行流程
:
通过
chatid查找规则
确定目标会话的
chatid
和
chat_type
发送前确认
:向用户确认发送对象和内容(如:"即将向 张三 发送:'明天会议改到下午3点',确认发送吗?"),用户确认后再执行
调用
send_message
发送(
msgtype
固定为
text
)
展示发送结果
查看消息并回复
用户query示例
:
"看看张三给我发了什么,然后帮我回复收到"
执行流程
:
先执行"查看聊天记录"流程(复用已获取的
chatid
和
chat_type
)
展示消息后,执行"发送消息"流程(需确认后再发送)
错误处理
时间范围超限
:告知用户7天限制并调整为有效范围
会话未找到
:明确告知用户未找到对应会话
API错误
:展示具体错误信息,必要时重试
网络问题
:HTTP错误时主动重试最多3次