После того как мы поняли принципы отправки запросов к API, нам нужно понять как получать актуальную информацию. К примеру, если нашему боту кто нибудь напишет. Есть два способа что бы получить данные: метод getUpdates и webhook.
Получение данных через метод getUpdates
Для начала зайдем в бота и напишем ему "привет бот". Конечно он никак не отреагирует, но эту информацию сохранит.
Что бы получить актуальные данные из бота, можно воспользоваться методом getUpdates. Для этого создаем запрос с этим методом.
https://api.telegram.org/bot<ваш-токен>/getUpdates
Если массив ok == true, то в result можно будет найти обновления от бота. Мы получили массив объектов "Update" (Все возможные поля этого объекта вы можете найти в разделе "Типы данных - Обновления"). Пропустим обновление под номером "0", потому что там информация о запуске бота. А под номером "1" будет информация о сообщении "привет бот". Мы видим два параметра update_id и message (Какие они бывают смотрите в разделе "Типы данных - Сообщение"). Первый это идентификатор обновления, а второй это информация о сообщении что мы написали боту. В message мы видим данные. Быстро пробежимся по ним: message_id - идентификатор внутри конкретного диалога, from - информация о том кто пишет сообщение (в данном случае будет о вас), chat - идентификатор беседы (получается это частный разговор между ботом и вами, поэтому совпадает id), date - время в формате UNIX и text - текст сообщения что мы отправили боту.
Важно уточнить несколько моментов: данные приходят в формате JSON, обновления хранятся 24 часа и метод не работает если вы установили webhook (как его установить ниже).
При запросе getUpdates можно указать параметры.
- offset - тут надо указать номер первого обновления, которое хотите получить. Он должен быть на единицу больше, чем самое большое из номеров предыдущих обновлений, что вы уже получили. По умолчанию возвращаются обновления, начиная с самого раннего неподтвержденного обновления. Обновление считается подтвержденным, как только вызывается getUpdates с номером, большим, чем его update_id. Можно указать отрицательное смещение, чтобы получить обновления, начиная с отрицательно указанного offset обновления с конца очереди обновлений. Все предыдущие обновления будут как бы забыты.
- limit - сколько обновлений получить. от 1 до 100 можно указать.
- timeout - Тайм-аут в секундах, по умолчанию 0.
- allowed_updates - можно указать в массиве какие данные нужно получать.
По моему мнению, метод getUpdates нужен скорей для каких то узкоспециализированных задач и лучше использовать webhook, ведь он гораздо удобней.
Получение данных с помощью webhook
Получение данных с помощью webhook гораздо удобней, ведь вам не нужно каждый раз делать запрос к API telegram. Оно само отправит данные вам на сервер, как только бот получит какие то данные.
Что бы данные отправлялись к нам на хостинг, нужно установить webhook для бота. Сделать это можно с помощью метода setWebhook и указать параметр url. Создаем файл "webhook.php" и расположим его в корне нашего сайта что бы он был доступен по адресу "https://botphp.ru/webhook.php". У нас получается запрос:
https://api.telegram.org/bot<ваш-токен>/setWebhook?url=https://botphp.ru/webhook.php
Открываем его в браузере и видим: 'ok' - true, 'description' - "Webhook was set". Это значит что мы установили webhook и метод getUpdates не будет работать и выдаст ошибку с кодом 409.
Дополнение
В уроке "хостинг и домен", я писал что домен нужен обязательно с SSL сертификатом, потому что webhook не будет работать без него. Все подробности можете найти в официальном гайде по webhook. А еще вы можете настроить и обезопасить webhook с помощью дополнительных параметров. Об этом можете посмотреть в официальной документации (анг. яз.).
Теперь API будет отправлять данные нам на хостинг. Нужно начать их как то обрабатывать. Поступать данные будут в поток "php://input", подробней можете почитать тут. Для начала просто сохраним в файл для наглядности.
Алгоритм следующий: получаем данные функцией "file_get_contents", потом декодируем JSON функцией "json_decode" в массив и сохраняем в файл необработанные данные. Посмотрим код:
<?php
//получаем данные
$data = file_get_contents('php://input');
//преобразуем JSON в массив. Если указать вторым параметром true, то вернет массив
$array = json_decode($data,true);
//преобразуем массив в текст. Если вторым параметром передать true, то функция print_r не выводит информацию, а возвращает в виде данных string
$result_string = print_r($array, true);
//сохраняем данные в файл что бы прочитать потом. Третьим параметром передаем флаг FILE_APPEND, что бы если файл уже существует то просто добавим данные к существующим.
file_put_contents(__DIR__.'/result.txt', $result_string, FILE_APPEND);
Загружаем файл на свой хостинг webhook.php. Теперь нам нужно отправить еще одно сообщение боту. Я написал боту: "Ты даже не человек, ты бот". Если мы не ошиблись то должен появиться файл result.txt. У меня он появился по адресу https://botphp.ru/result.txt.
Warning
Если у вас не появился файл result.txt, возможно не настроены права доступа для папок. Самое просто решение это самостоятельно создать файл result.txt в корне сайта и выставить CHMOD права на запись. Если не знаете что это, то вот хорошая инструкция.
Давайте посмотрим содержимое файла:
Array
(
[update_id] => 99601460
[message] => Array
(
[message_id] => 10
[from] => Array
(
[id] => 813964045
[is_bot] =>
[first_name] => Semen
[username] => semen921
[language_code] => ru
)
[chat] => Array
(
[id] => 813964045
[first_name] => Semen
[username] => semen921
[type] => private
)
[date] => 1699448133
[text] => Ты даже не человек, ты бот
)
)
Мы получили такие же данные как если бы получали бы их через метод getUpdates. Отлично, теперь можно попробовать создать простого бота.
Опубликовано: 8 ноября 2023
Последнее обновление: 16 ноября 2023
Автор: Семен