消息收发接口看着简单——发文本传 content发图片传 url。上手才发现三种类型的参数结构差别不小而且发送侧和接收侧的字段并不对称。这篇把文本、图片、文件三类消息的收发结构摊开对比再给一个统一封装的写法。一、发送侧三种类型的参数结构文本最简单传 wxid 和 content 就行。图片传 wxid、url 加 typeimageurl 是上传后拿到的地址。文件传 wxid、url、filename 加 typefile文件名要带上否则对方收到的是乱码名。关键是文本走 content图片和文件走 url两类参数不能混。混了接口不一定报错但消息发不出去或者发出去是空的。字段结构可以参考Eyun 开发文档。二、接收侧字段不对称在哪接收消息的结构和发送不一样。文本进来是 content图片进来是 url 加缩略图地址文件进来是 url 加 filename 加 size。写解析代码时最常见的坑是拿发送侧的结构去匹配接收侧字段然后一直取不到值。正确做法是先按 type 判断再取对应字段。类型判断一定要放在读字段前面具体字段含义可以对着Eyun 开发文档看。三、统一封装一个 send 收口三类消息与其在业务里到处判断类型不如封一个统一发送方法内部按类型拼参数。业务侧只说发给谁、发什么、什么类型参数拼装不进入业务代码。封装的另一个好处是频率控制好加。三类消息都走同一个出口限流逻辑只有一份不会在多个调用点重复。收发字段对照类型发送侧参数接收侧字段易错点文本wxid contentcontent与 url 混用图片wxid urlurl 缩略图结构不对称取不到值文件wxid url filenameurl filename size漏 filename 名字乱码统一发送实现import time import requests class MessageSender: def __init__(self, api, token): self.api api self.token token self.last 0 def send(self, wxid, mtype, **kwargs): payload self._build(wxid, mtype, kwargs) self._throttle() # 统一限流 return self._post(/send, payload) def _build(self, wxid, mtype, kw): if mtype text: return {wxid: wxid, content: kw[content]} if mtype image: return {wxid: wxid, type: image, url: kw[url]} if mtype file: # filename 必须带否则接收端显示乱码名 return {wxid: wxid, type: file, url: kw[url], filename: kw[name]} raise ValueError(f不支持的类型: {mtype}) def _throttle(self): gap time.time() - self.last if gap 3: time.sleep(3 - gap) # 频率控制 self.last time.time() def _post(self, path, payload): return requests.post( f{self.api}{path}, headers{Authorization: self.token}, jsonpayload, timeout15, # 大文件超时放宽 ).json() def parse_event(event): # 接收侧先判类型再取字段 t event[type] if t text: return {type: t, content: event[content]} if t image: return {type: t, url: event[url]} if t file: return {type: t, url: event[url], name: event[filename], size: event[size]} return {type: t}落地建议发送侧按类型拼参数文本传 content、图片和文件传 url别混。接收侧先判 type 再取字段拿发送侧结构去解析是常见错。三类消息封一个出口限流和超时只维护一份。文字消息长度别超 500 字大文件超时设到 15 秒以上。微信侧的文本、图片、文件消息收发接口由 Eyun 这类个人微信API平台 提供参数拼装和限流在自建服务实现具体字段以Eyun 平台为准。
阅读完成 · 觉得有帮助?