Jump to content

Laravel telegram bot


PaZiTiF
 Share

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
Link to comment
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:

Ну, неплохо

Link to comment
Share on other sites

3 минуты назад, PaZiTiF сказал:

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

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

Link to comment
Share on other sites

1 минуту назад, Stark98 сказал:

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

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

  • Upvote 1
Link to comment
Share on other sites

3 минуты назад, PaZiTiF сказал:

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

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

Edited by Stark98
  • Like 1
Link to comment
Share on other sites

1 час назад, PaZiTiF сказал:

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

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

Link to comment
Share on other sites

1 минуту назад, Семен сказал:

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

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

Link to comment
Share on other sites

5 часов назад, timbios сказал:

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

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

  • Upvote 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...