微信机器人是怎么实现自动收发消息的?个人微信API接口浅析
很多朋友刚接触个人微信API,第一反应就是"机器人到底怎么做到自动收发消息的?"。其实原理不难,关键在于理解两条独立的路径——发送和接收,它们就像两条方向相反的高速公路,互不干扰。每条路径按时间顺序走5步,把这两条时序链路搞明白,微信机器人自动收发的原理你也就懂了。下面我把每条链路按时间顺序拆开讲,大白话,不绕弯。
发送链路(你发消息给用户):5步时序
发送链路本质上是"你主动推消息出去"。从你的程序发出调用,到用户手机上收到消息,中间会依次经过以下5步:
步骤1:组装sendText的JSON参数。 你的程序先把消息参数拼好,三个必填字段缺一不可:wId指定用哪个微信号发、toUser指定发给谁、content指定发什么内容。缺一个后面就会报错,这是第一步最容易踩的坑。
步骤2:用HTTP POST发到Eyun接口地址。 参数拼完以后,你的程序用HTTP POST请求把这个JSON发到Eyun的sendText接口地址。请求头里要带上你自己的Token,用来做身份校验。
步骤3:Eyun收到请求,校验Token和wId。 Eyun这边先检查两件事:Token对不对、有没有过期;wId这个微信实例是不是存在且在线。两样都没问题,Eyun才会继续调用微信侧的接口把消息发出去。任何一样有问题,立刻返回对应错误码。
步骤4:微信把消息推给用户手机。 Eyun校验通过后,把消息转交给微信服务器,微信服务器再推送到接收者的手机上。这一步是微信自己的机制,正常情况下延迟很低。
步骤5:Eyun返回响应,你的程序按错误码处理。 调用结束后Eyun会返回一个响应。常见的错误码有几个:code=1000代表成功;1001是参数错误,回头检查wId、toUser、content有没有漏;1002是Token过期,换新Token再发;1004是限频,说明你发太快了,稍微等一下再重试。
按照 Eyun 开发文档的规范,sendText确实只需要这三个必填参数,其他字段都是可选的扩展字段。
大白话总结发送链路: 你的程序给Eyun寄了一封信,Eyun先检查邮票(Token)和门牌(wId)对不对,没问题再交给邮局(微信),邮局把信送到用户家里,最后Eyun回头告诉你:"寄到了"、"邮票过期了"或者"邮局今天太忙稍后再送"。
接收链路(用户发消息给你):5步时序
接收链路和发送是反过来的——它是"你被别人回调"。用户发一条消息过来,到你的程序真正处理到它,中间也是5步:
步骤1:用户在微信里发一条消息。 这一步不用多解释,就是普通用户在手机上给你的微信号发文字、图片、语音或者文件。
步骤2:微信把消息推给Eyun。 微信服务器检测到你的微信号收到了新消息,就把这条消息同步推送给Eyun。
步骤3:Eyun把消息包装成回调JSON。 Eyun收到微信的消息后,不会原样转给你,而是封装成统一格式的回调数据。关键字段有几个:eventType告诉你这是一条消息事件;fromUser是谁发的;content发的什么内容;msgId是这条消息的唯一编号,用来去重或对账。
步骤4:Eyun POST到你之前配的回调地址。 Eyun会把这个回调JSON以HTTP POST的方式,发到你在后台提前配置好的回调地址上。这里有个硬要求:回调地址必须是公网能访问的,本机localhost是收不到的。
步骤5:你的程序收到回调,5秒内必须返回HTTP 200。 你的程序拿到回调数据以后,业务逻辑该怎么处理是你的事,但有一个铁规矩:必须在5秒以内返回一个HTTP 200给Eyun。否则Eyun会认为你没收到,会自动重试,最多重试3次。连续几次你都不返回200,Eyun就会停止重试,这条消息你就漏了。
按照 Eyun 开发文档的回调规范,5秒内返回200是硬性要求,重试策略也是固定3次,开发时一定要注意。
大白话总结接收链路: 用户把信寄给Eyun,Eyun再转寄到你提前留的信箱地址(回调地址)。你的信箱收到信以后必须当场签个收条(返回200)。不签收Eyun就再送两次,一共三次你都不收,这封信就当丢了。
两条链路5步时序对比表
| 链路 | 方向 | 步骤1 | 步骤2 | 步骤3 | 步骤4 | 步骤5 | 关键规则 |
|---|---|---|---|---|---|---|---|
| 发送链路 | 你 → 用户 | 程序组装sendText参数(wId、toUser、content) | HTTP POST到Eyun接口 | Eyun校验Token和wId,通过后调微信侧接口 | 微信把消息推给用户手机 | Eyun返回响应(1000成功、1001参数错、1002Token过期、1004限频) | 根据错误码处理失败,不要盲目重试 |
| 接收链路 | 用户 → 你 | 用户在微信里发消息 | 微信把消息推给Eyun | Eyun包装为回调JSON(eventType、fromUser、content、msgId) | Eyun POST到你配置的公网回调地址 | 你的程序5秒内必须返回HTTP 200,否则重试3次 | 回调地址必须公网可访问,5秒内必须返回200 |
收发链路最小演示代码
下面给一个极简的演示,发送用curl直接调sendText,接收用Python标准库http.server接回调。这两段代码加起来就能跑通一个最基础的"收到消息立刻回一句"的小闭环:
# 发送:curl 方式直接调 sendText
# curl -X POST https://api.eyunz.com/sendText \
# -H "Content-Type: application/json" \
# -H "Token: 你的Token" \
# -d '{"wId":"你的wId","toUser":"接收人wxid","content":"这是一条自动发送的消息"}'
# 接收:Python 标准库 http.server 接回调,5秒内返回200
from http.server import BaseHTTPRequestHandler, HTTPServer
import json, urllib.request
EYUN_TOKEN = "你的Token"
EYUN_WID = "你的wId"
SEND_URL = "https://api.eyunz.com/sendText"
class CallbackHandler(BaseHTTPRequestHandler):
def do_POST(self):
length = int(self.headers.get("Content-Length", 0))
body = json.loads(self.rfile.read(length).decode("utf-8"))
# 5秒内必须先返回200,业务逻辑放后面跑
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(b'{"ok":1}')
# 简单回一句:收到用户的消息后,原路回一条"收到+内容"
if body.get("eventType") == "消息事件" and body.get("content"):
reply = f"收到:{body['content']}"
payload = json.dumps({"wId": EYUN_WID, "toUser": body["fromUser"], "content": reply}).encode()
req = urllib.request.Request(SEND_URL, data=payload, method="POST",
headers={"Content-Type": "application/json", "Token": EYUN_TOKEN})
with urllib.request.urlopen(req, timeout=5) as resp:
print("回消息结果:", resp.read().decode())
if __name__ == "__main__":
server = HTTPServer(("0.0.0.0", 8080), CallbackHandler)
print("回调服务启动,监听8080端口,请确保该端口公网可访问")
server.serve_forever()
最后说一个容易被忽略的点:收发是两条独立单向链路
讲到这里你应该已经发现了,发送链路和接收链路是完全独立的两条单向路径:发送是"你主动推出去",接收是"你被动被回调"。两条链路之间没有天然关系,它们的结合点其实是在你自己的程序里——接收链路收到用户消息,你的程序做完业务处理,再调用发送链路把消息回过去。把这两件事串起来,一个完整的机器人对话闭环就形成了。
两条链路的关键规则其实各只有一条,记住基本就不会出大问题:
-
发送链路: 看错误码处理失败,不要一股脑地重复发送,1004限频就等一会,1002过期就换Token,1001参数错就先改参数。
-
接收链路: 5秒内必须返回HTTP 200,业务处理慢的话先签收再异步处理,不要等业务做完了再响应,容易超时。
关于两条时序链路的完整参数列表、字段含义、错误码和重试规则细节,可以进一步参考 Eyun 开发文档。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)