Владимир Фетисов

Прототипирование

Адаптивная вёрстка

Программирование

SEO продвижение

Реклама, таргет

UX/UI интерфейсы


СКРЫТЬ

ПОКАЗАТЬ
Владимир Фетисов

Прототипирование

Адаптивная вёрстка

Программирование

SEO продвижение

Реклама, таргет

UX/UI интерфейсы

Блог

PHP Telegram bot + Laravel разработка с нуля `Урок – 7`

PHP Telegram bot + Laravel разработка с нуля `Урок – 7`

Статья на ЯндексДзен, подписывайтесь!

Настройка пакета irazasyed/telegram-bot-sdk, создание первой команды StartCommand телеграм бота, доработка WebhookController, отладка работы новой команды.

Настройка

Чтобы настроить установленный ранее пакет для работы с api telegram, достаточно обратиться к уже знакомому Artisan и выполнить команду:

php artisan vendor:publish –provider=”Telegram\Bot\Laravel\TelegramServiceProvider”

Создание файла настроек пакета irazasyed/telegram-bot-sdk
Создание файла настроек пакета irazasyed/telegram-bot-sdk

Мы увидим созданный в папке config файл telegram.php

Созданный файл config.php
Созданный файл config.php

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

  1. Название бота, оно не обязательно должно совпадать с названием вашего бота в телеграме, это локальная переменная, на случай если вы используйте несколько ботов например, можно оставлять без измненеий или переименовать по своему усмотрению
  2. Токен вашего телеграм бота, не стоит задавать его прям сдесь, это нужно вынести в env файл, об этом чуть ниже.
  3. Список команд, которые относятся именно к этому боту, если не указать, работать они не будут, разберемся ниже, при создании первой команды.
  4. Бот по умолчанию, если переименуете своего бота, укажите новое имя и тут, этот параметр отвечает за то, какой бот будет вызван без явной передачи названия бота.

Список параметров, на которые стоит обратить внимание
Список параметров, на которые стоит обратить внимание

Выносим токен в env файл

По умолчанию в проекте у вас должно быть 2 файла .env и .env.example
В них хранятся основные конфигурации вашего проекта, при этом нужно обратить внимание, что файл .env по умолчанию внесет в .gitignor, т.е. он не отправлятся вместе с проектом на github, а вот файл .env.example уже отправляется, поэтому записывать токены, пароли и прочие значения в него не стоит.

При добавлении нового параметра в .env, следует добавить его и во второй файл, без самого значений соответственно, это позволит легко настроить проект и не забыть указать все необходимые значения для его работы.

Давайте добавим переменную для токена в телеграме и создадим такую же переменную в .env.example на любой удобной строчке:

TELEGRAM_BOT_TOKEN для .env
TELEGRAM_BOT_TOKEN для .env

TELEGRAM_BOT_TOKEN для .env.example
TELEGRAM_BOT_TOKEN для .env.example

В файле telegram.php вы наверняка заметили еще несколько значений, которые тянутя из env:

  • TELEGRAM_CERTIFICATE_PATH – нас не интересует, т.к. мы работаем через ngrok и на домене уже установлен SSL сертификат.
  • TELEGRAM_WEBHOOK_URL – по большому счету нам тоже не интересен, т.к. он у нас динамический, указывать каждый раз новый еще и тут не имеет никакого смысла, хотя мы можем менять его командой
    php artisan telegram:webhook
    Я лично просто сохранил себе ссылку, меняю в ней url и вставляю в браузер когда нужно, вы можете делать это и командой.

Создание новой команды

Команды я предлагаю хранить в отдельной папке Commands, поэтому создаю её непосредственно внутри папки app

Создание папки для команды
Создание папки для команды

Далее создаем новый PHP Class для нашей команды. Она будет реагировать на команду /start, поэтому так и назовем – StartCommand

Создаем класс для новой команды
Создаем класс для новой команды

Наследоваться она будет от класса Command, который от пакета телеграм, не перепутайте с другими

От какого класса должна наследоваться наша команда
От какого класса должна наследоваться наша команда

Далее PhpStorm сам подсказывает что нехватает какого-то метода, а именно handle(), в него будет прилетать вебхук.

Добавляем метод handle в классе StartCommand
Добавляем метод handle в классе StartCommand

Помимо метода handle(), у команды должно быть еще 2 свойства:

  1. $name – имя команды, должно полностью соответствовать команде, с которой мы хотим взаимодействовать, только без слеша (/)
  2. $description – описание команды, на самом деле необязательное свойство, но telegram-bot-sdk умеет выводить список команд и там рядом с командой будет фигурировать её описание.

Свойства $name и $description у команды
Свойства $name и $description у команды

Не забываем добавить созданную команду в конфиг telegram.php

Добавляем созданную команду в конфиг
Добавляем созданную команду в конфиг

Доработка WebhookController

На данный момент, все входящие реквесты у нас обрабатывает созданный ранее контроллер, но пока он просто возвращает 200 статус.

Доработаем его так, что бы он отправлял вебхук в соответствующую команду, для которой он преднозначался.

Для этого подключим менеджера ботов:

Подключаем BotsManager в WebhookController
Подключаем BotsManager в WebhookController

Теперь настроим отправку вебхука в соответствующую команду.
telegram-bot-sdk сам проверит существует ли такая команда, указана ли она в списке рабочих команд в конфиге и если все ОК– перенаправит её дальше в нужную команду.

Перенаправляем вебхук в соответствующую команду
Перенаправляем вебхук в соответствующую команду

Отладка работы новой команды

Тут уже по отработанной схеме, которую разбирали ранее, вкратце напомню:

  1. Запускаем OpenServer
  2. Запускаем ngrok, получаем новый адрес
  3. Устанавливаем адрес вебхука для нашего телеграм бота
  4. Отправляем боту команду, в нашем случаи /start
  5. Смотрим запрос в инспекторе ngrok
  6. Заходим в postman, создаем новый реквест по адресу для вебхуков с запросом из инспектора

Теперь зайдем в нашу команду и поставим dd($this); чтобы посмотреть что нам туда приходит из WebhookController

dd($this); смотрим что приходит в команду из WebhookController
dd($this); смотрим что приходит в команду из WebhookController

Отправлем запрос в Postman и видим, что команда действительно определилась и вебхук был передан в неё

Убедимся что контроллер отправил вебхук в команду
Убедимся что контроллер отправил вебхук в команду

Давайте что-нибудь отправим в ответ.
Подключенный SDK позволяет нам легко отвечать пользователю, для этого есть несколько методов, также все эти методы можно использовать в любом месте, не только как ответ, заменив replyWith на Send, но нужно будет передать chat_id, куда хотите отправить сообщение)

  1. replyWithMessage($parameters) – ответ текстовым сообщением, соответвтует SendMessage из доки
  2. replyWithPhoto($parameters) – ответ фотографией, соответвтует sendPhoto из доки
  3. replyWithAudio($parameters) – ответ аудио файлом в формате, соответствует .MP3 or .M4A до 50мб, соответствует sendAudio из доки
  4. replyWithVideo($parameters) – ответ видео файлом в формате MPEG4 до 50мб, другие форматы можно отправить документом, соответствует sendVideo из доки
  5. replyWithVoice($parameters) – ответ аудио сообщением, оно должно быть в формате .OGG и закодировано при помощи OPUS, соответствует sendVoice из доки
  6. replyWithDocument($parameters) – ответ документом, файлы любых типов до 50мб, соответствует sendDocument из доки
  7. replyWithSticker($parameters) – ответ стикером, статичным в формате .WEBP, анимированным .TGS или видео .WEBM, соответствует sendSticker из доки
  8. replyWithLocation($parameters) – ответ точкой на карте, соответствует sendLocation из доки
  9. replyWithChatAction($parameters) – ответ временным уведомлением, что бы не отправлять сообщение, соответвтует sendChatAction из доки

Отправлять будем в ответ обычное текстовое сообщение, но поиграемся с его форматированием. pase_mode принимает несколько вариантов форматирования, описаны они в оф. доке, мы остановимся на привычном HTML

Отправим в ответ пример из доки, что бы наглядно все рассмотреть)

Код ответа на команду /start с режимом парсинга HTML
Код ответа на команду /start с режимом парсинга HTML

Ну и в ответ получим такой текст:

Ответ на команду /start
Ответ на команду /start

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

Ссылка на commit из 7 урока

Полезные ссылки

Taggs:
Написать комментарий