Суть такова:
Бот отправляет сообщение пользователю.
Сохраняем ID последнего сообщения.
Потом входим в подобный цикл:
for ($i=0; $i<60; $i++) {
sleep(1);
//edit last message
}
Первые 10-15 секунд сообщение редактируется на ура, но потом (хотя были случаи что и почти сразу, т.е. рандомно) бот начинает присылать новое сообщение (с отредактированными данными), а не редактировать старое.
Так же в этот момент api телеги возвращает ID отредактированного сообщения, но значение уже отличается от того, что было изначально.
Так же как я заметил, иногда например на 15 секунде счётчик обнуляется и бот присылает новое сообщение, а не редактирует старое.
Ниже приведу кусок кода целиком:
$callback_balancecheck = function () use ($Bot, $BotController, $mySql, $Numbers) {
$editmessage = $BotController->removeLastMarkup($Bot->editMessage(\TelegramBot\Bot::MESSAGE_EDIT_REPLY_MARKUP), $Bot->Request->id, $BotController->getLastMessageID($Bot->Request->id));
$Bot->send($editmessage);
$message = $Bot->createMessage();
$message->chat_id($Bot->Request->id);
$message->text("*Начало проверки баланса\.*\n\r\n\rОжидайте ответного сообщения через некоторое время\.\n\r\n\r");
$message->parse_mode(\TelegramBot\Message::PARSEMODE_MarkdownV2);
$result = $Bot->send($message);
$BotController->saveLastMessageID($Bot->Request->id, $result->message_id);
$last_message_id = $result->message_id;
//file_put_contents("ids.txt", $last_message_id."\n", FILE_APPEND);
$user_id = $BotController->getRegisteredUserID($Bot->Request->id);
$userName = $mySql->query("SELECT login FROM users WHERE id = '".$user_id."'")->fetchAll();
$userName = $userName[0]['login'];
$activeNumbers = $Numbers->getActiveNumbers($user_id);
$activeNumbers = $Numbers->getOperatorNumbers($activeNumbers);
$customNumbers = $BotController->getCustomNumber($Bot->Request->id);
$i = 1;
foreach ($activeNumbers as $key => $value) {
$number = array();
$number[0] = $value[0];
$number[1] = $Numbers->getNumberPassword($value[0]);
$number[2] = $value[1];
$balance = $Numbers->getBalance($number);
$editmessage = $Bot->editMessage(\TelegramBot\Bot::MESSAGE_EDIT_FULL);
$editmessage->chat_id($Bot->Request->id);
$editmessage->message_id($last_message_id);
$editmessage->text("*Начало проверки баланса\.*\n\r\n\rОжидайте ответного сообщения через некоторое время\.\n\r\n\rПроверено *".$i."* из *".(count($activeNumbers) + count($customNumbers))."* номеров\.");
$editmessage->parse_mode(\TelegramBot\Message::PARSEMODE_MarkdownV2);
$result = $Bot->send($editmessage);
$last_message_id = $result->message_id;
//file_put_contents("ids.txt", $last_message_id."\n", FILE_APPEND);
if ($balance != \Numbers\Numbers::BALANCE_ERROR) {
$activeNumbers[$key][2] = $balance;
$lastBalance = $Numbers->getLastBalance($number);
$activeNumbers[$key][3] = $lastBalance['balance'];
if (floatval($lastBalance['balance']) != floatval($balance)) {
$Numbers->saveBalance($number[0], $balance);
}
}
else {
$activeNumbers[$key][2] = \Numbers\Numbers::BALANCE_ERROR;
}
$i++;
}
uasort($activeNumbers, 'cmp');
foreach ($customNumbers as $key => $value) {
$number = array();
$number[0] = $value[0];
$number[1] = $value[1];
$number[2] = $Numbers->getOperatorNumbers([$value[0]])[0][1];
$balance = $Numbers->getBalance($number);
$editmessage = $Bot->editMessage(\TelegramBot\Bot::MESSAGE_EDIT_FULL);
$editmessage->chat_id($Bot->Request->id);
$editmessage->message_id($last_message_id);
$editmessage->text("*Начало проверки баланса\.*\n\r\n\rОжидайте ответного сообщения через некоторое время\.\n\r\n\rПроверено *".$i."* из *".(count($activeNumbers) + count($customNumbers))."* номеров\.");
$editmessage->parse_mode(\TelegramBot\Message::PARSEMODE_MarkdownV2);
$result = $Bot->send($editmessage);
$last_message_id = $result->message_id;
//file_put_contents("ids.txt", $last_message_id."\n", FILE_APPEND);
if ($balance != \Numbers\Numbers::BALANCE_ERROR) {
$customNumbers[$key][2] = $balance;
$lastBalance = $Numbers->getLastBalance($number);
$customNumbers[$key][3] = $lastBalance['balance'];
if (floatval($lastBalance['balance']) != floatval($balance)) {
$Numbers->saveBalance($number[0], $balance);
}
}
else {
$customNumbers[$key][2] = \Numbers\Numbers::BALANCE_ERROR;
}
$i++;
}
uasort($customNumbers, 'cmp');
$messageText = "*Список активных номеров \(". (count($activeNumbers) + count($customNumbers)) ."\) для пользователя _".$userName."_*\n\r\n\r";
$messageText .= $Bot->escape(date("d.m.y H:i:s"))."\n\r\n\r";
foreach ($activeNumbers as $key => $value) {
if ($value[2] != \Numbers\Numbers::BALANCE_ERROR) {
$delta = floatval($value[2]) - floatval($value[3]);
if ($delta < 0) {
$delta_msg = " *".$Bot->escape(sprintf("%01.2f", $delta))."*р\.";
}
else if ($delta > 0) {
$delta_msg = " *".$Bot->escape("+".sprintf("%01.2f", $delta))."*р\.";
}
else {
$delta_msg = "";
}
$messageText .= $BotController->formatMinBalance($value[2], $Bot->escape($Numbers->format($value[0])))." ".$BotController->formatMinBalance($value[2], $Bot->escape(sprintf("%01.2f", $value[2]))."р\.").$delta_msg."\n\r";
}
else {
$messageText .= $Bot->escape($Numbers->format($value[0]))." Ошибка\n\r";
}
}
$messageText .= "\n\r*Дополнительные номера*\n\r\n\r";
foreach ($customNumbers as $key => $value) {
if ($value[2] != \Numbers\Numbers::BALANCE_ERROR) {
$delta = floatval($value[2]) - floatval($value[3]);
if ($delta < 0) {
$delta_msg = " *".$Bot->escape(sprintf("%01.2f", $delta))."*р\.";
}
else if ($delta > 0) {
$delta_msg = " *".$Bot->escape("+".sprintf("%01.2f", $delta))."*р\.";
}
else {
$delta_msg = "";
}
$messageText .= $BotController->formatMinBalance($value[2], $Bot->escape($Numbers->format($value[0])))." ".$BotController->formatMinBalance($value[2], $Bot->escape(sprintf("%01.2f", $value[2]))."р\.").$delta_msg."\n\r";
}
else {
$messageText .= $Bot->escape($Numbers->format($value[0]))." Ошибка\n\r";
}
}
$message = $Bot->createMessage();
$message->chat_id($Bot->Request->id);
$message->text($messageText);
$message->parse_mode(\TelegramBot\Message::PARSEMODE_MarkdownV2);
$keyboard = $BotController->createKeyboard($message->createKeyboard(), [BotController::KEYBOARD_ACCOUNTINFO, BotController::KEYBOARD_CHECKBALANCE, BotController::KEYBOARD_NUMBERINFO, BotController::KEYBOARD_SETTINGS]);
$message->reply_markup($keyboard);
$result = $Bot->send($message);
$BotController->saveLastMessageID($Bot->Request->id, $result->message_id);
};
Что не так?
Есть подозрение что телега слишком долго ждёт ответа от сервера и начинает присылать повторный запрос, а так же, есть предположение, что одно и тоже сообщение нельзя редактировать много раз.