Доброго времени суток! В данной статье я покажу Вам как просто можно создать Telegram-бота на PHP.
В качестве площадки для хостинга нашего бота мы будем использовать платформу Heroku, о которой я уже ранее писал статью. В качестве библиотеки для разработки бота возьмем вот эту irazasyed/telegram-bot-sdk. Но кроме нам также понадобится библиотека doctrine/annotations для удобной организации команд на которые будет реагировать бот.
Вот сама ссылка:
Все готово, теперь приступим к написанию кода — вот наш файл composer.json:
«name»: «myrusakov/php-bot-webhook»,
«type»: «project»,
«require»: «irazasyed/telegram-bot-sdk»: «^2.0»,
«doctrine/annotations»: «^1.13»
>,
«autoload»: «psr-4»: «»: «src/»
>
>
>
Файлы с классами будут лежать в папке src. Вот базовая струтура директорий проекта:
Building a Telegram Bot with Node.js in 10 minutes
.
├── vendor
├── src
│ ├── MainCommand.php
│ └── CommandsCollector.php
├── index.php
├── composer.lock
├── composer.json
└── .gitignore
Файл index.php
require __DIR__ . ‘/vendor/autoload.php’;
// в класс передаем наш токен
$bot = new Api(‘%ТОКЕН БОТА%’);
function BotApp(Api $bot, array $commands = [])
// получаем обновленные данные
$result = $bot->getWebhookUpdates();
$text = $result[«message»][«text»]; //Текст сообщения
$chat_id = $result[«message»][«chat»][«id»]; //Идентификатор пользователя
$name = $result[«message»][«from»][«username»]; //Имя пользователя
// если есть текстовая команда
if ($text)
// пробегаемся по массиву команд
foreach ($commands as $commandText => $commandAction)
// смотрим, есть ли введенная текстовая команда в списке доступных
if ($commandText === $text)
// есть такая команда — получаем ее обработчики — название класса и метода
[$class, $method] = $commandAction;
// вызываем обработчик
$obj = new $class();
$obj->$method($bot, $result);
return;
>
>
// если команда не распознана срабатывает обработчик по умолчанию
[$class, $method] = $commands[‘fallback’];
$obj = new $class();
$obj->$method($bot, $result);
>
else
$bot->sendMessage([‘chat_id’ => $chat_id, ‘parse_mode’ => ‘HTML’, ‘text’ => «Привет $name! Я понимаю только текст.»]);
>
>
// массив с классами команд — их может быть столько, сколько необходимо Вам
$actions = [MainCommand::class];
// проходится по классу и собирает команды, на которые срабатывает обработчик
$collector = new CommandsCollector();
// массива команд и соответствующих им обработчиков
$commands = [];
foreach($actions as $action)
$classCommands = $collector->collect($action);
$commands = array_merge($commands, $classCommands);
>
// запускаем бота
BotApp($bot, $commands);
Сопоставление команд с обработчиком происходит с помощью аннотаций. Для этого как раз и нужен пакет doctrine/annotations
Класс, который содержит обработчики команд
use TelegramBotApi;
use TelegramBotObjectsUpdate as ObjectsUpdate;
$bot->sendMessage([‘chat_id’ => $chat_id, ‘parse_mode’ => ‘HTML’, ‘disable_web_page_preview’ => false, ‘text’ => $reply]);
$reply = «По запросу «$text» ничего не найдено.»;
$bot->sendMessage([‘chat_id’ => $chat_id, ‘parse_mode’ => ‘HTML’, ‘text’ => $reply]);
>
>
Формированием команд и их обработчиков занимается класс CommandsCollector:
class CommandsCollector
/**
* Выбирает из класса все публичные методы, затем вытаскивает
* из них текст команд, на которые они должны срабатывать и формирует
* массив вида:
*
* [
* ‘привет’ => [‘MainCommand’, ‘welcome’]
* ]
*
* Т.е. на введенную пользователем команду будет срабатывать метод welcome класса MainCommand
*/
public function collect($class)
$reader = new AnnotationReader();
$refClass = new ReflectionClass($class);
$refMethods = $refClass -> getMethods(ReflectionMethod::IS_PUBLIC);
$commands = [];
foreach($refMethods as $method)
$command = $reader->getMethodAnnotation($method, Command::class);
if($command) $commands[$command->text] = [$method->class, $method->name];
>
>
После того, как код написан — нужно его разместить на платформе Heroku. Для этого нужно выполнить следующие команды в папке проекта (предполагается, что консольная утилита heroku уже установлена в системе и доступна в консоли как команда heroku):
$ cd myrusakov-telegram-bot # переходим в папку проекта — в моем случае она называется так
$ heroku login # вы должны быть зарегистрированы на Heroku и приложение myrusakovbot21 (в моем случае оно так называется) должно создано
$ heroku git:remote -a myrusakovbot21 # связываем наше приложение на компьютере с удаленным приложением на сервере
$ git add .
$ git commit -am «Initial commit»
$ git push heroku main
Таким образом, если не возникнет ошибок в ходе размещения бота на Heroku, то Ваш бот успешно размещен на сервере и готов принимать команды. Если же, после всего сделанного бот не запускается, то в папке приложения можно выполнить команду heroku logs -a myrusakovbot21, которая выведет ошибки, возникшие при обработке команд.
Создано 16.12.2021 08:01:42
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 2 ):
Bulat1988 04.10.2022 15:59:43
Что этот бот умеет?
Castels 10.11.2022 21:47:05
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Источник: myrusakov.ru
Диалоговый телеграм бот на PHP
Первое, с чего нужно начать, так это с создания бота. Есть официальная документация и там подробно расписаны шаги.
Если в описанной инструкции ничего не понятно, то вот пошаговая инструкция
- находим в телеграм бота BotFather и добавляем себе в контакт лист
- смотрим доступные команды бота с помощью команды /help
выбираем /newbot и далее, следуя инструкции, выполняем необходимые действия (следующая картинка взята из google)
После создания бота вы получите токен, которые нужно будет использовать в коде вашего бота, поэтому сообщение с токеном необходимо сохранить.
Связываем бота с приложениемсайтом
Начинается самое интересное, а также именно тут я столкнулся с первой проблемой.
Первым делом выбираем библиотеку на php по созданию бота. Я свой выбор остановил на этой библиотеке, так как мне она показалась самой удобной.
После подключения библиотеки нужно организовать взаимодействие бота с вашим сайтомприложением. Организовать это взаимодействие можно с помощью вебхуков.
Вебхук — это своего рода ретранслятор, который все запросы от бота будет передавать на адрес, указанный при регистрации вебхука. Зарегистрировать вебхук очень просто, нужно просто отправить запрос вида https: //api.telegram.org/bot~token~/setWebhook?url=https: //example.ru/path, где
https: //example.ru/ — это ссылка на ваш сайт, куда будет перенаправлять бот запросы.
~token~ — это токен, который вы получили при регистрации своего бота.
path — это часть url, на которую будут приходить обращения.
И вот именно тут возникает проблема. Оказывается вебхук можно зарегистрировать только в случае, если сайт находится на https. Если же ваш сайт на http, то зарегистрировать вебхук вам не получится.
Но выход есть, если вы не хотите покупать сертификат
Вы можете воспользоваться сервисом Let’s Encrypt
Переходим в раздел getting startted и следуем инструкции.
Написание кода бота
Теперь же приступаем к программированию. После того, как взаимосвязь организована, можно начинать писать логику нашего бота.
Разработчики telegram, для того чтобы пользователям было проще работать с ботами, просят всех разработчиков реализовывать поддержку следующих команд:
/start — начинает общение с пользователем (например, отправляет приветственное сообщение). В эту команду также можно передавать дополнительные аргументы.
/help — отображает сообщение с помощью по командам. Оно может представлять собой короткое сообщение о вашем боте и список доступных команд.
Все что нам нужно сделать, это в контроллере вашего приложениясайта написать следующий код:
$token = «токен»; $bot = new TelegramBotApiClient($token); // команда для start $bot->command(‘start’, function ($message) use ($bot) < $answer = ‘Добро пожаловать!’; $bot->sendMessage($message->getChat()->getId(), $answer); >); // команда для помощи $bot->command(‘help’, function ($message) use ($bot) < $answer = ‘Команды: /help — вывод справки’; $bot->sendMessage($message->getChat()->getId(), $answer); >); $bot->run();
Теперь если в окне телеграм бота написать /help, то будет выведен текст:
Команды:
/help — вывод справки
Что ж, мы написали список рекомендуемых команд. Далее мы можем реализовывать необходимые нам команды.
Так как команды могут принимать аргументы, то мы эту возможность используем. Например, мы сделаем так, чтобы наш бот, на команду hello Вася, отвечал сообщением: Привет, Вася.
Для этого следует написать следующий код:
$bot->command(‘hello’, function ($message) use ($bot) < $text = $message->getText(); $param = str_replace(‘/hello ‘, », $text); $answer = ‘Неизвестная команда’; if (!empty($param)) < $answer = ‘Привет, ‘ . $param; >$bot->sendMessage($message->getChat()->getId(), $answer); >);
Получается все очень просто и быстро.
Заносим список команд бота
Для того, чтобы бот мог выдавать интерактивную справку
необходимо боту BotFather сообщить список команд.
Сделать это можно с помощью его команды /setcommands
Велосипедство
Описанный выше вариант не совсем удобен, потому что не хочется вбивать после команды текст, так как если использовать подсказки от бота, то это совсем нереально.
Значит нужно сделать так, чтобы бот запоминал команду, которую вы вводите. Это можно сделать с помощью любого хранилища (MySQL, memcached, redis, tarantool, Postgres, etc)
Все что нужно, это запоминать предыдущий ввод пользователя.
Для этого нужно перед отдачей пользователю сообщения, помещать его в ваше хранилище, а перед принятием сообщения — проверять, если в хранилище данные. И если есть, то на основании этих данных строить дальнейшую логику.
Вот на этом этапе у меня снова возникла трудность, так как я не нашел в библиотеке возможности получить команду до вызова метода command. Также мне не понравилось то, что вся логика будет заперта в рамках одного контроллера приложения.
Было принято решение написать свой обработчик данных, с возможностью выносить каждую команду в отдельный контроллер приложения.
Для начала мы описываем точку входа в контроллер
function main() < $telegram = new Telegram(); // подключаем хранилище $storage = new Storage(); // получаем объект сообщения $message = $telegram->getMessage(); // получаем команду, если ее передали $command = $message->getCommand(); // получаем текст, если его передали (тут лежит все, что не является командой) $text = $message->getParams($command); // если команда пустая, то мы проверяем, есть ли у пользователя на предыдущем шаге вызов команды и восстановливаем ее if (empty($command)) < $command = $storage->restoreCommand($message->getChat()->getId()); > // запоминаем команду, котрую ввел пользователь $storage->storeCommand( $message->getChat()->getId(), $command ); // логика подключения нашего метода для котроллера $this->chooseMethod($command, $message, $text); >
Теперь рассмотрим один из методов.
function getnewtext(Message $telegram, $text) < // если не передали текст, то выведем сообщение с разъяснением if (empty($text)) < $answer = «Введите слово или несколько слов для поиска. Именно по ним будет происходить поиск 5 свежих новостей.»; $telegram->sendMessage($telegram->getChat()->getId(), $answer); > else < // основаня логика $tgNews = new TelegramNews(); $arData = $tgNews->getByWord($text, ‘new’); if (empty($arData)) < $answer = ‘Ничего не найдено’; >else < $answer = common_setViewGetContent(‘telegram/get’, [ ‘data’ =>$arData ]); > $telegram->sendMessage($telegram->getChat()->getId(), $answer); > >
Так стало все в разы приятнее, интерактивнее и удобнее.
Спасибо, что дочитали статью до конца. Поиграть с живым ботом, который работает в режиме диалога можно тут.
UPD: боту добавлена возможность отдавать фото на некоторые виды запросов. Например на
/gettable — возвращает результирующую таблицу спортивных событий
/getevents — возвращает события спортивных мероприятий
Источник: habr.com
Телеграм бот на PHP: примеры создания и отправка сообщений
FAQ
Автор fast12v0_steleg На чтение 5 мин Просмотров 461 Опубликовано 23.01.2020
Мессенджер «Телеграм» в последнее время стремительно вошел в жизнь многих людей. Он практичен, удобен, обладает рядом полезных функций, которые можно использовать бесплатно. Программа работает на разных операционных системах, языках программирования, может поддерживать существующие боты, создавать новые.
Что такое бот
Под термином bot подразумевается специальная небольшая утилита для выполнения определенных действий через заранее заданный пошаговый алгоритм.
Telegram bot лучше предназначен в качестве помощника в однообразной, повторяемой работы. В отличие от человека, он быстро справляется с поставленной задачей, а также не устает от монотонности действий.
Зачем он нужен
Полезные утилиты очень распространены. Они активно пользуются в интернет-магазинах, в лизинговых, страховых компаниях, на страницах банков. Роботы могут присылать документы, осуществлять запись информацию, создавать запросы, отправлять и получать message .
К главным функциям роботов относятся:
- Поиск клиентов в сети, отправка писем другим пользователям.
- Выполнение однообразных действий (как вариант, оплата заказа в магазине, расчет за услуги, набор контакта).
- Перевод text на разные языки.
- Развлечение пользователей. Подыскивают новые картинки, фото, видео, новости. Критерии выбора – заданные абонентом параметры (предпочтения).
- Постинг картинок, а также информации с имеющейся базы и сети.
- Помощь в работе с документацией. Могут вести отчеты, несложные бухгалтерские расчеты, а также позволяют выполнять ряд других операций.
Это всего лишь самая малая часть доступных возможностей. Их полный список огромен и разнообразен.
Пошаговая инструкция
Пишем для Telegram на языке php по определенному алгоритму действий. Рассмотрим его последовательность, а также некие особенности.
Подготовка к написанию
Перед тем как писать робота, лучше сначала убедиться в наличии домена, хостинга и SSL-сертификата для него (URL начинается с https). Пойти в обход этих технических составляющих невозможно. Отсутствие любого звена недопустимо.
Регистрация
Следующий шаг – регистрация.
Для этого нужно:
После завершения регистрации вам будет присвоен уникальный токен. Его лучше хранить и никому не показывать. В противном случае помощник может быть скомпрометирован или заблокирован.
Кодировка
Кодировка проекта на php имеет следующий порядок действий:
- Зайти в папку с помощником, создать файл index.php.
- Пишем заголовки, подключаем «АПИ».
Что такое webhook
Webhook – механизм, связывающий робота с «Телеграмом». Когда мы вводим команды, она сразу передается на сервер, который в короткое время проводит ее обработку и отвечает пользователю. «Веб хук» выступает связным звеном, которое сообщает мессенджеру, куда и когда передавать распоряжение.
Прописываем обязательные команды
К обязательным приказам, которые должны быть написаны, относятся /start и /help. Используемый код имеет следующий вид:
Сохраняем файлы, тестируем помощника. На выходе мы должны получить:
При правильном написании вышеуказанного кода никаких трудностей возникнуть не должно. В случае неработоспособности робота проверьте правильность введенного кода.
Библиотеки TelegramBotApi
Библиотека платформы «Телеграм» состоит из множества слов и команд. Ей можно воспользоваться в целях написания отдельно взятых кодов, предоставления информации, хранения книг. Библиотека способна откладывать в себя новые поступления информации, не требует дополнительной установки. Может работать на компьютере, телефоне, планшете.
Распоряжение задается следующим блоком:
Картинки
Отправка картинок выполняется через передачу ссылки на картинку. «Телеграм» самостоятельно скачивает изображение и заботится о его дальнейшем получении пользователем.
Пример значения адреса здесь:
Картинка успешно отправлена отправителем и доставлена пользователю:
Сообщения
Отправка сообщений в Telegram требует некой интерактивности. Для достижения этой цели API имеет команду on (). Пример значения кода (с переменной sendmessage) :
Полученное уведомление будет выглядеть так:
Документы
В отличие от картинок отправка документов выполняется в POST-формате.
Краткий метод отправки документов следующий:
- Загрузить документ в папку с ботом. Например:
- Далее в массив прописать следующее (обязательно строка senddocument) :
- Получить результат:
Преимущества бота на php
Созданный имеет ряд преимуществ, к основным из которых можно отнести:
- Стабильность работы системы.
- Быстрота выполняемых действий и отклика.
- Возможность сбережения большого объема информации.
- Не требует привязки к номеру телефона.
Выводы
Бот «Телеграм» разработки на php является простым, надежным и стабильным. Установка его на данном языке программирования имеет некие особенности, которые были рассмотрены выше. При всех их соблюдении Телеграм бот на php будет работать качественно и долго. Он может быть установлен на любом гаджете, имеющем доступ в интернет.
Детальная инструкция видна на видео:
Источник: stelegram.ru