Jump to content
PaZiTiF

Laravel telegram bot

Recommended Posts

Как же все таки создать своего telegram бота на Laravel?

Для создания нам понадобится:

  • Оффициальная документация по Laravel (я думаю что с установкой не будет проблем);
  • Регистрация нашего бота у @BotFather;
  • Установка библиотеки для работы с Telegram API из Github Репозитория;
  • Еще нам нужно доменное имя с SSL Сертификатом (https протокол), ибо телеграм без сертификата не будет слушать наш сервер через WebHook;

Ну что, начнем с регистрации нишего бота у @BotFather

Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» - @BotFatherчтобы получить токен (ключ) для работы с Telegram API.

  1. Открываете чат с @BotFather;
  2. Вводите или выбираете из списка команду /newbot;
  3. Отправляете желаемое название для бота;
  4. Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, CmsToolsBot;
  5. По желанию можно сразу настроить полное или краткое описание, список команд и аватарку.

По итогу регистрации получаем наш токен — 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

Всем спасибо за внимание :emoji_1f609:

  • Like 1
  • Upvote 4

Share this post


Link to post
Share on other sites
2 часа назад, PaZiTiF сказал:

Как же все таки создать своего telegram бота на Laravel?

Для создания нам понадобится:

  • Оффициальная документация по Laravel (я думаю что с установкой не будет проблем);
  • Регистрация нашего бота у @BotFather;
  • Установка библиотеки для работы с Telegram API из Github Репозитория;
  • Еще нам нужно доменное имя с SSL Сертификатом (https протокол), ибо телеграм без сертификата не будет слушать наш сервер через WebHook;

Ну что, начнем с регистрации нишего бота у @BotFather

Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» - @BotFatherчтобы получить токен (ключ) для работы с Telegram API.

  1. Открываете чат с @BotFather;
  2. Вводите или выбираете из списка команду /newbot;
  3. Отправляете желаемое название для бота;
  4. Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, CmsToolsBot;
  5. По желанию можно сразу настроить полное или краткое описание, список команд и аватарку.

По итогу регистрации получаем наш токен — 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

Всем спасибо за внимание :emoji_1f609:

Ну, неплохо

Share this post


Link to post
Share on other sites
14 минут назад, Stark98 сказал:

Ну, неплохо

это только 1% того что можно сделать с данной статьи)

Share this post


Link to post
Share on other sites
3 минуты назад, PaZiTiF сказал:

это только 1% того что можно сделать с данной статьи)

Согласен, я сейчас, кстати хочу выложить статью про установку Laravel часть 1.

Share this post


Link to post
Share on other sites
1 минуту назад, Stark98 сказал:

Согласен, я сейчас, кстати хочу выложить статью про установку Laravel часть 1.

будет полезно, просто многие не понимают как устроин artisan в laravel и как работать с миграциями, моделями и контроллерами :)

  • Upvote 1

Share this post


Link to post
Share on other sites
3 минуты назад, PaZiTiF сказал:

будет полезно, просто многие не понимают как устроин artisan в laravel и как работать с миграциями, моделями и контроллерами :)

В течении полугода, я завершу перевод и будет все, что надо для начала работы 

Edited by Stark98
  • Like 1

Share this post


Link to post
Share on other sites
1 час назад, PaZiTiF сказал:

будет полезно, просто многие не понимают как устроин artisan в laravel и как работать с миграциями, моделями и контроллерами :)

Сам по себе фреймворк сделали для такой аудитории, куда еще проще?

Share this post


Link to post
Share on other sites
1 минуту назад, Семен сказал:

Сам по себе фреймворк сделали для такой аудитории, куда еще проще?

ну не скажите, некоторым трудно же прочесть документацию с офф сайта и воссоздать функции которые нужны им для работы, для некоторых это даже сложно!
а фронтенд как использовать к примеру дефолтный vue или же даже взять выше и прикрутить angular через REST API, или ionic с angular или react на том же API так это вообще проблема для людей)

Share this post


Link to post
Share on other sites

Очень интересный и полезный мануал! Приятно видеть старые лица на форуме 😊

  • Like 1
  • Upvote 1

Share this post


Link to post
Share on other sites
5 часов назад, timbios сказал:

Очень интересный и полезный мануал! Приятно видеть старые лица на форуме 😊

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

  • Upvote 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×