PHP Telegram bot + Laravel разработка с нуля `Урок – 5`
Статья на ЯндексДзен, подписывайтесь!
В этом уроке создадим нового бота в телеграм, посмотрим что можно в нем настроить, получимм токен для управления ботом, получим вебхук из телеграма в Ngrok и попробуем отправить сообщение от бота в наш телеграм.
Создание бота через BotFather
Новые боты в телеграме создаются через еще одного, официального бота – @botfather, вы можете найти его в поиске или пройти по прямой ссылке.
При отправке ему команды /start, бот возвращает нам все достпные команды с описанием.
Нас интересует создание нового бота, а именно команда /newbot
Бот просит нас придумать имя, оно может содержать любые символы, пусть будет My awesome bot🔥
Теперь нужно придумать ему username, он должен быть уникальным, а так же обязательно заканчиваться на Bot или _bot, пусть будет YandexDzenLessons_bot
В ответ мы получаем ссылку на нашего бота, секретный токен и ссылку на документацию API
Перейдя в нашего бота мы увидим придуманное раньше название и username, по которому бота можно легко найти
Вернемся пока к BotFather и попробуем поменять нашего бота. Если отправить команду /mybots, мы увидим список наших ботов, давайте зайдем в только что созданного бота
Зайдя в бота можно увидеть меню управления ботом:
- Посмотреть токен этого бота
- Редактировать бота
- Настройки бота
- Настройки принятия платежей через бота
- Передача бота другому пользователю
- Удаление бота
- Вернуться к списку всех ботов
Нас интересует 2 пункт, Edit Bot, зайдя в него можно увидеть следующие настройки:
- Изменить имя бота
- Изменить информацию о боте, которое отображается при открытии профиля бота
- Изменить описание, которое отображается когда пользователь впервые заходит в бота, на месте чата
- Изменить изображение, которое отображается когда пользователь впервые заходит в бота, на месте чата
- Изменить аватарку бота
- Изменить команды бота
- Вернуться в предыдущее меню
Имя бота менять не вижу смысла, поэтому изменить информацию о боте Edit About, бот попросит прислать текст, я отправлю ‘Бот, созданный в рамках серии уроков на ЯндексДзен💣💣’
Теперь если попробуем зайти в профиль нашего бота, увидим добавленную информацию о нём.
Теперь попробуем добавить изображение, вернемся назад к боту Back to Bot, зайдем обратно в редактирование бота Edit Bot и нажмем на Edit Botpic. Теперь нас попросят прислать изображение, у меня уже есть сгенерированный ИИ логотип, его и отправим
Теперь бот не выглядит так уныло👏👏
Давайте по аналогии отправим ему Изображение описания Edit Description Picture и сам текст описания Edit Description
Теперь посмотрим как выглядит чат бота, при первом заходе на него
Если сейчас запустить бота, ожидаемо ничего не произойдет, мы настрим это позже.
Сейчас можем опять вернуться к BotFather и разобрать пункт с редактированием команд.
Они позволяют добавить то самое синее меню слева в чате, давайте создадим новую команду.
Заходим в Edit Bot, затем в Edit commands, нас попросят отправить команду и описание в формате command – description, я добавлю команду перезапуска бота:
start – Перезапустить бота
Теперь если вернемся к нашему боту, увидим что у него появилось меню, с той самой добавленной командой и её описанием.
Настройка Laravel для принятия хуков от Telegram bot
У нас уже есть адрес от Ngrok, куда мы можем отправлять хуки, но телеграм будет спамить пока не получит ответ, что хук был доставлен, за это отвечает код 200, он говорит что все ОК.
Поэтому нужно создать новый Route /webhook, почитать можно в официальной документации, он будет просто возвращать ответ 200 при обращении на него методом POST.
В конце статьи будет ссылка на коммит с этого урока, где можно будет посмотреть все правки, которые были внесены в рамках него)
Так же по умолчанию в Laravel POST методы требуют верификацию по CSRF токену, но т.к. мы не можем указать боту дополнительный параметр в виде токена, который он нам присылал бы вместе в хуком, мы можем его просто исключить в VerifyCsrfToken.php. Ссылка на документацию
Теперь мы можем попробовать зайти на наш сайт на новый роут через локальный домен, у меня это http://my-telegram-bot.loc/webhook
Или через домен, выданный Ngrok, не забудье дописать в url /webhook
Мы увидим ошибку, что данный роут принимает только метод POST, все правильно, ведь при заходе на сайт браузер делает GET запрос, а вебхук будет приходить методом POST, главное мы убедились что роут работает и можно двигаться дальше.
Настройка Ngrok
Сейчас у вас уже должен быть запущен локальный сервер, у нас это OpenServer и запущен Ngrok, настраивали мы его в предыдущем уроке.
Как вы помните что бы получить вебхук от телеграма нам нужен какой то адрес, домен с установленным SSL сертификатом для работы https соединения, у нас все это уже есть.
——ОБРАТИТЕ ВНИМАНИЕ——
Ссылка Ngrok выдается разово, каждый раз после запуска программы и ввода команды ngrok http 80 вы будете получать новую ссылку, поэтому после закрытия, перезапуска ngrok, бот работать перестанет.
В конце мы разместим бота на хостинг, где он будет работать 24/7👌
Осталось указать боту, куда он будет присылать хуки, это можно сделать просто пройдя по специальной ссылке:
https://api.telegram.org/bot%7BTOKEN%7D/setWebhook?url={DOMAIN}/webhook
В ней нужно заменить {TOKEN} на токен вышего бота, который выдал BotFather, а вместо {DOMAIN} указать адрес, который вам выдал Ngrok, должно получиться примерно так:
https://api.telegram.org/bot6336621474:ABG7nuq9y8KQV3XlvDE_slLAQnII34sKzpY/setWebhook?url=https://8a8e-46-138-76-71.eu.ngrok.io/webhook
Перейдя по этой ссылке, мы должен получить ответ, что адрес для вебхуков установлен:
Теперь можно перейти в Ngrok Inspect и попробовать отправить нашему боту команду /start
Бот по прежнему ничего не ответит, т.к. мы еще не научились обрабатывать вебхуки
Однако в инспекторе мы можем увидить вебхук, который пришел к нам из телеграма. В нем мы есть множество полезной информации:
- Id чата, откуда пришел вебхук
- Информацию о пользователе
- Текст, который он нам отправил
Отправка первого сообщения через телеграм бота
Теперь у нас есть id чата, в который мы можем отправить какое-нибудь сообщение.
Давайте создадим еще один Route, который будет принимать метод GET, назовем его /send и поместим небольшой код внутрь функции
В переменную $token – запишем токен нашего бота, в $chatId – полученный в вебхуке id чата, а в $text любое сообщение.
После чего попробуем зайти на наше сайт, уже по адресу /send, у меня это http://my-telegram-bot.loc/send
Нам отобразится ответ ОК, а в чат от бота должно прийти сообщение
Отлично, значит все работает!🥳🥳
Конечно таким способом создавать бота мы не будем😁
Все это можно было сделать за пару минут, создав файлик index.php и поместив в него код отправки сообщения)
Но мы подготовили базу, с которой будем работать дальше!