我正在构建一个电报机器人。
这意味着我同时管理多个聊天(每个聊天都有一个唯一的聊天 ID)。
当用户向机器人发送消息时,会回复一个答案。
我正在使用通过 HTTP 的电报 API。
但是,当我想发送一些消息时,有时它们会以错误的顺序到达,因为不确定哪个 HTTP 请求会首先被接受。
是否有任何未记录的方式将序列参数发送到电报 API,或者我必须处理队列中的 HTTP 请求?
我正在构建一个电报机器人。
这意味着我同时管理多个聊天(每个聊天都有一个唯一的聊天 ID)。
当用户向机器人发送消息时,会回复一个答案。
我正在使用通过 HTTP 的电报 API。
但是,当我想发送一些消息时,有时它们会以错误的顺序到达,因为不确定哪个 HTTP 请求会首先被接受。
是否有任何未记录的方式将序列参数发送到电报 API,或者我必须处理队列中的 HTTP 请求?
目前,Telegram Bot API 不提供此类参数。也就是说,您需要等待服务器的响应并在发送下一条消息之前检查它是否正常。
如果您使用 NodeJs,那么有一个名为tgfancy的模块可以为您处理有序的消息发送(以及轮询和许多其他事情)。
Thibauld 的回答添加了一个非常好的建议,即使用sendChatAction方法以使交互看起来更具会话性。我唯一的观点是机器人不应该假装它是一个人,所以没有必要让它看起来像是有一个打字。也就是说,sendChatAction
将用于指示您的机器人已收到用户的消息并正在处理它。
Telegram 机器人应该具有类似人类的交互。因此,为了避免您的问题,我的建议是定义一个排序TYPINGSPEED
常量并将其与sendChatAction()
bot api 调用结合起来,这样如果“感觉”您的消息实际上是由“快速打字”的人编写的。
在 ruby 中,它会给出这样的结果:
your_msg.split("\n").each do |line|
writing_time=line.length/TYPINGSPEED
TelegramBot.client.api.sendChatAction(chat_id: chat_id, action: "typing")
sleep(writing_time)
TelegramBot.client.api.sendMessage(your_options)
end
sendChatAction在用户屏幕上很好地显示“nameofyourbot is writing...”。
当然,这段代码的缺点是如果你的消息很长(因为使用了sleep
函数),处理答案的进程不会在几秒钟内返回。因此,根据同时使用您的机器人的用户数量,您最好进行一些容量规划并根据需要生成尽可能多的进程,以确保您的机器人可以处理所需的并行讨论数量。
我自己在做这个,我从来没有遇到过你描述的问题。
我用电报cli构建了一个机器人并遇到了同样的问题。因此,我认为将具有短时间增量的消息作为捆绑发送是 Telegram 特有的
您必须注意自己按正确的顺序发送它们,因此如果您不希望它们出现故障,请将它们排队。官方的 HTTP Bot API 不能确保正确的消息顺序。