Как отправить клавиатуру без сообщения telegram
Создание на Telegram меню из кнопок (встроенные клавиатуры).
Содержание.
Классы KeyboardButton и InlineKeyboardButton .
Данные классы определяют атрибуты и методы, одноименные с названиями аргументов.
KeyboardButton(text, request_contact=None, request_location=None, request_poll=None, **_kwargs) :
Объект KeyboardButton представляет собой одну кнопку клавиатуры для ответа текстом text , который отображается на кнопке. Необязательные аргументы исключают друг друга. Импортируется из основного модуля telegram.KeyboardButton .
Значение и поведение аргументов KeyboardButton :
InlineKeyboardButton(text, url=None, callback_data=None, switch_inline_query=None, switch_inline_query_current_chat=None, callback_game=None, pay=None, login_url=None, **_kwargs)
Объект InlineKeyboardButton представляет одну кнопку встроенной клавиатуры. Допускается использовать ровно одно из необязательных полей. Импортируется из основного модуля telegram.InlineKeyboardButton .
Значение и поведение аргументов InlineKeyboardButton :
Алгоритм построения и отправки кнопок в Telegram чат.
Для создания макета кнопок со столбцами n_cols из списка кнопок необходимо создать функцию build_menu() , которая будет шаблоном для построения кнопок:
В коде выше определены списки header_buttons и footer_buttons , их можно использовать чтобы поместить кнопки в первую или последнюю строку соответственно.
В приведенном ниже фрагменте кода нужно заменить . соответствующим значением аргумента callback_data - это строка (UTF-8 1-64 байта) с данными, отправляемые боту в ответном запросе при нажатии кнопки. Если будете использовать кнопки KeyboardButtons для создания списка кнопок button_list , то для построения передаваемой в чат клавиатуры из кнопок используйте ReplyKeyboardMarkup вместо InlineKeyboardMarkup .
Или, если нужна динамическая версия, используйте генератор списка для динамического создания button_list из списка строк:
Это особенно полезно, если поместить внутрь вспомогательного метода, такого как get_data_buttons , для работы с динамическими данными и обновления меню в соответствии с вводом пользователя.
Чтобы обработать callback_data , необходимо подключить обработчик CallbackQueryHandler .
CallbackQueryHandler(callback, pattern=None, run_async=False) :
Объект CallbackQueryHandler представляет собой обработчик запросов обратного вызова Telegram. Может использовать дополнительную фильтрацию на основе регулярных выражений модуля re .
Значение и поведение аргументов InlineKeyboardButton :
Остальные аргументы устарели. Такие параметры, как update_queue , job_queue , groups , groupdict , user_data , chat_data функциях обратного вызова можно получить объект контекста context
Базовый пример, использующий встроенную клавиатуру.
Пример встроенной клавиатуры с 2-мя состояниями.
Данный пример снабжен комментариями, так что понять как и что работает не составит труда. Он так же демонстрирует использование обработчиков CallbackQueryHandler и ConversationHandler .
Как работает обработчик разговора ConversationHandler() .
Основная магия происходит в обработчике разговора ConversationHandler() . Обработчик ConversationHandler() имеет три основные точки, которые необходимо определить для ведения беседы:
Переключение между этапами разговора происходит при помощи функций обратного вызова, которые при обработке/анализе ответа пользователя будут возвращать нужный этап/состояние разговора.
Telegram бот на Python, отправка файлов, встроенная клавиатура
Это вторая часть статьи, где мы продолжим создавать нашего телеграм бота на Python, и научим его отправлять файлы и выводить настраиваемую клавиатуру.
Отправка файлов Telegram API
В Telegram API есть три способа отправки файлов, для демонстрации воспользуемся методом sendPhoto и добавим три функции для отправки фотографии.
Первая способ: Предоставить файл по URL, Telegram скачает и отправит его (максимальный размер 5 МБ).
Проверка
Почти все готово, осталось немного отредактировать функцию check_message и приступим к проверке бота.
Фото с компьютера
Фото с сервера телеграм
С полным списком методов можно ознакомиться здесь
Встроенная клавиатура
Добавим две функции для вывода настраиваемой клавиатуры в телеграм
Отредактируем функцию check_message для вывода нашей клавиатуры
Проверка
Проверим как все работает
Меню из кнопок, модуль python-telegram-bot в Python.
Создание на Telegram меню из кнопок (встроенные клавиатуры).
Содержание.
Классы KeyboardButton и InlineKeyboardButton .
Данные классы определяют атрибуты и методы, одноименные с названиями аргументов.
KeyboardButton(text, request_contact=None, request_location=None, request_poll=None, **_kwargs) :
Объект KeyboardButton представляет собой одну кнопку клавиатуры для ответа текстом text , который отображается на кнопке. Необязательные аргументы исключают друг друга. Импортируется из основного модуля telegram.KeyboardButton .
Значение и поведение аргументов KeyboardButton :
InlineKeyboardButton(text, url=None, callback_data=None, switch_inline_query=None, switch_inline_query_current_chat=None, callback_game=None, pay=None, login_url=None, **_kwargs)
Объект InlineKeyboardButton представляет одну кнопку встроенной клавиатуры. Допускается использовать ровно одно из необязательных полей. Импортируется из основного модуля telegram.InlineKeyboardButton .
Значение и поведение аргументов InlineKeyboardButton :
Алгоритм построения и отправки кнопок в Telegram чат.
Для создания макета кнопок со столбцами n_cols из списка кнопок необходимо создать функцию build_menu() , которая будет шаблоном для построения кнопок:
В коде выше определены списки header_buttons и footer_buttons , их можно использовать чтобы поместить кнопки в первую или последнюю строку соответственно.
Или, если нужна динамическая версия, используйте генератор списка для динамического создания button_list из списка строк:
Это особенно полезно, если поместить внутрь вспомогательного метода, такого как get_data_buttons , для работы с динамическими данными и обновления меню в соответствии с вводом пользователя.
Чтобы обработать callback_data , необходимо подключить обработчик CallbackQueryHandler .
CallbackQueryHandler(callback, pattern=None, run_async=False) :
Объект CallbackQueryHandler представляет собой обработчик запросов обратного вызова Telegram. Может использовать дополнительную фильтрацию на основе регулярных выражений модуля re .
Значение и поведение аргументов InlineKeyboardButton :
Остальные аргументы устарели. Такие параметры, как update_queue , job_queue , groups , groupdict , user_data , chat_data функциях обратного вызова можно получить объект контекста context
Базовый пример, использующий встроенную клавиатуру.
Пример встроенной клавиатуры с 2-мя состояниями.
Данный пример снабжен комментариями, так что понять как и что работает не составит труда. Он так же демонстрирует использование обработчиков CallbackQueryHandler и ConversationHandler .
Как работает обработчик разговора ConversationHandler() .
Основная магия происходит в обработчике разговора ConversationHandler() . Обработчик ConversationHandler() имеет три основные точки, которые необходимо определить для ведения беседы:
Переключение между этапами разговора происходит при помощи функций обратного вызова, которые при обработке/анализе ответа пользователя будут возвращать нужный этап/состояние разговора.
Кнопки¶
Обычные кнопки¶
Кнопки как шаблоны¶
Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр resize_keyboard=True .
Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это массив массивов кнопок, а если говорить проще, массив строк. Метод add() при каждом вызове создаёт новую строку (ряд) и принимает произвольное число аргументов по количеству желаемых кнопок в строке. Перепишем наш код, чтобы было красиво:
Обратите внимание на конструкцию *buttons . Здесь вам не C++ и звёздочка используется для распаковки списка. Подробнее об операторах * и ** можно прочитать здесь.
Смотрим — действительно красиво:
Осталось научить бота реагировать на нажатие таких кнопок. Как уже было сказано выше, необходимо делать проверку на полное совпадение текста. Сделаем это двумя способами: через специальный фильтр Text и обычной лямбдой:
У объекта обычной клавиатуры есть ещё две полезных опции: one_time_keyboard для скрытия кнопок после нажатия и selective для показа клавиатуры лишь некоторым участникам группы. Их использование остаётся для самостоятельного изучения.
Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром row_width . При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N — значение row_width , например, row_width=2 . Попробуйте!
Специальные обычные кнопки¶
По состоянию на конец ужасного 2020 года в Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами: для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип KeyboardButtonPollType и, по желанию, указать тип создаваемого объекта.
Впрочем, проще один раз увидеть код:
Инлайн-кнопки¶
URL-кнопки и колбэки¶
Login- и Pay-кнопки в книге рассматриваться не будут вообще. Если у кого-то есть желание помочь хотя бы с рабочим кодом для авторизации или оплаты, пожалуйста, создайте Pull Request на GitHub. Спасибо!
А если хотите обе кнопки в ряд, то уберите row_width=1 (тогда будет использоваться значение по умолчанию 3).
С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам. Это очень мощная штука, которую вы можете встретить практически везде. Кнопки-реакции у постов (лайки), меню у @BotFather и т.д. Суть в чём: у колбэк-кнопок есть специальное значение (data), по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до перезагрузки сервера.
Несмотря на то, что параметр кнопки callback_data , а значение data лежит в одноимённом поле data объекта CallbackQuery, собственный фильтр aiogram называется text .
Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку. Чтобы скрыть часики, нужно вызвать метод answer() у колбэка (или использовать метод API answer_callback_query() ). В общем случае, в метод answer() можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):
Когда вызывать answer() ?
В общем случае, главное — просто не забыть сообщить Telegram о получении колбэк-запроса, но я рекомендую ставить вызов answer() в самом конце, и вот почему: если вдруг в процессе обработки колбэка случится какая-то ошибка и бот нарвётся на необработанное исключение, пользователь увидит неубирающиеся полминуты часики и поймёт, что что-то не так. В противном случае, часики исчезнут, а пользователь останется в неведении, выполнился его запрос успешно или нет.
И, казалось бы, всё работает:
Если теперь вы попробуете повторить пример выше, то указанное исключение в этом блоке кода бот просто-напросто проигнорирует.
Фабрика колбэков¶
В aiogram существует т.н. фабрика колбэков. Вы создаёте объект CallbackData , указываете ему префикс и произвольное количество доп. аргументов, которые в дальнейшем указываете при создании колбэка для кнопки.
Например, рассмотрим следующий объект:
В примере выше в кнопку запишется callback_data , равный post:5:like , а хэндлер на префикс post будет выглядеть так:
В предыдущем примере с числами мы грамотно выбрали callback_data , поэтому смогли легко запихнуть все обработчики в один хэндлер. Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку "Подтвердить". Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использоваанием фабрики:
На этом глава про кнопки окончена, но про некоторые других их виды мы поговорим в следующих главах.
В этой главе мы повысим юзабилити нашего бота за счёт добавления клавиатуры, которая сделает интерфейс бота интуитивно понятным, и простым в использовании.
3.1 Какие типы клавиатур поддерживает телеграм бот
На момент написания книги telegram.bot позволяет вам создать клавиатуры двух типов:
Ниже мы разберём несколько примеров.
3.2 Reply клавиатура
Как я уже писал выше, это основная клавиатура управления ботом.
Выше приведён пример из официальной справки пакета telegram.bot . Для создания клавиатуры используется функция ReplyKeyboardMarkup() , которая в свою очередь принимает список списков кнопок, которые создаются функцией KeyboardButton() .
Почему в ReplyKeyboardMarkup() необходимо передавать не просто список, а список списков? Дело в том, что вы передаёте основной список, и в нём отдельными списками вы задаёте каждый ряд кнопок, т.к. в один ряд можно расположить несколько кнопок.
Аргумент resize_keyboard позволяет автоматически подбирать оптимальный размер кнопок клавиатуры, а аргумент one_time_keyboard позволяет скрывать клавиатуру после каждого нажатия на кнопку.
Давайте напишем простейшего бота, у которого будет 3 кнопки: * Чат ID - Запросить чат ID диалога с ботом * Моё имя - Запросить своё имя * Мой логин - Запросить своё имя пользователя в телеграм
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.
После запуска задайте боту команду /start , т.к. именно её мы определили для запуска клавиатуры.
Если на данный момент вам сложно разобрать приведённый пример кода, с созданием методов, фильтров и обработчиков, то следует вернуться к предыдущей главе, в которой я подробно всё это описал.
Мы создали 4 метода:
- start - Запуск клавиатуры
- chat_id - Запрос идентификатора чата
- my_name - Запрос своего имени
- my_username - Запрос своего логина
И создали 4 обработчика, которые по заданным командам и фильтрам будут выполнять указанные методы.
Сама клавиатура создаётся внутри метода start() командой ReplyKeyboardMarkup() .
В нашем случае все кнопки мы расположили друг под другом, но мы можем расположить их в один ряд, внеся изменения в список списков кнопок. Т.к. один ряд внутри клавиатуры создаётся через вложенный список кнопок, то для того, что бы вывести наши кнопки в один ряд надо переписать часть кода по построению клавиатуры вот так:
Отправляется клавиатура в чат методом sendMessage() , в аргументе reply_markup .
3.3 Inline клавиатура
Изначально вам необходимо добавить боту метод, для вызова Inline клавиатуры.
Для ответа на нажатие Inline кнопки также можно использовать метод бота answerCallbackQuery() , который может вывести уведомление в интерфейсе telegram, пользователю нажавшему Inline кнопку.
Данные отправленные с Inline кнопки не являются текстом, поэтому для их обработки необходимо создать специальный обработчик с помощью команды CallbackQueryHandler() .
Код построения Inline клавиатуры который приводится в официальной справке пакета telegram.bot .
Строить Inline клавиатуру необходимо с помощью команды InlineKeyboardMarkup() , по такому же принципу, как и Reply клавиатуру. В InlineKeyboardMarkup() необходимо передать список, списков Inline кнопок, каждая отдельная кнопка создаётся функцией InlineKeyboardButton() .
Inline кнопка может либо передавать боту какие-то данные с помощью аргумента callback_data , либо открывать какую-либо HTML страницу, заданную с помощью аргумента url .
В результате будет список, в котором каждый элемент так же является списком Inline кнопок, которые необходимо объединить в один ряд.
Далее мы рассмотрим несколько примеров ботов с Inline кнопками.
3.3.1 Пример простейшего бота с поддержкой InLine кнопок
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.
Результат:
Мы создали два метода:
- test - Для отправки в чат Inline клавиатуры
- answer_cb - Для обработки отправленных с клавиатуры данных.
Данные, которые будут отправлены с каждой кнопки задаются в аргументе callback_data , при создании кнопки. Получить отправленные с кнопки данные можно с помощью конструкции update$callback_query$data , внутри метода answer_cb.
Что бы бот реагировал на Inline клавиатуру, метод answer_cb обрабатывается специальным обработчиком: CallbackQueryHandler(answer_cb) . Который запускает указанный метод по нажатию Inline кнопки. Обработчик CallbackQueryHandler принимает два аргумента:
- callback - Метод который необходимо запустить
- pattern - Фильтр по данным, которые привязаны к кнопке с помощью аргумента callback_data .
Соответвенно с помощью аргумента pattern мы можем под нажатие каждой кнопки написать отдельный метод:
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.
Теперь мы написали 2 отдельных метода, т.е. по одному методу, под нажатие каждой кнопки, и использовали аргумент pattern , при создании их обработчиков:
Заканчивается код метода answer_cb командой bot$answerCallbackQuery(callback_query_id = update$callback_query$id) , которая сообщает боту, что данные с inline клавиатуры получены.
3.3.2 Пример бота, который сообщает текущую погоду по выбранному городу
Давайте попробуем написать бота, который запрашивает данные о погоде.
В этом примере кода мы будем использовать несколько дополнительных пакетов:
Код бота, который сообщает текущую погоду по выбранному городу
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.
В результате наш бот будет работать примерно так:
Схематически данного бота можно изобрать вот так:
Мы создали 3 метода, доступные внутри нашего погодного бота:
- start - Запуск основной клавиатуры бота
- weather - Запуск Inline клавиатуры для выбора города
- answer_cb - Основной метод, который по заданному городу запрашивает в API погоду, и отправляет её в чат.
Метод start у нас запускается командой /start , что реализовано обработчиком CommandHandler('start', start) .
Для запуска метода weather мы создали одноимённый фильтр:
И в конце концов, основной наш метод answer_cb реагирует на нажатие Inline кнопок, что реализовано специальным обработчиком: CallbackQueryHandler(answer_cb) .
Данного бота я привожу для того, что бы показать вам, как вывести Inline кнопки которые ведут на веб страницы.
Логика данного бота схожа с предыдущим, изначально мы запускаем основную клавиатуру командой /start . Далее бот даёт нам на выбор список из 6 хабов, мы выбираем интересующий нас хаб, и получаем 5 самых свежих публикаций из выбранного Хаба.
Как вы понимаете, в данном случае нам необходимо получить список статей, и для этого мы будем использовать специальный пакет habR , который позволяет запрашивать из хабры статьи и некоторую статистику по ним в R.
Установить пакет habR можно только из github, для чего вам понадобится дополнительный пакет devtools . Для установки воспользуйтесь приведённым ниже кодом.
Теперь рассмотрим код построения описанного выше бота:
Код бот который выводит список наиболее свежих статей по выбранному Хабу
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.
В итоге мы получим вот такой результат:
Список доступных для выбора Хабов мы вбили хардкодом, в методе habs :
Список статей из указанного Хаба мы получаем командой habr_hub_posts() , из пакета habR . При этом указываем, что нам не требуется список статей за всё время, а только первая страница на которой располагаются 20 статей. Из полученной таблицы с помощью команды head() оставляем только 5 самых верхних, которые и являются самыми свежими статьями.
Логика очень схожа с предыдущим ботом, но в данном случае Inline клавиатуру со списком статей мы генерируем динамически с помощью функции lapply() .
В текст кнопки мы подставляем название статьи posts$title[x] , а в аргумент url ссылку на статью: url = posts$link[x] .
Далее, создаём фильтр, обработчики и запускаем нашего бота.
3.4 Заключение
Теперь написанные вами боты будут значительно удобней в работе, за счёт того, что управление ими будет осуществляться с клавиатуры, а не вводом команд. Как минимум при взаимодействии с ботом через смартфон клавиатура ощутимо упростит процесс его использования.
В следующей главе мы разберёмся как строить логический диалог с ботом, и работать с базами данных.
3.5 Тесты и задания
3.5.1 Тесты
Для закрепления материла рекомендую вам пройти тест доступный по ссылке.
3.5.2 Задания
- Создайте бота, который будет поддерживать Reply клавиатуру. На Reply клавиатуре будет всего одна кнопка “Время.” По нажатию на неё будет появляться Inline клавиатура с выбором из 6 часовых поясов.
- Africa/Cairo
- America/Chicago
- Europe/Moscow
- Asia/Bangkok
- Europe/Kiev
- Australia/Sydney
Кнопки Inline клавиатуры необходимо расположить по 2 в ряд, соответвенно в три ряда.
Где это континент, например Europe, а это город, например Kiev. Дату и время надо брать в ответе из компонента datetime .
Сегодняшняя статья будет посвящена тому, каким образом можно создать для бота пользовательскую клавиатуру, что это даёт и как со всем этим работать. Все приводимые в статье примеры кода будут на php.
Пользовательские клавиатуры в Telegram бывают двух видов: Inline и Reply.
Описывающие клавиатуры объекты представляют собой многомерные массивы, содержащие наборы записей о каждой из кнопок (подпись, данные колбэка, открываемый при нажатии url и так далее).
Таким образом, для генерирования клавиатуры нам нужно сформировать в коде соответствующего типа объект, описывающий создаваемую клавиатуру (назовём этот объект, например, $keyboard), закодировать этот объект в виде json-строки и добавить эту json-строку в качестве параметра reply_markup при отправке запроса (GET или POST) telegram-боту.
// создаём $keyboard - объект, описывающий клавиатуру
$keyboard = [
"inline_keyboard" =>
[ /* первый ряд кнопок - массив из наборов */
[ /* первые две кнопки вызывают колбэк, а третья - открытие url-а */
[ "text" => "button 1",
"callback_data" => "data 1"
],
[ "text" => "button 2",
"callback_data" => "data 2"
],
[ "text" => "button 3",
"url" => $any_url
]
]
/* здесь мог бы быть второй массив для второго ряда кнопок и так далее */
]
];
.
.
// далее нужно просто добавить этот параметр в запрос (GET или POST) в качестве параметра reply_markup
// например, при использовании в GET-запросе:
$keyboard_json = json_encode($keyboard); // перекодируем в json
// формируем url для get-запроса и добавляем к этому url-у параметр reply_markup с описанием нашей клавиатуры
$url=$telegram_api_url.$bot_token.'/sendMessage?chat_id='.$chat_id.'&text='.urlencode($text_message).'&parse_mode=HTML'.'&reply_markup='.$keyboard_json;
// осталось только выполнить GET-запрос, например с помощью file_get_contents (ну или curl :))
file_get_contents($url); // отправляем get-запрос на сформированный url
Для удаления reply-клавиатуры нужно в параметре reply_markup послать объект, типа ReplyKeyboardRemove.
// создаём $remove_keyboard - объект, описывающий удаление reply-клавиатуры
$remove_keyboard = [
"remove_keyboard" => true
];
.
.
// далее нужно просто добавить этот объект в запрос (GET или POST) в качестве параметра reply_markup
// например, при использовании в GET-запросе:
$remove_keyboard_json = json_encode($remove_keyboard); // перекодируем в json
// формируем url для get-запроса и добавляем к этому url-у параметр reply_markup с описывающим удаление клавиатуры объектом
$url=$telegram_api_url.$bot_token.'/sendMessage?chat_id='.$chat_id.'&text='.urlencode($text_message).'&parse_mode=HTML'.'&reply_markup='.$remove_keyboard_json;
// осталось только выполнить GET-запрос, например с помощью file_get_contents (ну или curl :))
file_get_contents($url); // отправляем get-запрос на сформированный url
" [
"update_id":xxxxxxxxxx,
"callback_query":
"id":"xxxxxxxxxxx",
"from":
"id":xxxxxxxxx,
"first_name":"xxxxxxx",
"last_name":"xxxxxxx",
"username":"xxxxxxxxx",
"language_code":"ru"
>,
"message":
"message_id":xxxx,
"from":
"id":xxxxxxxxx,
"first_name":"xxxxxxxx",
"username":"xxxxxxx"
>,
"chat":
"id":xxxxxxxx,
"first_name":"xxxxxxx",
"last_name":"xxxxxxxx",
"username":"xxxxxxx",
"type":"private"
>,
"date":1499854111,
"text":"test"
>,
"chat_instance":"xxxxxxxxxxxx",
"data":"1"
>
>
]
>"
Вот и всё. Как видите, всё достаточно просто и понятно. В telegram вообще всегда всё просто, понятно и подробно описано. Вообще не понимаю, зачем нужны всякие библиотеки и фреймворки. Все они выглядят гораздо страшнее и монструознее, чем исходные описания из API. Это при том, что все эти фреймворки добавляют коду веса, ошибок и нестабильности. Уф, надо вступить в какое-нибудь движение за чистоту кода. Ну ладно, это я уже отвлёкся. Пока!
Читайте также: