@jadam

Редактирование сообщений Telegram Bot?

Суть такова:
Бот отправляет сообщение пользователю.
Сохраняем 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);

};


Что не так?
Есть подозрение что телега слишком долго ждёт ответа от сервера и начинает присылать повторный запрос, а так же, есть предположение, что одно и тоже сообщение нельзя редактировать много раз.
  • Вопрос задан
  • 492 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы