PaZiTiF Posted August 4, 2020 Report Share Posted August 4, 2020 Как же все таки создать своего telegram бота на Laravel? Для создания нам понадобится: Оффициальная документация по Laravel (я думаю что с установкой не будет проблем); Регистрация нашего бота у @BotFather; Установка библиотеки для работы с Telegram API из Github Репозитория; Еще нам нужно доменное имя с SSL Сертификатом (https протокол), ибо телеграм без сертификата не будет слушать наш сервер через WebHook; Ну что, начнем с регистрации нишего бота у @BotFather Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» - @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Открываете чат с @BotFather; Вводите или выбираете из списка команду /newbot; Отправляете желаемое название для бота; Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, CmsToolsBot; По желанию можно сразу настроить полное или краткое описание, список команд и аватарку. По итогу регистрации получаем наш токен — 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s (данный токен не рабочий). Будьте осторожны: никогда и никому не показывайте токен, иначе ваш бот может быть скомпрометирован. Если по несчастливой случайности кто-то нехороший все-таки узнал ваш токен, то заменить его можно всё в том же @BotFather, нажав на кнопку «Revoke current token» в разделе «API Token». Создадим нашего бота Писать код бота будем на Laravel, но чтобы ничего не изобретать, воспользуемся уже готовой и очень удобной Библиотекой. Первое что нам понадобится, так это привязать через метод SetWebhook бота к нашему файлу-обработчику. Сделать это можно при помощи библиотеки, но есть вариант быстрее и проще – это построить вот такую ссылку: https:// api. telegram. org/bot375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s/setWebhook?url=https:// site.ru/bot/webhook, где: 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s — это наш токен; https:// site.ru/bot/webhook - ссылка на файл-обработчик на нашем сайте; Открыв в браузере эту ссылку, должен прийти JSON-ответ со значением «Webhook was set», что будет означать, что вебхук установлен, и теперь все запросы от пользователей будут присылаться по адресу файла-обработчика. Ну а теперь самое интерестное, мы уже установили наш Laravel Framework, теперь нам нужно установить библиотеку и создать обработчик, который будет доступен по ссылке https:// site.ru/bot/webhook. Для установки библиотеки, нам понадобится composer (если у Вас не работает композер, то в гугле можно найти много мануалов по использованию и настройке). Ядро composer и vendor папки с установленными библиотеками у laravel находится в корневой папке, так что заходим туда и через терминал (командную строку) пишем команду установки библиотеки: Цитата composer require telegram-bot/api Теперь у нас все готово к написанию обработчика который будет слушать telegram через WebHook. Нам нужно прежде всего создать контроллер, в котором и будет наша функция связи с телеграм. В той же корневой папке через терминал вводим команду для создания нашего контроллера: php artisan make:controller BotController, данная команда автоматически создаст app\Http\Controllers\BotController.php (можно ознакомится с офф документацией по контроллерам), и сразу же создадим роутер чтобы наша ссылка получила формат https:// site.ru/bot/webhook. Нам нужно добавить код routes в файл routes\web.php (так же есть документация по роутерам): Route::group(['prefix' => 'bot', 'middleware' => 'web'], function () { Route::post('webhook', '[email protected]'); }); И еще так как все post запросы в laravel проходят только с CSRF токеном, то для префикса bot нам нужно сделать исключение, идем в файл app\Http\Middleware\VerifyCsrfToken.php и добавляем исключение: /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ //'api/*', 'bot/*' ]; [email protected] - данная строчка значит что мы обращаемся к контроллеру BotController и функции с названием index. Ну а теперь и код контроллера: <?php namespace App\Http\Controllers; use TelegramBot\Api\Client; // подключение библиотеки Telegram API use TelegramBot\Api\Types\ReplyKeyboardMarkup; // использование ReplyKeyboardMarkup (основное меню) use TelegramBot\Api\Types\Inline\InlineKeyboardMarkup; // использование InlineKeyboardMarkup (кнопки под сообщением) class BotController extends Controller { public function index() { // Подключение сайта к Telegram API // Пример token - 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s $bot = new \TelegramBot\Api\Client('token'); // Стандартная команда /start // Таким образом можно создать любую команду $bot->command('start', function ($message) use ($bot) { $answer = 'Добро пожаловать!'; $bot->sendMessage($message->getChat()->getId(), $answer); }); // Пример кнопок у сообщений - команда /keyboard $bot->command('keyboard', function ($message) use ($bot) { $answer = 'Предоставленные кнопки!'; $testKey = new InlineKeyboardMarkup( [ [ ['callback_data' => 'test', 'text' => 'Тестовая кнопка'] ] ] ); $bot->sendMessage($message->getChat()->getId(), $answer, 'HTML', true, null, $testKey); }); // пример кнопок меню под строкой ввода /menu $bot->command('menu', function ($message) use ($bot) { $answer = 'Сообщение показывается и снизу появятся кнопки'; $StartKeyboard = new ReplyKeyboardMarkup( [ [ "Привет" ], [ "/start", "/keyboard" ] ], true, true ); $bot->sendMessage($message->getChat()->getId(), $answer, 'HTML', true, null, $StartKeyboard); }); // Обработка кнопок у сообщений $bot->on(function ($Update) use ($bot) { $callback = $Update->getCallbackQuery(); $message = $callback->getMessage(); // получаем сообщение $cid = $callback->getFrom()->getId(); // уникальный идентификатор chat_id $data = $callback->getData(); // название команды переданный с кнопки у сообщения // пример обработки команды с кнопки if ($data == "test") { $answer = "Пример сообщения с кнопки :)"; // данная функция будет не отправлять сообщение, а редактировать предыдущее сообщение с кнопками $bot->editMessageText($message->getChat()->getId(), $message->getMessageId(), $answer, 'HTML'); $bot->answerCallbackQuery($callback->getId()); // убираем загрузку на кнопке //$bot->answerCallbackQuery($callback->getId(), 'Всплывающее сообщение'); // убирает загрузку на кнопке и показывает сообщение } // убираем вечное обновление (данная проблема только на Laravel, на чистом php вечного обновления нету) if (empty($data)) return true; else return false; }, function ($Update) { try { $callback = $Update->getCallbackQuery(); if (is_null($callback) || !strlen($callback->getData())) return false; return true; } catch (\Exception $e) { return false; } }); // Отлов любых сообщений + обработка reply-кнопок $bot->on(function ($Update) use ($bot) { $message = $Update->getMessage(); // получаем инфо о сообщениях $mtext = $message->getText(); // получаем текст отправленого сообщения пользователем $cid = $message->getChat()->getId(); // получаем chat_id (уникальный ид пользователя в телеграм) // Пример проверки сообщения if (mb_stripos($mtext, "Привет") !== false) { $answer = "Привет, " . $message->getChat()->getFirstName(); // будет отправлено сообщение в ответ "Привет, Konstantin" $bot->sendMessage($message->getChat()->getId(), $answer, 'HTML', true, null); } }, function ($message) { return true; }); // Запуск бота if (!empty($bot->getRawBody())) { try { $bot->run(); } catch (\Exception $e) { // можно добавить функцию уведомления администратора о возможных ошибках } } } } ?> Таким образом можно создать telegram бота любой сложности, от простого новостного бота, до онлайн игр методом команд, примеров таких ботов полно. Работоспособность всех кнопок и команд можно посмотреть на примере одного из моих ботов @InstaSunriseBot, в нем реализованы все коды команд и даже больше и данная библиотека позволяет управлять телеграм каналами через бота, к примеру он может следить за чатом... Если будет интерестная тематика по ботам и различным приложениям на ларавел, могу еще пару статей выложить... Так же можно задать мне вопросы в телеграм @syfer_dev Всем спасибо за внимание 1 4 Quote Link to comment Share on other sites More sharing options...
Stark98 Posted August 4, 2020 Report Share Posted August 4, 2020 2 часа назад, PaZiTiF сказал: Как же все таки создать своего telegram бота на Laravel? Для создания нам понадобится: Оффициальная документация по Laravel (я думаю что с установкой не будет проблем); Регистрация нашего бота у @BotFather; Установка библиотеки для работы с Telegram API из Github Репозитория; Еще нам нужно доменное имя с SSL Сертификатом (https протокол), ибо телеграм без сертификата не будет слушать наш сервер через WebHook; Ну что, начнем с регистрации нишего бота у @BotFather Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» - @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Открываете чат с @BotFather; Вводите или выбираете из списка команду /newbot; Отправляете желаемое название для бота; Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, CmsToolsBot; По желанию можно сразу настроить полное или краткое описание, список команд и аватарку. По итогу регистрации получаем наш токен — 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s (данный токен не рабочий). Будьте осторожны: никогда и никому не показывайте токен, иначе ваш бот может быть скомпрометирован. Если по несчастливой случайности кто-то нехороший все-таки узнал ваш токен, то заменить его можно всё в том же @BotFather, нажав на кнопку «Revoke current token» в разделе «API Token». Создадим нашего бота Писать код бота будем на Laravel, но чтобы ничего не изобретать, воспользуемся уже готовой и очень удобной Библиотекой. Первое что нам понадобится, так это привязать через метод SetWebhook бота к нашему файлу-обработчику. Сделать это можно при помощи библиотеки, но есть вариант быстрее и проще – это построить вот такую ссылку: https:// api. telegram. org/bot375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s/setWebhook?url=https:// site.ru/bot/webhook, где: 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s — это наш токен; https:// site.ru/bot/webhook - ссылка на файл-обработчик на нашем сайте; Открыв в браузере эту ссылку, должен прийти JSON-ответ со значением «Webhook was set», что будет означать, что вебхук установлен, и теперь все запросы от пользователей будут присылаться по адресу файла-обработчика. Ну а теперь самое интерестное, мы уже установили наш Laravel Framework, теперь нам нужно установить библиотеку и создать обработчик, который будет доступен по ссылке https:// site.ru/bot/webhook. Для установки библиотеки, нам понадобится composer (если у Вас не работает композер, то в гугле можно найти много мануалов по использованию и настройке). Ядро composer и vendor папки с установленными библиотеками у laravel находится в корневой папке, так что заходим туда и через терминал (командную строку) пишем команду установки библиотеки: Теперь у нас все готово к написанию обработчика который будет слушать telegram через WebHook. Нам нужно прежде всего создать контроллер, в котором и будет наша функция связи с телеграм. В той же корневой папке через терминал вводим команду для создания нашего контроллера: php artisan make:controller BotController, данная команда автоматически создаст app\Http\Controllers\BotController.php (можно ознакомится с офф документацией по контроллерам), и сразу же создадим роутер чтобы наша ссылка получила формат https:// site.ru/bot/webhook. Нам нужно добавить код routes в файл routes\web.php (так же есть документация по роутерам😞 Route::group(['prefix' => 'bot', 'middleware' => 'web'], function () { Route::post('webhook', '[email protected]'); }); И еще так как все post запросы в laravel проходят только с CSRF токеном, то для префикса bot нам нужно сделать исключение, идем в файл app\Http\Middleware\VerifyCsrfToken.php и добавляем исключение: /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ //'api/*', 'bot/*' ]; [email protected] - данная строчка значит что мы обращаемся к контроллеру BotController и функции с названием index. Ну а теперь и код контроллера: <?php namespace App\Http\Controllers; use TelegramBot\Api\Client; // подключение библиотеки Telegram API use TelegramBot\Api\Types\ReplyKeyboardMarkup; // использование ReplyKeyboardMarkup (основное меню) use TelegramBot\Api\Types\Inline\InlineKeyboardMarkup; // использование InlineKeyboardMarkup (кнопки под сообщением) class BotController extends Controller { public function index() { // Подключение сайта к Telegram API // Пример token - 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s $bot = new \TelegramBot\Api\Client('token'); // Стандартная команда /start // Таким образом можно создать любую команду $bot->command('start', function ($message) use ($bot) { $answer = 'Добро пожаловать!'; $bot->sendMessage($message->getChat()->getId(), $answer); }); // Пример кнопок у сообщений - команда /keyboard $bot->command('keyboard', function ($message) use ($bot) { $answer = 'Предоставленные кнопки!'; $testKey = new InlineKeyboardMarkup( [ [ ['callback_data' => 'test', 'text' => 'Тестовая кнопка'] ] ] ); $bot->sendMessage($message->getChat()->getId(), $answer, 'HTML', true, null, $testKey); }); // пример кнопок меню под строкой ввода /menu $bot->command('menu', function ($message) use ($bot) { $answer = 'Сообщение показывается и снизу появятся кнопки'; $StartKeyboard = new ReplyKeyboardMarkup( [ [ "Привет" ], [ "/start", "/keyboard" ] ], true, true ); $bot->sendMessage($message->getChat()->getId(), $answer, 'HTML', true, null, $StartKeyboard); }); // Обработка кнопок у сообщений $bot->on(function ($Update) use ($bot) { $callback = $Update->getCallbackQuery(); $message = $callback->getMessage(); // получаем сообщение $cid = $callback->getFrom()->getId(); // уникальный идентификатор chat_id $data = $callback->getData(); // название команды переданный с кнопки у сообщения // пример обработки команды с кнопки if ($data == "test") { $answer = "Пример сообщения с кнопки :)"; // данная функция будет не отправлять сообщение, а редактировать предыдущее сообщение с кнопками $bot->editMessageText($message->getChat()->getId(), $message->getMessageId(), $answer, 'HTML'); $bot->answerCallbackQuery($callback->getId()); // убираем загрузку на кнопке //$bot->answerCallbackQuery($callback->getId(), 'Всплывающее сообщение'); // убирает загрузку на кнопке и показывает сообщение } // убираем вечное обновление (данная проблема только на Laravel, на чистом php вечного обновления нету) if (empty($data)) return true; else return false; }, function ($Update) { try { $callback = $Update->getCallbackQuery(); if (is_null($callback) || !strlen($callback->getData())) return false; return true; } catch (\Exception $e) { return false; } }); // Отлов любых сообщений + обработка reply-кнопок $bot->on(function ($Update) use ($bot) { $message = $Update->getMessage(); // получаем инфо о сообщениях $mtext = $message->getText(); // получаем текст отправленого сообщения пользователем $cid = $message->getChat()->getId(); // получаем chat_id (уникальный ид пользователя в телеграм) // Пример проверки сообщения if (mb_stripos($mtext, "Привет") !== false) { $answer = "Привет, " . $message->getChat()->getFirstName(); // будет отправлено сообщение в ответ "Привет, Konstantin" $bot->sendMessage($message->getChat()->getId(), $answer, 'HTML', true, null); } }, function ($message) { return true; }); // Запуск бота if (!empty($bot->getRawBody())) { try { $bot->run(); } catch (\Exception $e) { // можно добавить функцию уведомления администратора о возможных ошибках } } } } ?> Таким образом можно создать telegram бота любой сложности, от простого новостного бота, до онлайн игр методом команд, примеров таких ботов полно. Работоспособность всех кнопок и команд можно посмотреть на примере одного из моих ботов @InstaSunriseBot, в нем реализованы все коды команд и даже больше и данная библиотека позволяет управлять телеграм каналами через бота, к примеру он может следить за чатом... Если будет интерестная тематика по ботам и различным приложениям на ларавел, могу еще пару статей выложить... Так же можно задать мне вопросы в телеграм @syfer_dev Всем спасибо за внимание Ну, неплохо Quote Link to comment Share on other sites More sharing options...
PaZiTiF Posted August 4, 2020 Author Report Share Posted August 4, 2020 14 минут назад, Stark98 сказал: Ну, неплохо это только 1% того что можно сделать с данной статьи) Quote Link to comment Share on other sites More sharing options...
Stark98 Posted August 4, 2020 Report Share Posted August 4, 2020 3 минуты назад, PaZiTiF сказал: это только 1% того что можно сделать с данной статьи) Согласен, я сейчас, кстати хочу выложить статью про установку Laravel часть 1. Quote Link to comment Share on other sites More sharing options...
PaZiTiF Posted August 4, 2020 Author Report Share Posted August 4, 2020 1 минуту назад, Stark98 сказал: Согласен, я сейчас, кстати хочу выложить статью про установку Laravel часть 1. будет полезно, просто многие не понимают как устроин artisan в laravel и как работать с миграциями, моделями и контроллерами 1 Quote Link to comment Share on other sites More sharing options...
Stark98 Posted August 4, 2020 Report Share Posted August 4, 2020 (edited) 3 минуты назад, PaZiTiF сказал: будет полезно, просто многие не понимают как устроин artisan в laravel и как работать с миграциями, моделями и контроллерами В течении полугода, я завершу перевод и будет все, что надо для начала работы Edited August 4, 2020 by Stark98 1 Quote Link to comment Share on other sites More sharing options...
Print_control Posted August 4, 2020 Report Share Posted August 4, 2020 Спасиба Quote Link to comment Share on other sites More sharing options...
Семен Posted August 4, 2020 Report Share Posted August 4, 2020 1 час назад, PaZiTiF сказал: будет полезно, просто многие не понимают как устроин artisan в laravel и как работать с миграциями, моделями и контроллерами Сам по себе фреймворк сделали для такой аудитории, куда еще проще? Quote Link to comment Share on other sites More sharing options...
PaZiTiF Posted August 4, 2020 Author Report Share Posted August 4, 2020 1 минуту назад, Семен сказал: Сам по себе фреймворк сделали для такой аудитории, куда еще проще? ну не скажите, некоторым трудно же прочесть документацию с офф сайта и воссоздать функции которые нужны им для работы, для некоторых это даже сложно! а фронтенд как использовать к примеру дефолтный vue или же даже взять выше и прикрутить angular через REST API, или ionic с angular или react на том же API так это вообще проблема для людей) Quote Link to comment Share on other sites More sharing options...
timbios Posted August 5, 2020 Report Share Posted August 5, 2020 Очень интересный и полезный мануал! Приятно видеть старые лица на форуме 😊 1 1 Quote Link to comment Share on other sites More sharing options...
PaZiTiF Posted August 6, 2020 Author Report Share Posted August 6, 2020 5 часов назад, timbios сказал: Очень интересный и полезный мануал! Приятно видеть старые лица на форуме 😊 спасибо) будет время, напишу еще дополнительный мануал к данному мануалу, как сделать регистрацию пользователя и все в этом роде) 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.