На этом занятии мы продолжим тему работы с данными и рассмотрим разные варианты передачи данных между запросами и их сохранения для дальнейшего использования.
С сохранением данных всё просто - сохраняем всё, что может потребоваться в будущем.
Задача 1. Предположим, у нас есть канал с анонсами мероприятий. Создаём бота, который формирует сводку мероприятий в виде списка по дням недели, начиная от текущего на какой-то период. Анонсы могут меняться и нужно сделать так, чтобы бот мог регулярно обходить их и обновлять список с учётом изменений (отмена, перенос, правка и т.д.). Для этого требуется две вещи - внедрить формат для сообщений и эти данные нужно где-то хранить.
Задача 2. Мы хотим вывести в чат сообщение с кнопками так, чтобы при нажатии на эти кнопки происходило не создание новых сообщений, а изменение информации в этом же сообщении. Значит, нужно как минимум сохранить номер сообщения, чтобы его можно было изменить.
Задача 3. Пользователь вводит в чат последовательно три сообщения и нужно все данные из них связать c id пользователя.
Для начала нужно понять, где вообще можно хранить данные
Каждый их этих способов имеет свои преимущества и целесообразность использования. Можно, конечно, развернуться по полной и для всего использовать базу данных, но это будет выглядеть как пушкой по воробьям, если нужно сохранить всего одно число или строку.
Как в ТГ что-то сохранить? Если чат персональный, можно использовать поля чата:
Если одни и те же данные должны быть доступны всем подписчикам, то их можно сохранить:
Последний способ позволяет реализовать любопытное решение - динамически изменяемый пост со статичным адресом.
Для примера посмотрите канал Велоанонсы+. В нём создаётся закреп со списком актуальных мероприятий. Для перехода в список нужно выполнить три щелчка:
Но получить информацию можно и одним щелчком - сделать ярлык на пост и щелкать по нему. Проблема в том, что пост в закрепе каждый раз создаётся новый и ссылка на него обновляется.
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), как это делается для запрета кеширования файлов.
Если сообщение было отправлено без клавиатуры, то прикрепить к нему клавиатуру позже не получится. Клавиатура отправляется только вместе с сообщением.