如何通过message_token调用Viber REST API获取消息?
关于Viber机器人通过message_token获取已发送消息的问题解答
我之前做过Viber机器人的分布式部署相关开发,正好碰到过类似的问题,给你捋捋清楚:
首先明确一个核心点:Viber官方API并不支持通过message_token反向查询已发送的消息内容。这个message_token的主要作用是用来关联用户的回复(比如用户回复某条消息时,received事件里的token能帮你定位到用户是针对哪条消息做出的回应),以及做消息送达确认的校验,本身并没有提供反向查询消息本体的能力。
那针对你这种分布式服务部署的场景,该怎么解决获取已发消息的需求呢?答案是必须自行实现消息同步与存储机制,具体可以这么做:
- 集中存储已发送消息:搭建一个统一的存储服务(比如Redis、MySQL或者MongoDB都可以),每次你的任意一个服务节点调用Viber API发送消息后,把返回结果里的
message_token和对应的消息内容、目标用户ID、发送时间戳等关键信息绑定存储起来。这里要注意,Viber发送消息的API响应里会返回对应的message_token,一定要用这个返回值来做存储关联,而不是自己生成的标识。 - 关联received事件查询:当收到用户触发的
received事件时,取出事件里的message_token,直接去你的集中存储里查询对应的消息记录,就能拿到之前发送给用户的具体消息内容了。 - 分布式场景的一致性处理:因为是多服务节点部署,要保证存储操作的原子性——比如发送消息和存储记录这两步最好做成一个事务(如果用数据库的话),或者用Redis的原子命令来避免出现消息发送成功但记录没存上的情况,同时也要避免重复存储相同的token记录。
- 存储过期策略:根据你的业务需求设置存储的过期时间,比如如果你的业务只需要保留最近30天的消息记录,就给存储的条目加上过期时间,避免存储冗余占用资源。
简单来说,Viber没给我们现成的反向查询接口,所以只能靠自己把发送出去的消息“留底”,这样后续需要的时候才能通过token找回来。
内容的提问来源于stack exchange,提问作者Matvii Strechen
相关产品推荐
相关产品推荐

