Найти в Дзене

Ошибка 'Bad Request: message to edit not found' при редактировании сообщений ботом

На одном из проектов столкнулся со следующей проблемой: Бот при попытке редактировать сообщение получает ошибку, что данного сообщения не существует: Bad Request: message to edit not found При этом сообщение на месте и можно даже получить его идентификатор. Эту проблему я наблюдал довольно долго и в какой-то момент решил закатать рукава и разобраться почему же так происходит. Бот занимается рассылкой заказов на спецтехнику. Как только в базе появляются новые заказы, бот рассылает их всем пользователям, которые подписались на ту или иную спецтехнику. Для примера буду использовать сообщения от февраля 2023 года, потому что анализировал данную проблему именно в это время. В примерах опущу некоторые детали, которые не имеют значения, чтобы не нагружать текстом. В документации для поля massage есть интересное дополнение: Note that message content and message date will not be available if the message is too old То есть когда приходит событие обратного вызова (callback) при нажатии на к
Оглавление

Введение

На одном из проектов столкнулся со следующей проблемой: Бот при попытке редактировать сообщение получает ошибку, что данного сообщения не существует: Bad Request: message to edit not found

При этом сообщение на месте и можно даже получить его идентификатор. Эту проблему я наблюдал довольно долго и в какой-то момент решил закатать рукава и разобраться почему же так происходит.

Про бота

Бот занимается рассылкой заказов на спецтехнику. Как только в базе появляются новые заказы, бот рассылает их всем пользователям, которые подписались на ту или иную спецтехнику.

Для примера буду использовать сообщения от февраля 2023 года, потому что анализировал данную проблему именно в это время.

В примерах опущу некоторые детали, которые не имеют значения, чтобы не нагружать текстом.

Поехали! 🚀

В документации для поля massage есть интересное дополнение:

Note that message content and message date will not be available if the message is too old

То есть когда приходит событие обратного вызова (callback) при нажатии на кнопку, то содержимое сообщения и дата сообщения будут недоступны, если сообщение слишком старое. Что такое слишком старое - непонятно. Я решил проверить как это работает.

Разбираем первое сообщение

У меня открыто сообщение от 12 февраля, 15:06, которое имеет кнопку "Назад". Нажимаю на кнопку и получаю следующую структуру объекта Message:

Пример файла на Github Gist
Дата на месте, информация по сообщению есть
Дата на месте, информация по сообщению есть

В этом сообщении все отлично: Есть дата сообщения и все необходимые поля

Разбираем второе сообщение

У меня открыто идентичное сообщение, но уже от 10 февраля, 14:05.

Нажимаю на кнопку "Назад" и получаю:

Пример файла на Github Gist
Информации по сообщению практически не возвращается
Информации по сообщению практически не возвращается

Во втором случае информации по сообщению практически не возвращается: Нет даты сообщения и фактически нет никакой информации по сообщению. При попытке редактировать такое сообщение получаем ошибку:

EditMessageText query: [400] Bad Request: message to edit not found

То есть в данном случае сообщение двухдневной давности считается слишком старым.

Гипотеза

У меня есть гипотеза, почему так происходит:

У бота общий счетчик сообщений, который постоянно растет. То есть если первый пользователь отправил сообщение боту и сообщению был присвоен ID 125, то когда второй пользователь отправит сообщение - ID уже будет 126.

Так как бот занимается непосредственно рассылкой, то счетчик сообщений растет очень быстро. На практике бот может отправлять только в минуту МИНИМУМ 1000 сообщений. В таком случае неудивительно, что сообщения, которым буквально несколько часов, считаются уже старыми.

На старте такой проблемы конечно же не было, потому что нагрузка на бота была В РАЗЫ меньше. Со временем кол-во подписок росло и сообщений отправлялось больше, поэтому сообщения стали быстро терять свою актуальность и нет возможности их редактировать.

Для наглядности:

143 569 715 - ID сообщения от 12 февраля 15:06
143 369 893 - ID сообщения от 10 февраля, 14:05
199 822 - Разница

То есть за 2 суток бот отправил почти 200к сообщений❗️

Кто виноват и что делать?

У меня была мысль либо удалять такие сообщения, либо отправлять reply (ответ) на такое сообщение с текстом пояснения. НО здесь я так же получил ошибки:

Error executing SendMessage query: [400] Bad Request: replied message not found и message to delete not found

Потому что сообщение все так же является слишком старым. Ни ответить на него, ни удалить не получится.

Так что же делать?

Думаю все зависит от проекта, потому что для кого-то это может быть некритично. Как вариант, можно отправлять новое сообщение с пояснительным текстом, но уже без привязки к сообщению, на котором была нажата кнопка. Либо, если есть возможность, пересмотреть реализацию взаимодействия с сообщениями, которые имеют Inline кнопки.

#develop #bot_api #telegram_bot