客服要把报价单发进会话,第一反应往往是把文件路径写进 content。文本接口按字符串投递。对端收到的是路径或一串乱码,不是可点开的附件。机器人「会发字」和「会发文件」不是同一个 method。混在一个函数里,失败时两套参数一起改,归因漂掉。
本机磁盘路径能被 Python 打开,不代表对端能下载。通道传的不是你的文件系统。
文本投递只保证字符串可见
/msg/sendText 的 content 是会话里那句字。它可以提到「报价单见附件」,它不能把附件变成气泡。图片、文件要走文档里对应的发送方法,参数形态也不同,常见要先有可被通道使用的素材,再引用。素材没准备好就调发送,回执失败会被写成「文本接口不稳定」。文本接口那天可能一直是绿的。
所以发送层要按消息类型分支。类型在入队时就定,不要到 HTTP 前再猜。猜错的结果是:任务表写了图片,实际打出去的是文本,值班以为图片已达。
文本探针仍用文档字段,用来证明节点和会话是活的,不要用来夹带文件:
python
def enqueue(kind, guid, to_id, payload):
if kind == "text":
return {
"method": "/msg/sendText",
"params": {"guid": guid, "toId": to_id, "content": payload["text"]},
}
if kind in ("image", "file"):
# method、素材字段以文档为准,不要塞进 content
raise NotImplementedError("附件走对应发送接口,先备素材再入队")
raise ValueError(kind)
NotImplementedError 出现在联调期是好事。它逼你去对文档,而不是把 /tmp/a.pdf 写进客户群。生产里应换成明确的拒绝码:素材未就绪、类型不支持、对象非法。拒绝码进任务表,才能和通道超时切开。
先过文本,再过一种附件
第一期只验收文本。文本不过,不要测图片。第二期只加一种附件,图片或文件选一个。两种一起上,失败会说「附件都不行」,其实可能是素材过期、会话类型错、节点掉线里的某一个。
同一工单不要连发「字 + 图 + 文件」三次而不做间隔。员工号有频率约束。附件失败禁止用文本接口重试同一文件路径。那不是降级,那是把路径泄露到客户会话。真要降级,应换成人工已审的短句,例如「文件发送失败,坐席稍后补」。
验收:文本测试句在会话里原文可见;把文件路径写入 content,对端不应出现可打开附件;按文档走附件方法后,气泡可点开且与本地文件一致。三步都记下会话类型。内部群机器人能推文本,同样证明不了客户群附件已通。
查看企业微信 API 文档: