Бот для Telegram php — Как создать бота Telegram на PHP. Часть 2
В прошлой статьей, мы рассмотрели как создать бота в Телеграм. А сейчас разберем как с ним взаимодействовать по API с помощью PHP. Welcome!
Итак, для начала вот официальная документация. Там много разной информации, чтоб не утонуть, а с чего-то быстро начать, мы реализуем простую задачу. Мы реализуем функционал уведомлений для пользователей нашего сайта.
Как это работает
Итак, мы хотим сделать так, чтоб пользователи нашего сайта могли получать некие уведомления от администрации или еще о чем-то к себе в Telegram.
Прежде всего, стоит отметить такой нюанс: ВЫ не можете отправить сообщение никому прежде, чем он САМ вам напишет. Т.е. сначала пользователь первый должен написать что-то вашему боту и только потом, вы сможете отправлять ему сообщения.
Второй нюанс в том, что вам нужно как-то идентифицировать «ху из ху», как говорится. Т.е. когда кто-то пишет нашему боту в телеграме, нам нужно понимать что этот пользователь в Телеграме соответствует такому то пользователю на вашем сайте. Для того, чтобы идентифицировать пользователя, мы создаем для каждого юзера на нашем сайте некий токен, секретное слово, что угодно, что будет знать только он, и просим его отправить это нашему боту. После того, как юзер отправит нам этот «токен», мы сохраним в базе данных соответствие user_id и chat_id. В последующем, когда этот пользователь будет что-то писать нашему боту, мы будем знать, какому пользователю он соответствует на нашем сайте. Надеюсь с этим все понятно. Если нет, читайте дальше — разберетесь.
Взаимодействие с API Telegram
Документация по API Telegram тут.
Когда бот создан, вы получаете токен для авторизации и работы с API. Он выглядит как-то так: 123456:ABC—DEF1234ghIkl—zyx57W2v1u123ew11
Обращение к API происходит путем отправки POST или GET запроса на определенный адрес формата https://api.telegram.org/bot<token>/METHOD_NAME , где token — это ваш токен, а method_name — имя метода, который вы хотите вызвать (© Ваш КЭП). Т.е. запрос выглядит как-то так: https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe
Внимание. Вы можете работать с API только по протоколу HTTPS.
Ответ содержит JSON объект, в котором всегда есть булевый параметр ok . Если "ok«:true , все хорошо, если false — произошла ошибка.
А так же:
- Все запросы чувствительны к регистру.
- Все запросы должны быть в кодировке UTF-8
Получение обновлений
Тут имеется ввиду получение данных о новых сообщениях, которые пришли нашему боту от пользователей. Как я писал в начале, чтобы подписать пользователя на уведомления, мы даем ему токен и просим прислать этот токен нашему боту в телеграм, чтобы определить соответствие пользователя на нашем сайте с пользователем Телеграм. Так вот, нам же нужно как-то «читать» эти сообщения, которые пользователи нам присылают. Для этого есть два способа:
- Метод getUpdates . Вы можете вызвать его просто введя адрес в браузере по примеру как написано ваше. Вам вернется массив объектов Update. Каждый объект в этом массиве — это по сути отдельное обращение/сообщение от кого-то к нашему боту.
- Второй способ — это установить так называемый WebHook с помощью метода setWebHook . В таком случае вы указываете url-адрес на вашем сайте, на который будут отправляться POST запросы каждый раз, когда кто-то пишет вам. Т.е. пользователь пишет сообщение, нажимает кнопку «Отправить» и на указанный вами URL уходит POST-запрос, который в теле содержит тот же JSON-объект Update.
Второй вариант конечно намного удобнее. В первом случае вам нужно обращаться периодически к телеграму и проверять «а не пришло ли что-то». Во-втором случае когда приходит сообщение — вы сразу получаете запрос к себе на сервер. Именно вторым способом мы и будем пользоваться.
Пишем код
И так, что нам нужно. Нам нужно всего две вещи:
- Получать уведомления, когда нашему боту приходит новое сообщение
- Отправлять сообщение определенному пользователю
Создадим класс Telegram . Объявим в нем публичное поле $token . И константу BASE_API_URL , где будет хранится неизменяемая часть адреса API. Во-первых, не нужно будет каждый раз ее писать, во-вторых, если что-то изменится — нужно будет подправить только эту константу.
Так же давайте напишем две вспомогательные функции для отправки запросов:
Полный класс с методами setWebHook() , getUpdates() и sendMessage() .
Использование
Вы извините, но писать как и где вызывать метод sendMessage() в рамках сайта я не буду. У всех все разное, кто-то использует фреймворки, кто-то CMS, кто-то пишет что-то свое. Это просто не имеет смысла. Основная логика, на мой взгляд, предельно простая и понятная даже самому новичку:
- Подключаем класс, устанавливаем WebHook
- Генерим для пользователя уникальный токен. Желательно, чтоб он был короткий и его можно было легко ввести в телефон руками, если нет возможности скопировать в десктопный телеграм.
- Когда к нам на WebHook приходит сообщение, проверяем регуляркой, соответствуем ли оно формату токена. Если да — проверяем токен. Если юзер с таким токеном у нас правда существует, сохраняем за этим юзером данный chat_id. В будущем в этот chat_id мы будет отправлять разные сообщения/уведомления. Если юзер с таким токеном не найден, отправляем в телеграм сообщение данному chat_id «Такой токен не найден». Если же сообщение, которое прислал пользователь вообще не похоже на токен, отправляем ему сообщение «Чтобы мы вас узнали, отправьте токен, который вы можете найти в личном кабинете у нас на сайте таком-то.»
- Когда нужно отправить уведомление о каком-то событии на сайте, просто пишем сообщение в chat_id, который у нас закреплен за пользователем.
P.S. Вообще на гитхабе есть библиотеки для разных языков, в том числе и PHP, для взаимодействия с API телеграма. Есть даже компонент для Yii2, которым я пользуюсь. Думаю и для других фреймворков тоже найдется. Класс выше я написал на коленке исключительно для демонстрации API.
На этом все. Всем спасибо.