用 Python 收发 WhatsApp
接收消息,是 Web 框架中的一条路由,用来响应 Meta 的验证 GET 并接受 POST 请求。发送消息,是向 Cloud API 发出的 HTTPS 请求,其中包含号码的 phone number id 和访问令牌。我们不提供 SDK,也无需安装任何东西。
如何在 Python 中接收消息?
在您已经使用的任意框架中,用同一路由配置两个处理程序。
GET 处理程序响应 Meta 的验证。它从查询字符串读取 hub.mode、hub.verify_token 和 hub.challenge,将令牌与您自己的令牌核对,然后把 challenge 作为原始正文返回。这里最常见的错误是返回 JSON,而且失败时不会明显提示。
POST 处理程序接收事件。请快速返回 200,然后再处理后续工作,因为 Meta 会把缓慢响应视为失败并重试,导致同一消息被处理两次。请将消息放入队列,或交给后台任务,不要直接在线处理。
消息会带有 wamid 消息 ID。从一开始就按它去重很值得,因为重试是正常情况,不是例外。
如何发送消息?
向 phone number id 对应的 Cloud API messages 端点发送一次 POST,并附上 Bearer 访问令牌。
这两个值都来自连接:控制台会显示它们;如果您希望由助手获取,get_api_credentials 也会返回它们。这个调用没有任何部分专属于我们,因此任何 HTTP 库都可以使用,请求格式也与 Meta 的官方文档完全一致。
随时间变化的是请求正文。在客户最后一条消息后的 24 小时内,您发送 text 对象。超过 24 小时,则发送 template 对象,并指定已批准的模板及其语言。只了解第一种格式的客户端,在测试中运行正常,却会在第一条隔夜消息时失败,并返回错误 131047。
生产环境中的处理程序还需要什么?
有 3 件容易跳过、日后却很难补上的事情。
按消息 ID 去重,因为 Meta 会重试。如果服务公开访问,请验证请求签名,否则任何知道您 URL 的人都能向它发请求。还要根据联系人上次发消息的时间进行分支,让发送路径自动选择 text 或 template,无需人工决定。
这些都不需要框架或库。它们只是一次集合操作、一次检查和一次比较。在第一位客户接入前完成这些工作,才能让集成安静运行,而不是不断触发警报。
常见错误
- 在验证 GET 中返回 JSON,而不是原始 challenge 值。
- 返回 200 前直接处理消息。Meta 会重试缓慢响应,导致您处理同一消息两次。
- 未检查时间窗口就发送免费文本。这会返回 131047,看起来像什么都没有发生。
在 easycoexistence.com 连接号码,将 Webhook 目标设置为您的路由,然后从控制台读取 phone number id 和访问令牌。每个号码每月 US$ 9 起,量大时降至 US$ 2,前 7 天免费试用。
常见问题
有 Python SDK 吗?
我们不提供,但您不需要 SDK。API 属于 Meta,由 Meta 提供文档,任何 HTTP 库都可以访问。
应该使用哪个框架?
任何框架都可以。您只需要一条响应 GET 并接受 POST 的路由,所有 Python Web 框架都支持。
如何避免同一消息被处理两次?
按负载中的 wamid 消息 ID 去重。Meta 的设计就是会重试,因此这是预期情况,不是边缘案例。
团队仍然可以使用手机吗?
可以。Coexistence 会让 WhatsApp Business 应用继续在同一号码上运行,您的处理程序也会通过回声事件看到他们发送的内容。
继续阅读
准备开始了吗?
几分钟即可设置 WhatsApp Coexistence,而不是几个月。应用会继续在手机上运行。
开始免费试用验证时间