我的电报机器人不断地发送消息
Posted
技术标签:
【中文标题】我的电报机器人不断地发送消息【英文标题】:my telegram bot keeps sending messages endlessly 【发布时间】:2017-03-28 09:36:12 【问题描述】:我开始编写电报机器人程序,但遇到了问题。当我发送 /start 命令时,它会向我发送一条欢迎消息(正如我编写的那样),但它不会发送一次!它像循环一样不断地发送它! 这是来源:
<?php
define('API_KEY','<token>');
function makereq($method,$datas=[])
$url = "https://api.telegram.org/bot".API_KEY."/".$method;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($datas));
$res = curl_exec($ch);
if(curl_error($ch))
var_dump(curl_error($ch));
else
return json_decode($res);
$website = "https://api.telegram.org/bot".API_KEY;
$update = json_decode(file_get_contents('php://input'));
$chat_id = $update->message->chat->id;
$message_id = $update->message->message_id;
$from_id = $update->message->from->id;
$name = $update->message->from->first_name;
$username = $update->message->from->username;
$textmessage = isset($update->message->text)?$update->message->text:'';
$reply = $update->message->reply_to_message->forward_from->id;
$stickerid = $update->message->reply_to_message->sticker->file_id;
$messageEntity = $update->messageentity->type;
function SendMessage($ChatId, $TextMsg)
makereq('sendMessage',[
'chat_id'=>$ChatId,
'text'=>$TextMsg,
'parse_mode'=>"MarkDown"]
);
if($textmessage == '/start')
SendMessage($chat_id,'<welcome message>');
?>
【问题讨论】:
【参考方案1】:您可能正在使用 webhook。 如果您没有以 http 状态 200 响应,电报机器人 API 会认为您的服务器有问题,并每隔几秒再次请求 mentioned in the API documentation:
如果请求不成功,我们将在合理后放弃 尝试次数。
所以只需将header("HTTP/1.1 200 OK");
添加到您的脚本中,瞧!
(如果你的php版本大于5.4可以使用http_response_code(200);
)
【讨论】:
【参考方案2】:如果你是polling
和getUpdates
,你需要增加你的偏移量。
偏移量 = 1 + latest_update_id
如果您使用的是WebHooks
... https://core.telegram.org/bots/api#update update_id
更新的唯一标识符。更新标识符从 一定的正数并依次增加。 此 ID 变为 如果您使用 Webhooks,则特别方便,因为它允许您 忽略重复更新或恢复正确的更新顺序, 他们是否会出现故障。
【讨论】:
你是在使用 webhook 还是在投票? 我正在使用 webhook 好的,那么对于 webhook 我应该如何做增量?只是$result ['update_id'] = ++$update;
? @CharlesOkwuagwu
您可以忽略重复的更新 ID Telegram 只会向您发送最新的更新集。你不需要做任何事情,如果你得到一个重复的update_id,直接忽略【参考方案3】:
我最近遇到了这个问题,并通过向聊天发送一条空白消息来阻止它。您从电报中收到错误消息,但不再发送消息。
【讨论】:
这就像一个魅力。另外,我使用这个解决方案***.com/a/46256172/1642423【参考方案4】:正如 Yoily L 所说,您必须在电报认为请求失败之前返回 200。
您可以使用fastcgi_finish_request()
将响应数据刷新到客户端。
http://php.net/manual/en/function.fastcgi-finish-request.php
http_response_code(200);
fastcgi_finish_request();
// continue execution, send messages and whatever
另外,请注意 tuxrampage 在文档中的评论:
脚本执行后仍会占用一个 FPM 进程
fastcgi_finish_request()
。所以过度使用它长时间运行 任务可能会占用你所有的 FPM 线程,直到pm.max_children
。这会 导致网络服务器出现网关错误。另一个重要的事情是会话处理。会话被锁定为 只要它们处于活动状态(请参阅文档
session_write_close()
)。这意味着后续请求将阻塞 直到会话关闭。因此,您应该尽快致电
session_write_close()
(甚至在fastcgi_finish_request()
之前)以允许后续请求 和良好的用户体验。这也适用于所有其他锁定技术,如羊群或 例如数据库锁。只要锁是活动的后续 请求可能会阻塞。
你可能想检查一下
if (is_callable('fastcgi_finish_request'))
...
相关问题的更多信息:continue processing php after sending http response
【讨论】:
【参考方案5】:当我的 Telegram-bot 不断发送消息时,我在数据库中创建了一个记录帖子表。 当我在 Telegram-bot 中发送帖子时,用 PHP alghorythm 编写会检查数据库中是否已存在新帖子: * 如果是,我们停止发送帖子的过程; * 如果没有,我们会继续在 Telegram 中发送。 所描述的方法允许停止一次又一次发送帖子的循环。
【讨论】:
【参考方案6】:Telegram 机器人由于 hooks 的结构以及以指定时间格式发送和接收消息
它对时间非常敏感。
我有同样的问题,发现使用date_default_timezone_set
函数
这将解决删除此功能后的问题。如果您在代码中更改了时间模板,请将其删除。
【讨论】:
以上是关于我的电报机器人不断地发送消息的主要内容,如果未能解决你的问题,请参考以下文章