Как хранить данные бота прямо в Телеграме

da887b6b5a413be6e1ae71ade1e6b746

Постановка задачи

Как известно, бот это программа на компьютере, которая взаимодействует с https://api.telegram.org и притворяется человеком. Разумеется, у неё есть данные в своей собственной базе данных или типа того. Если этот компьютер внезапно исчезнет, то хотелось бы, чтобы верные друзья в другом месте и с другим компьютером «засунули флешку» и запустили этого же бота из другого места. И, разумеется, для этого нужно передать актуальные данные из старого места в новое. Разумеется, для этого существуют какие-нибудь проверенные временем дорогостоящие решения, но это всё можно организовать прямо через Телеграм. И не спрашивайте, зачем это нужно лично вам.

Файлы

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

Первый способ. Через сообщения

Команда sendMessage не только посылает сообщение. Она еще и возвращает номер этого сообщения. И по паре чисел (Id чата, номер сообщения) это самое сообщение можно регулярно изменять (например, записывая туда file_id резервной копии данных) посредством editMessageText, и потом прочитать из нового экземпляра бота посредством forvardMessage (да, эта команда ещё и возвращает текст передаваемого сообщения). Так вот, эта пара (Id чата, номер сообщения) не меняется, и это значит, что можно сначала запустить бота, он сделает сообщения (в какой-нибудь приватный канал) для хранения file_id резервной копии и покажет пару чисел (Id чата, номер сообщения). Затем следует вписать эту пару чисел в «бот на флешке» и раздать её своим верным друзьям. Это вполне работающий метод, но вот это вот: «сначала запустить потом изменить код бота» — несколько неудобно. Но есть и

Второй способ. Через меню

Как известно, у бота есть меню. Когда-то давно его можно было делать только через @BotFather, но, потом появилась setMyCommands, чтобы установить меню прямо из бота, и getMyCommands, чтобы прочитать то, что было в это самое меню установлено. Итак: бот делает резервную копию и записывает file_id этой копии в какой-нибудь приватный канал. Потом узнает пару чисел (Id чата, номер сообщения) и записывает их в меню в виде как бы пояснения к команде.

При запуске бота с другого компьютера, бот сначала сделает getMyCommands, узнает ту самую пару чисел, сделает forvardMessage, узнает file_id, скачает данные, и как будто ничего и не случилось.

Понятно, что эта пара чисел будет болтаться перед глазами всех пользователей и вызывать ненужные вопросы, но в июне 2021 года у setMyCommand появилось поле language_code и возможность делать разные меню для разных пользователей с разным языком в системных настройках. Экспериментально установлено, что в качестве языкового кода можно указывать несуществующие языки типа «xy» и это значит, что пользователи ничего лишнего не увидят и вопросов не зададут.

Более того. Можно организовать автозапуск запасных ботов и обойтись без верных друзей. Итак: Основной бот запущен в рабочем режиме и, кроме прочего, регулярно пишет что-нибудь меняющееся в меню или в сообщение с известным номером. Например, текущее время. Запасные боты (запущенные в других местах) находятся в спящем режиме, они ничего не делают, но регулярно (но через случайные промежутки времени) смотрят это «текущее время». Если они замечают, что оно давно не обновлялось, то первый обнаруживший это бот запустится в рабочем режиме. И как будто ничего и не случилось…

И не спрашивайте, зачем это может понадобиться лично вам.

© Habrahabr.ru