Как сделать своего бота в Телеграмме на php

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

В качестве языка программирования я выбрал PHP, да, на PHP можно писать ботов также как и на любом другом серверном языке.

Чтобы не писать с нуля большинство кода, я нашел классную SDK для Telegram на PHP, подробнее о библиотеке в блоге Нетологии на Хабре.

По у молчанию библиотека устанавливается через Composer и ориентирована под Laravel, но можно скачать версию без Composer отсюда

Библиотека легко интегрируется в ваш сайт, после чего можно приступать к разработке самого бота.

Я его сделал за два дня, поскольку данные уже были в базе данных и мне оставалось только написать небольшое приложение, которое бы выводило эти данные по запросу пользователя.

Вот что получилось

Как создать телеграм бота на PHP за 10 минут

Источник: luckyseo.ru

[Гайд #2] PHP: Создаем простого бота Telegram

Всем привет, с вами Картон. Это постоянная рубрика туториалов и гайдов по разработке.

Сегодня я расскажу вам как создать Telegram бота на PHP используя WebHook.

Что нам понадобиться:

1) Заказ домена и Веб-Хостинга

В первую очередь нам необходимо определиться с доменом и проверить его доступность, я буду использовать бесплатный домен от Freenom.com

Заказ Домена

Заходим на сайт и создаем аккаунт, после чего переходим в раздел регистрации домена:

Мы попадаем в раздел регистрации, после чего нам нужно ввести желаемое доменное имя в строку, например пусть будет «kartonbot», далее нажимаем «Check Availability»:

Далее мы попадаем на страницу с предлагаемыми доменами, выбираем подходящий, пусть это будет «kartonbot.tk», нажимаем «Get in now!», после чего оставляем данную вкладку открытой и переходим к заказу веб-хостинга:

Заказ Веб-Хостинга

Я буду использовать wishhost.net (но вы при желании можете использовать другой).

Заходим на сайт и регистрируем аккаунт, после чего попадаем на главную страницу, выбираем услугу, я буду использовать SSD хостинг на панели ISPManager, но вы можете использовать Бюджетный либо с другой панелью:

Как написать Telegram бота c нуля — web программирование для начинающих на php

Далее нам нужно выбрать тариф, здесь уже зависит от ваших нужд, если вы хотите держать простого бота вам вполне хватит Эконом тарифа:

Далее мы попадаем на страницу добавления домена, здесь мы должны выбрать третий пункт и ввести домен который мы выбрали при регистрации:

При желании выбираем желаемый период оплаты и доп. параметры, после чего жмем «Далее» и на следующей странице «Оформить»:

Далее оплачиваем заказ и получаем подтверждение и переходим в личный кабинет:

Нажимаем на услуги и выбираем ваш заказ (у вас он будет один):

Далее переходим в панель управления:

Нажимаем «WWW Домены»:

Копируем IP адрес указанный возле домена:

Возвращаемся к открытой вкладке Freenom и нажимаем «Checkout»:

Выбираем 12 месяцев и жмем на «Use DNS» и вставляем IP, далее жмем Продолжить:

Заполняем данные, ставим галочку и подтверждаем, далее получаем подтверждение:

Переходим по нашему домену и видим подобную страницу:

(Если страница недоступна подождите минут 10 и попробуйте еще раз)

2) Заказываем SSL сертификат

Я буду использовать бесплатный сертификат на 3 месяца, после окончания его можно будет перевыпустить. Переходим на ssl.com и создаем аккаунт.

Переходим на https://www.ssl.com/certificates/free/ и жмем Заказать:

Переходим в Заказы и нажимам на «submit csr»:

Возвращаемся в ISPManager и переходим в SSL сертификаты и жмем на CSR запросы:

Если вы используете другую панель используйте csrgenerator.com

Еще по теме:  Как прятать ссылки в Телеграмме

Жмем создать и заполняем указав свой домен:

Заходим в Информацию:

Копируем данное поле:

Возвращаемся на ssl.com и вставляем скопированный текст:

Заполняем обязательные поля:

В ISPManager заходим в почтовые домены и жмем Изменить:

Ставим перенаправление и указываем свой E-Mail:

Возвращаемся на ssl.com, выбираем указанный пункт и жмем на Кнопку:

Вам на почту придет такое письмо, копируем код и переходим по ссылке:

Вводим код и подтверждаем:

Попадаем на страницу и жмем на ID сертификата:

Скачиваем архив с сертификатами:

Открываем архив и открываем 2 файла текстовым редактором:

Теперь переходим в ISPManager в SSL сертификаты, CSR запросы, выбираем домен и жмем Подтвердить:

Вставляем содержимое файлов из текстового редактора как указано стрелочками и жмем ОК:

Переходим в WWW Домены, выбираем домен и жмем Изменить:

Ставим данные 2 галочки и жмем ОК:

Переходим по нашему домену (в моем случае это kartonbot.tk) и проверяем есть ли замок в адресной строке:

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

3) Создаем бота Telegram

Пишем команду /newbot и задаем имя боту, пусть будет Картон бот:

Далее мы должны задать имя пользователя боту на английском, оно должно заканчиваться на bot или _bot :

Далее мы получаем токен, сохраняем его:

Устанавливаем WebHook

Теперь нам нужно перейти по ссылке подставив свои данные:

https://api.telegram.org/botТОКЕН/setWebhook?url=https://ДОМЕН/bot.php

В моем случае это будет выглядеть так:

https://api.telegram.org/bot717986509:AAGTFRC62i4iRlgVWH3szOvKwtooYGbXXXX/setWebhook?url=https://kartonbot.tk/bot.php

Если вы получили подобный ответ идем дальше:

(Если нет то проверяем еще раз предыдущие шаги)

4) Переходим к коду бота

Переходим в Файл Менеджер в ISPManager, Заходим в папку www и далее в папку домена:

Создаем файл bot.php:

Заходим в редактирование:

Рассмотрим код:

die(‘IP Address not allowed.’);

die(‘Request method not allowed.’);

$token = ‘717986509:AAGTFRC62i4iRlgVWH3szOvKwtooYGbXXXX’; //Здесь необходимо вставить токен вашего бота

$rcv = file_get_contents(‘php://input’); //Получаем запрос от бота

$m = json_decode($rcv, true); //Декодируем json

//Обработка входящих сообщений

sendmsg($m, ‘Вы написали команду /start’);

default: sendmsg($m, ‘Данной команды не существует!’);

//Функция отправки сообщения

function sendmsg($m, $msg)

Простой Telegram бот, который задаёт 1 вопрос

gimp творчество

Основная идея бота — это противодействие спам — регистрациям в группе Telegram.

Ниже расскажу о процессе создания Telegram бота который выполняет простую функцию — задаёт новому пользователю группы вопрос и предоставляет возможностью выбрать ответ на него.

Для всех желающих увидеть код сразу и целиком — добро пожаловать в конец статьи ( там есть ссылки)

Инструменты

Всё началось с того что одна из моих групп доросла до некоторого количество пользователей и стала интересна для различных спам сервисов. Удаление спам сообщений не составляет труда, но постоянно мониторить группы на предмет таких сообщений не самый лучший способ провести время. При этом давно хотел попробовать указанные выше инструменты для реализации хоть сколько полезного бота Telegram.

Идея с тем что бы задавать вопрос пользователю при помощи бота, далеко не новая и успешно была реализована в таких сервисах — ботах как Combot, Terminator (не помню точное название, там ещё мужик похожий на Арнольда в куртке был на логотипе) и другие.

Как это должно работать в теории

  1. Пользователь (человек, авто-спам, злой бот) вступает в сообщество
  2. Бот (добрый бот) — администратор сообщества реагирует на каждое новое вступление и задаёт простой вопрос. (Кто ты?). При этом есть только два варианта ответов — «Я человек» и «Я робот». Так же бот забирает все права и разрешения у пользователя в этой группе.
  3. По сути можно оставить только одну кнопку — «Я человек» и предположить, то что ответить, не ткнув на кнопку пальцем не представляется возможным.
  4. После нажатия на кнопку с ответом, backend этого бота обрабатывает ответ и принимает дальнейшее решение.
  5. Если ответ принадлежит пользователю вступившему в группу — и ответ «Я человек», пользователю возвращаются права и разрешения в группе в которую он вступил.
  6. Бот что-нибудь пишет, например, «добро пожаловать»
Еще по теме:  Как создать список в Телеграмме

Для понимания того что происходит в группе необходимо обрабатывать json-ы которые сервис Telegram будет присылать на URL адрес (webhook) закреплённый за созданным вами ботом.

Достаточно вольное изображение схемы

Наш backend обрабатывает все сообщения приходящие от сервиса Telegram, и по мере необходимости наступления некоторых событий формирует запросы к сервису Telegram. В свою очередь последний — через вашего бота доводит эти команды до группы (где вы можете видеть результат).

Для реализации взаимодействия с сервисом Telegram есть несколько API библиотек на языке PHP

  1. danog/MadelineProto — Мощная, гибкая, с асинхронными «фичами».
  2. php-telegram-bot/core — Выбрал её, так как захотелось попробовать что то новое. Как оказалась она достаточно простая для понимания, достаточно пробежаться по ней xdebug-ом

Немного о php-telegram-bot/core

Вся «сила» библиотеки крутится возле одного крупного класса class LongmanTelegramBotTelegram. При этом есть возможность создавать отдельные обработчики поступающих json-ов через создание файлов-классов команд.

При инициализации объекта класса LongmanTelegramBotTelegram необходимо указать путь к папке с вашими обработчиками команд, что бы затем в этих обработчиках описать всю необходимую логику реагирования на события происходящие в вашей группе (события обновления группы).

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

Немного кода — реализации

Код сильно упрощён (В конце будут ссылки на репозитарий с модулем и отдельно приложением Laminas)

Пример обработчика поступающих команд

getMessage(); // Здесь какие либо действия или обработки return Request::emptyResponse(); > >

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

Так образом, мы можем получить уведомление о новом событие в группе. В данном случае нас интересует событие связанное с вступлением в группу нового пользователя.

Теперь необходимо сформировать сообщение которое будет иметь вопрос и две кнопки с ответом.

Ниже код, формирующий две кнопки. Поле callback_data — содержит значение ответа. В нашем случае это некоторая строка к которой добавлен (методом конкатенации) id вступившего в группу пользователя. Значение id пользователя добавляется в объект при его создании в вызывающем коде.

InlineKeyboard] */ public function getQuestion() < $keyboard = new InlineKeyboard([ [‘text’ =>’Я бот!’, ‘callback_data’ => QuestionKeyboardMap::CALLBACK_ANSWER_BOT.$this->curentUserId], [‘text’ => ‘Я человек!’, ‘callback_data’ => QuestionKeyboardMap::CALLBACK_ANSWER_HUMAN.$this->curentUserId], ]); return [‘reply_markup’ => $keyboard]; > public function setCurentUserId(string $curentUserId) < $this->curentUserId = $curentUserId; return $this; > >

Пример обработки события о вступлении нового пользователя в группу. В данном случае используется триггер события framework-а Laminas, что бы выполнить всю логику обработки этого кода в другой части модуля.

Подписываемся на событие при инициализации модуля и обрабатываем его в методе processRequestToJoinGroup класса Events

getApplication()->getServiceManager()->get(Events::class); $eventManager = $e->getApplication()->getServiceManager()->get(EventManager::class); $eventManager->attach(EventsMap::NEW_USER_SENT_REQUEST_TO_JOIN_GROUP,[$eventsService,’processRequestToJoinGroup’]); > >

Теперь необходимо отправить приветственное сообщение новому пользователю и добавить к сообщению наши кнопки с ответами. А так же лишить пользователя всех прав в группе до того момента пока он не предоставит ответ на вопрос.

Еще по теме:  Как отключить сири в Телеграмме

Дальше, нужно обработать ответ от пользователя, снять ограничения и написать ему что нибудь в ответ, например «Добро пожаловать»

Опять большой код

Это метод так же вызывается как триггер на событие созданное при инициализации модуля Laminas. (В рамках статьи этот код здесь не указан)

Так же в этом методе есть триггер успешного прохождения проверки пользователя (здесь пример реализации не приводится) — его можно использовать для записи каких-либо данных о пользователе в базу данных.

Как это работает на самом деле, и какие есть оправданные сомнения

  • «Хороший» пользователь вступает в группу, получает вопрос и отвечает «Я человек». У него есть все возможности для общения в группе и за ним больше ни кто не наблюдает и его действия ни как не обрабатываются. Хотя при желании можно и дальше отслеживать, сервис Telegram будет отправлять изменения в группе на webhook.
  • «Плохой бот» вступает в группу (именно бот в понятии Telegram), эта «единица» пользователей отмечены специальным полем. Такие по задумке блокируются на «подлёте» без дополнительных вопросов.
  • «Плохой» пользователь (чаще всего автоматизированный) — вступает в группу и кидает сообщение с здоровенной картинкой (сейчас модно почему то про Биткоин спамить таким способом). Вот тут возникает предположение, что наш «добрый» бот не успеет сделать всё как надо, потому — что ему потребуется время на отправку команды для лишения пользователя всех прав в группе и отправка команды с приветствием и вопросом. (два запроса, в обоих случаях это вызов LongmanTelegramBotRequest). И с большей долей вероятности «Плохой» пользователь сможет выполнить свой корыстный спам-запрос и нагадить в нашу группу между Request.
  • Если групп очень крупная, популярная, тогда есть вероятность что сообщения по линии webhook от сервиса Telegram на наш backend встанут в очередь и часть пользователей не сможет дать ответ на вопрос (тупо запрос повиснет в воздухе) или по достижению 100-а запросов в единицу времени, 101-й будет проходить мимо «доброго» бота. От части можно снизить очередь сообщений об обновлениях в группе, указав при создании webhook-а какие обновления от сервиса Телеграм отправлять (через параметр allowed_updates)

Какие ещё были мысли перед реализацией и что остаётся за рамками сейчас

Для проверки отправителя ответа нужно записывать информацию в базу данных. Т.е с начало сохранить данные о попытке вступления, потом сверить эти данные с теми что придут после ответа на вопрос (если они придут).

Показалось что это слишком сложно, и как указал выше, можно просто «приплюсовать» конкатенировать id пользователя к значению ответа перед формированием кнопок с ответами. Потом сопоставить ответ с тем значением от кого пришёл ответ.

Пример Json от сервиса Telegram c полем конкатенации строки и ИД пользователя

Удалять все сервисные сообщения от бота. Группа может быть просто завален вопросами от бота без ответа. Так как при нормальной логике (после верного ответа), вопрос удаляется. Для очистки нужно подключать cron, а так же вести лог с номерами сервисных сообщений в базе данных.

Что делать если бот не доступен, тогда новые пользователи в чат не попадут без ручного модерирования.

Пользователя после ответа на вопрос можно наделить «избыточными» разрешениями. Но как оказалось во время исследования, наделить пользователя полномочиями выше тех что установлены на группу глобально — не получится.

Это не будет работать. Да, действительно, решение достаточно спорное и пока оно тестируется в весьма «тепличных» условиях.

Перед вступлениемПользователь собрался вступить в группуПользователь ответил - Я человек

Ссылки

  • Библиотека для запросов а API Telegram php-telegram-bot/core здесь
  • Весь код модуля бота для Laminas здесь
  • Скелетон приложения Laminas с модулем для развёртывания здесь

P.S.: Весь код в примерах на PHP, выбрать язык не позволил новый редактор, отправил баг в специальный раздел

Источник: temofeev.ru

Рейтинг
( Пока оценок нет )
Загрузка ...