DroidScript
DroidScript
учимся и разрабатываем

Сохранение данных

Ботостроительство  
16.12.2024

На этом занятии мы продолжим тему работы с данными и рассмотрим разные варианты передачи данных между запросами и их сохранения для дальнейшего использования.

С сохранением данных всё просто - сохраняем всё, что может потребоваться в будущем.

Задача 1. Предположим, у нас есть канал с анонсами мероприятий. Создаём бота, который формирует сводку мероприятий в виде списка по дням недели, начиная от текущего на какой-то период. Анонсы могут меняться и нужно сделать так, чтобы бот мог регулярно обходить их и обновлять список с учётом изменений (отмена, перенос, правка и т.д.). Для этого требуется две вещи - внедрить формат для сообщений и эти данные нужно где-то хранить.

Задача 2. Мы хотим вывести в чат сообщение с кнопками так, чтобы при нажатии на эти кнопки происходило не создание новых сообщений, а изменение информации в этом же сообщении. Значит, нужно как минимум сохранить номер сообщения, чтобы его можно было изменить.

Задача 3. Пользователь вводит в чат последовательно три сообщения и нужно все данные из них связать c id пользователя.

Для начала нужно понять, где вообще можно хранить данные

  • Телеграм
  • Сессия
  • Файл
  • База данных

Каждый их этих способов имеет свои преимущества и целесообразность использования. Можно, конечно, развернуться по полной и для всего использовать базу данных, но это будет выглядеть как пушкой по воробьям, если нужно сохранить всего одно число или строку.

Как в ТГ что-то сохранить? Если чат персональный, можно использовать поля чата:

  • Короткое описание setMyShortDescription - 120 символов
  • Описание setMyDescription - 512 символов
  • Название setMyName - 64 символа. Этот вариант не пройдёт. При частом изменении названия бота будет получен бан в виде таймаута
  • Кнопка меню в чате setChatMenuButton - 21 символ на десктопе. Этого вполне достаточно для вывода короткого лога, результата вычисления выражения и т.п.

Если одни и те же данные должны быть доступны всем подписчикам, то их можно сохранить:

  • В закрепе (пока его не открепят)
  • В первом сообщении канала

Последний способ позволяет реализовать любопытное решение - динамически изменяемый пост со статичным адресом.

Для примера посмотрите канал Велоанонсы+. В нём создаётся закреп со списком актуальных мероприятий. Для перехода в список нужно выполнить три щелчка:

  • открыть ТГ
  • щелкнуть на канале (если он находится на первом экране)
  • щелкнуть на закрепе

Но получить информацию можно и одним щелчком - сделать ярлык на пост и щелкать по нему. Проблема в том, что пост в закрепе каждый раз создаётся новый и ссылка на него обновляется.

Bot Api не поддерживает работу с сессиями, но мы заставим его (пусть грубо) это делать. Для этого необходимо перед стартом сессии задать идентификатор.

  session_id(str_pad('mybot', 32, 'F'));
  session_start();

Если в чате много пользователей, то для сопоставления данных используется ассоциативный массив, ключ в котором будет содержать chat_id пользователя. В этом случае запись и получение параметров будет в таком виде:

  $_SESSION[chat_id] = [
      "par1"=>"",
      "parN" => ""
  ];
  
  $var1 = $_SESSION[chat_id]["par1"];
  $varN = $_SESSION[chat_id]["parN"];

Для сохранения данных также используются файлы и базы.

Данные в виде списка и таблицы можно сохранять в файле в формате CSV, разветвлённые данные - в формате json.

Если данных много и/или требуется мощный поиск и фильтрация, то практичнее использовать базу данных, например, SQL Lite, если не требуется хостинг.

Сообщения в ленте тоже хранят данные и возникает вопрос, а можно ли как-то получить текст из них, зная ID сообщений? Можно, если сообщение имеет встроенную клавиатуру. Вызываем метод editMessageReplyMarkup с изменённой клавиатурой. В ответ получаем сообщение. Для изменения клавиатуры можно в параметр callback_data выводить текущее время в миллисекундах (Timestamp), как это делается для запрета кеширования файлов.

Если сообщение было отправлено без клавиатуры, то прикрепить к нему клавиатуру позже не получится. Клавиатура отправляется только вместе с сообщением.

Ботостроительство  
© 2016-2025 
actech