Создание бота на Telegram. Библиотека для быстрого создания бота на Телеграмм

Блог компании Нетология PHP *Разработка мобильных приложений *API * Tutorial image

Шаг 1: регистрация бота у @BotFather

Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» — @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Регистрация проходит в 5 простых этапов: 1) Открываете чат с @BotFather; 2) Вводите или выбираете из списка команду /newbot; 3) Отправляете желаемое название для бота; 4) Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, NetologyRSSbot; 5) По желанию можно сразу настроить полное или краткое описание, список команд и аватарку. image По итогу регистрации получаем наш токен — 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s. Будьте осторожны: никогда и никому не показывайте токен, иначе ваш бот может быть скомпрометирован. Если по несчастливой случайности кто-то нехороший все-таки узнал ваш токен, то заменить его можно всё в том же @BotFather, нажав на кнопку «Revoke current token» в разделе «API Token».

Шаг 2: выбираем способ обработки запросов

Исходя из официальной документации, Telegram API основан на простых HTTP-запросах. Существует всего два различных способа обрабатывать запросы, которые пользователи будут посылать боту: 1) проверять «вручную», используя «Long Polling»; 2) доверить всё Telegram, поставив «Webhook». В этом случае любой запрос от пользователя Telegram сам будет посылать нам на сервер. Мы остановимся на втором варианте, но у него есть ограничение: у вас на сайте обязательно должен быть установлен SSL-сертификат, чтобы все запросы проходили через безопасный протокол HTTPS. Самоподписанные и бесплатные сертификаты «Let’s Encrypt», которые поддерживает большинство хостингов, также подходят. Пример настройки самоподписанного сертификата из официальной документации Telegram.

Шаг 3: пишем код

Писать код бота будем на PHP, но чтобы не изобретать заново колесо, воспользуемся уже готовой и очень удобной библиотекой. Перво-наперво привязываем через метод SetWebhook бота к нашему файлу-обработчику. Сделать это можно при помощи библиотеки, но есть вариант быстрее и проще – это построить вот такую ссылку: https:// api. telegram. org/bot375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s/setWebhook?url=https:// yoursitehere .ru/directory/bot.php, где 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s — это наш токен, https:// yousitehere. ru/directory/bot.php — ссылка на файл-обработчик на нашем сайте. Открыв в браузере эту ссылку, должен прийти JSON-ответ со значением «Webhook was set», что будет означать, что вебхук установлен, и теперь все запросы от пользователей будут присылаться по адресу файла-обработчика. Переходим к самому главному — обработке этих самых запросов и написанию функционала бота. Ниже представлен полный листинг файла-обработчика:

      include('vendor/autoload.php'); //Подключаем библиотеку     use TelegramBotApi;       $telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather     $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя          $text = $result["message"]["text"]; //Текст сообщения     $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя     $name = $result["message"]["from"]["username"]; //Юзернейм пользователя     $keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура      if($text){          if ($text == "/start") {             $reply = "Добро пожаловать в бота!";             $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);         }elseif ($text == "/help") {             $reply = "Информация с помощью.";             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply ]);         }elseif ($text == "Картинка") {             $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg";             $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Гифка") {             $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif";             $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Последние статьи") {             $html=simplexml_load_file('http://netology.ru/blog/rss.xml');             foreach ($html->channel->item as $item) {      $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n";         }             $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]);         }else{         $reply = "По запросу "".$text."" ничего не найдено.";         $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode'=> 'HTML', 'text' => $reply ]);         }     }else{     $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]);     }  

Разберем всё по порядку. 1. Сначала мы подключаем скачанную библиотеку, указав путь (лучше полный) до файла автозагрузчика.

include('vendor/autoload.php'); //Подключаем библиотеку use TelegramBotApi;

2. Создаем экземпляр класса в переменной $telegram и передаем в него наш токен. В переменной $result получаем информацию о сообщении, которое пришлет нам Telegram.

$telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя

3. Затем определяем главные переменные: текстовое сообщение, уникальный идентификатор пользователя и его юзернейм. Если предстоит работа с БД, то не забывайте про фильтрацию (или лучше используйте PDO).

$text = $result["message"]["text"]; //Текст сообщения $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя $name = $result["message"]["from"]["username"]; //Юзернейм пользователя

4. Создаем нашу клавиатуру, состоящую из трех кнопок.

$keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура

5. Теперь, когда мы обозначили все переменные, можно перейти к обработке полученного сообщения. Для этого можно использовать конструкцию switch-case либо if-else. Так как принципиальной разницы между ними нет, остановимся на втором варианте, как наиболее привычном. В самом начале проверяем, заполнена ли переменная $text и является ли сообщение пользователя текстовым.

if($text){          …          //код          ... }else{          $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]); }

Если нет, то отправляем пользователю с помощью метода sendMessage сообщение с просьбой ввести текстовое сообщение. 6. Рассмотрим вариант, когда пользователь прислал сообщение с командами /start или /help

if ($text == "/start") {             $reply = "Добро пожаловать в бота!";             $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);  }elseif ($text == "/help") {             $reply = "Информация с помощью.";             $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);             $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);   }

В этом случае помимо текста из переменной $reply будет подгружаться клавиатура, состоящая из трёх кнопок: «Последние статьи», «Картинка» и «Гифка». Реализуется это с помощью метода replyKeyboardMarkup, параметрами которого являются:

  • ‘keyboard’ => $keyboard, передаем нашу клавиатуру
  • ‘resize_keyboard’ => true, клавиатура будет сжата в размерах.
  • ‘one_time_keyboard’ => false, клавиатура не исчезнет после нажатия на какую-то кнопку.

7. После появления клавиатуры пользователь явно захочет попробовать потыкать на расположенные на ней кнопки, и вот что у нас «под капотом» в этом случае:

}elseif ($text == "Картинка") {             $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg";             $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Гифка") {             $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif";             $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]);         }elseif ($text == "Последние статьи") {             $html=simplexml_load_file('http://netology.ru/blog/rss.xml');             foreach ($html->channel->item as $item) {      $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n";             }             $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]);         }

8. Для отправки картинки используется метод sendPhoto, для отправки гифки – sendDocument. В обоих случаях Telegram позволяет передавать прямую ссылку на файл, что безусловно очень удобно, но не так быстро, как если бы мы передавали file_id уже отправленной на сервера Telegram картинки или гифки. 9. Для получения последних статей используется простой парсинг RSS ленты Нетологии при помощи встроенной в PHP функции simplexml_load_file. В параметрах метода sendMessage можно заметить два новых значения: 1) 'parse_mode' => 'HTML', чтобы в сообщение можно было вставить HTML-теги

, , ,  

или

2)

'disable_web_page_preview' => true

чтобы к сообщению со ссылкой не подгружалось превью. 10. В качестве смайла (стрелка вправо) используются символы xE2x9ExA1. Список всех смайлов в таком виде можно найти на специальном сайте. 11. После того, как вы протестируете бота и будете уверены в его работоспособности, можно отправлять его на всеобщее обозрение. Благодаря удобному API, боты Telegram могут стать хорошей платформой для автоматизации рутинных действий, настройки уведомлений, удобному и быстрому получению информации и созданию игр. Бесплатными площадками для продвижения могут послужить каталоги ботов Telegram Bot Store, TeleChappy или 50bots. А анализировать активность пользователей можно с помощью бесплатного инструмента для аналитики ботов от Яндекса — Botan.

От редакции

PHP — один из самых популярных языков программирования. Его легко изучать, с ним легко работать, у него мощное сообщество. 5 мая «Нетология» запускает курс «PHP/SQL: back-end разработка и базы данных», где ведущие программисты расскажут об управляющих конструкциях, циклах, функциях, о строках и массивах. Вы узнаете все про реляционные базы данных и язык запросов SQL, научитесь устанавливать и настраивать веб-сервер nginx и php, управлять базами данных различной сложности. Ждем вас!

Бот для телеграм на php.

На данный момент telegram развивается очень активно и является одним из популярных мессенджеров, охватывающих огромную аудиторию. Одной из особенностей данного приложения является наличие ботов, выполняющих различные функции. К таким функциям относятся онлайн-чаты, информирование пользователя (например, о новой записи в блоге), различные игры или помощь пользователю в различных аспектах.

В этой статье будет рассказано о том, как создать самого простого бота на языке php.

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

0. Подготовка

Самым первым делом необходимо отметить, что Телеграм позволяет размещать ботов только на доменах, защищенных сертификатом SSL. Если у вас еще нет такого сертификата, вам необходимо его приобрести. Возможно, вам также понадобится хостинг для размещения файлов бота. Для этих целей прекрасно подойдет хостинг от компании Бегет, предоставляющий бесплатные сертификаты. О его преимуществах подробно я расписал в этой статье.

1. Регистрация бота

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

Вводим команду /newbot, далее вписываем имя для своего бота и его username — адрес бота для доступа других пользователей. После этого вашему боту будет присвоен уникальный токен, запишите и сохраните его, он еще пригодится. Обратите внимание Username вашего бота должен заканчиваться символами bot или _bot

Все! Ваш бот создан и зарегистрирован в системе. Теперь можно настроить его описание, задать картинку профиля и другое в разделе Edit Bots.

2. Установка библиотеки

Для разработки бота воспользуемся готовой библиотекой telegram-bot-sdk. Установим ее с помощью composer:

composer require irazasyed/telegram-bot-sdk ^2.0

Здесь же можно настроить соединение по ftp с вашим сервером, где находится сайт из пункта 0. Я разместил своего бота в папке /bot/ своего сайта, имейте это ввиду при дальнейшем изучении статьи. Теперь настраиваем webhook для того, чтобы дать понять телеграму, где брать информацию о теле бота. Самый простой способ — веб запрос:

https://api.telegram.org/botздесь_вставляем_токен/setWebhook?url=https://anton-mironov.ru/bot/index.php

Соответственно вписываем свои данные на месте сайта и токена и отправляем данный запрос через любой браузер. В ответ должен прийти JSON файл:

{"ok":true,"result":true,"description":"Webhook was set"}

Это означает, что webhook установлен, и все запросы приходящие к боту будут обрабатываться файлом — обработчиком, указанным в параметре url.

3. Написание кода

Наш файл index.php в папке /bot/ является главным обработчиком запросов бота. Рассмотрим его возможный вид: 1) Прежде всего подключаем библиотеку и инициализируем бота при помощи токена

include('vendor/autoload.php'); use TelegramBotApi;  $telegram = new Api('здесь_вставляем_токен');

2) Далее получаем информацию о полученном от пользователя сообщении методом getWebhookUpdates() :

$message = $telegram->getWebhookUpdates()->getMessage();

В объекте $message будет содержаться вся информация о присланном сообщении и пользователе, который его прислал. Ниже описаны основные методы данного объекта. Подробную информацию можно найти в документации.

getMessageId() // уникальное id сообщения getFrom()                   // Информация о пользователе getDate()                   // Дата сообщения getChat()                   // Информация о чате, из которого отправлено сообщение getText()                   // Если прислан текстовый файл, текст сообщения getAudio()                  // Если прислан аудиофайл, информация о нем getDocument()               // Если прислан документ, информация о нем getPhoto()                  // Если прислано фото, информация о нем getSticker()                // Если прислан стикер, информация о нем getVideo()                  // Если прислано видео, информация о нем

Основные методы

Возвращает объект User, содержащий следующие методы:

getId()         // id пользователя getFirstName()  // Имя пользователя getLastName()   // Фамилия пользователя getUsername()   // Username пользователя

методы getFrom()

Возвращает объект Chat:

getId()        // id чата, из которого пришло сообщение getType()      // Тип чата - 'private', 'group', 'supergroup' или 'channel' getTitle()     // Заголовок чата (если групповой или канал) getUsername()  // Username (если приватный чат)

методы getChat()

Теперь мы можем проанализировать, что прислал нам пользователь

$text = $message->getText(); // Текст присланный пользователем $chat = $message->getChat()->getId(); // id чата с пользователем
Для сведения Как уже говорилось, в данной статье мы рассмотрим только самые простейшие примеры. О том, как сделать отдельные сложные комманды я расскажу в следующий раз.

3) Теперь мы можем определить какой тип сообщения прислал пользователь. Для простоты, ограничим возможность присылать нам только текстовые сообщения:

if(!empty($text)){  } else{     $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Для работы с ботом пришлите текстовое сообщение!' ]); }

Все дальнейшие команды будем записывать внутри блока if().

4) Каждый бот должен обязательно отвечать на две команды — /start и /help. Это — обязательное условие. Все остальные команды необязательны и могут иметь произвольное название. Опишем эти команды:

switch($text){ case '/start': $message = 'Вас приветствует бот anton-mironov.ru! Для вывода списка доступных команд введите /help'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; case '/help': $message = 'Список доступных команд: /start - начало работы с ботом /help - выводит данный список'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; default: $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Команда не распознана. Для помощи введите /help' ]); break; }

5) Добавим команду, позволяющую получать последние записи из RSS ленты сайта (не забываем добавлять команду в /help !). Обычно RSS лента представляет собой простой xml файл. На моем сайте вы можете увидеть его, открыв ссылку https://anton-mironov.ru/feed/.

Для чтения данного файла на PHP воспользуемся функцией simplexml_load_file, которая превращает xml файл в объект:

case '/rss': $url = 'https://anton-mironov.ru/feed/'; $rss = simplexml_load_file($url); $message = ''; foreach ($rss->channel->item as $item) { $message .= "xE2x9Cx85 " . date('d.m.Y', strtotime($item->pubDate)) . " " . $item->title . " link."'>читатьn"; } $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message,'parse_mode' => 'HTML', 'disable_web_page_preview' => true ]); break;

Чтение RSS ленты

Обратите внимание, в строке 6 символы xE2x9Cx85 обозначают смайлик с галочкой в байтовом представлении. Полный список таких смайликов.

В строке 8, в методе sendMessage мы используем дополнительные опции: 'parse_mode' => 'HTML' позволяет передавать внутри сообщения html теги (в данном случае ), а disable_web_page_preview указывает, что не надо загружать картинку-превью.

Результат работы после выполнения данных операций

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

Доброго времени суток! В данной статье я покажу Вам как просто можно создать Telegram-бота на PHP.

В качестве площадки для хостинга нашего бота мы будем использовать платформу Heroku, о которой я уже ранее писал статью. В качестве библиотеки для разработки бота возьмем вот эту irazasyed/telegram-bot-sdk. Но кроме нам также понадобится библиотека doctrine/annotations для удобной организации команд на которые будет реагировать бот.

Для начала нам нужно будет получить токен для бота. Для этого надо непосредственно в клиенте Telegram перейти к боту @BotFather, где набрав команду /newbot следовать инструкциям. После получения токена нам необходимо будем настроить так называемый веб-хук – URL, на который будут приходить команды, введенные пользователем в чате с ботом. Внизу ссылка в которой нужно заменить <%ТОКЕН_БОТА%> на токен Вашего бота, после чего для активации адреса нужно будет открыть его в браузере. Обратите внимание, что Telegram требует, чтобы адрес веб-хука был c настроенным SSL. К счастью, если бот размещается на Heroku, то все уже настроено и работает.

Вот сама ссылка:

https://api.bot.org/bot<%ТОКЕН_БОТА%>/setWebhook?url=https://myrusakovbot21.herokuapp.com/index.php

Все готово, теперь приступим к написанию кода – вот наш файл 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. Вот базовая струтура директорий проекта:

. ├── vendor ├── src │   ├── MainCommand.php │   └── CommandsCollector.php ├── index.php ├── composer.lock ├── composer.json └── .gitignore

Файл index.php

require __DIR__ . '/vendor/autoload.php'; use TelegramBotApi; //  в класс передаем наш токен $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; class MainCommand {     /**      * @Command(text="привет")      */     public function welcome(Api $bot, ObjectsUpdate $result)     {         $chat_id = $result["message"]["chat"]["id"];         $reply = "Информация с помощью.";         $bot->sendMessage(['chat_id' => $chat_id, 'text' => $reply]);     }     /**      * @Command(text="вакансии")      */     public function vacanciesFeed(Api $bot, ObjectsUpdate $result)     {         $reply = '';         $url = 'https://career.habr.com/vacancies/rss?currency=RUR&sort=relevance&type=all';         $chat_id = $result["message"]["chat"]["id"];         $rss = simplexml_load_file($url);         foreach ($rss->channel->item as $item) {             $reply .= "xE2x9ExA1 " . $item->title . " (link . "'>читать)n";         }         $bot->sendMessage(['chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => false, 'text' => $reply]);     }     /**      * @Command(text="fallback")      */     public function fallback(Api $bot, ObjectsUpdate $result)     {         $text = $result["message"]["text"];         $chat_id = $result["message"]["chat"]["id"];         $reply = "По запросу "$text" ничего не найдено.";         $bot->sendMessage(['chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply]);     } }

Формированием команд и их обработчиков занимается класс CommandsCollector:

use DoctrineCommonAnnotationsAnnotationReader; /**  * @Annotation  * @Target({"CLASS","METHOD"})  */ final class Command {     public $text; } 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];             }         }         return $commands;     } }

После того, как код написан – нужно его разместить на платформе 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
  • Михаил Русаков

Возможно, кто-то о нас слышал. Мы — популярное интернет-издание по программированию. Мы не только пишем статьи на тему современной разработки, но и ищем способы, как держать аудиторию в постоянной заинтересованности к тому, что мы делаем.

17 132 просмотров

Однажды мы решили, что нам нужно сделать бота. Бот должен был давать логические задачи в групповом чате в Telegram «Развиваем логику», закреплять их на то время, пока её решают, не давать новую, пока ответ кого-то из участников не наберёт десять (потом снизили до пяти) плюсов, а также вывешивать топ наиболее успешных решателей задачек.

Идея не приходит одна

Задача довольно простая, подумали мы, особенно учитывая волну популярности ботов и количество материала в сети по этой теме. Однако материала не очень качественного: кто-то не использует композер, а кто-то даже пишет весь код в одном файле-обработчике, полагая, очевидно, будто количество файлов влияет на скорость работы кода.

Сначала бот должен был просто давать задачи, причём их можно было пропускать, постоянно вызывая одну и ту же команду. Это первая проблема, которую мы стали решать. Выход нашёлся почти сразу: сохранение состояния бота (а точнее, текущей команды) в базе. Другими словами, получая команду /get, бот даёт задачу и сохраняет команду в базе.

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

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

Ну и напоследок ещё одна проблема, которую мы с успехом решили. Некоторые задачи предполагали не точное решение, а наиболее подходящее. Как в таком случае должен поступить админ и чей ответ выбрать?

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

Какое решение быстрее наберёт пять плюсов, то и выбирается ботом как лучшее. Это хорошее решение не только с точки зрения справедливости, но и автоматизации: нам больше не придётся следить за чатом и читать все ответы.

Подготовка к созданию

Дело осталось за малым: написать бота. Мы ограничились Composer, библиотекой telegram-bot-sdk и symfony/dotenv для парсинга .env-файла. Весь код приводить не буду: он большой. Посмотреть на то, что получилось, можно по ссылке.

Composer — это стандарт при разработке на PHP. Он позволяет скачивать сторонние библиотеки на проект и предоставляет удобный механизм по автозагрузке классов. Вся работа с Composer происходит через консоль и в файле composer.json. Обычно он выглядит так:

// composer.json { “require”: { “irazasyed/telegram-bot-sdk”: “3.*@dev”, “symfony/dotenv”: “^4.2” }, “autoload”: { “psr-4”: { “App\”: “src/” } } }

Если вы разрабатываете не на фреймворке, то во множестве случаев создаёте composer.json самостоятельно и заполняете секцию autoload, которая загружает ваши классы по правилу psr-4, о котором можно найти много информации в интернете.

Далее вы выполняете команду composer install, и автозагрузка начинает работать. Также не забудьте про библиотеки, которые нужно установить, для этого выполните в терминале в папке с проектом следующие две команды:

composer require irazasyed/telegram-bot-sdk composer require symfony/dotenv

И тогда ваш composer.json станет похож на тот, что я показывал выше.

Mr. Bot

Сразу же продемонстрирую готовую структуру проекта:

Файл app.php является точкой входа в наше приложение, на который мы вешаем веб-хук (это значит, что бот не будет постоянно опрашивать сервер на наличие обновлений; он их будет получать только тогда, когда они будут). Вот как он выглядит:

// app.php use AppBotCommonChatHandler; use AppBotPrivateChatHandler; use AppHandler; use AppStorageDB; use TelegramBotApi; require __DIR__ .’/vendor/autoload.php’; $settings = require __DIR__ . ‘/config/settings.php’; $api = new Api($settings[‘token’]); $bot = new Handler($api); $db = new DB($settings[‘db’]); if ($bot->getChatType() === “private”) { (new PrivateChatHandler($bot, $db))->start(); } elseif ($bot->getChatType() === “supergroup”) { (new CommonChatHandler($bot, $db))->start(); }

Ничего необычного, создаём объекты всех нужных нам классов и делаем проверку на то, в каком чате мы находимся — приватном или супергруппе. Да, разделить код на достаточно независимые части является хорошей практикой. К тому же легче рефакторить и добавлять код, когда проблемы того потребуют.

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

// .env DB_DSN=mysql:host=changeme;dbname=changeme DB_USERNAME=changeme DB_PASSWORD=changeme BOT_ADMIN=changeme TOKEN=changeme

Однако получить переменные окружения из .env можно только в том случае, если вы спарсите этот файл. Делается это крайне просто:

// config/settings.php use SymfonyComponentDotenvDotenv; $dotenv = new Dotenv(); $dotenv->loadEnv(__DIR__ . ‘/../.env’); return [ ‘db’ => [ ‘dsn’ => getenv(‘DB_DSN’), ‘username’ => getenv(‘DB_USERNAME’), ‘password’ => getenv(‘DB_PASSWORD’) ], ‘token’ => getenv(‘TOKEN’) ];

Это тот самый файл, который мы включили в app.php. Там мы просто по ключу достаём нужные нам настройки:

$settings = require __DIR__ . ‘/config/settings.php’; $settings[‘token’]; $settings[‘db’];

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

Больше томить вас кодом не буду, повторю только, что теперь он в свободном доступе.

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

Шукюров Заур, разработчик @KinomanBot и @GaidarForum_bot, написал руководство по созданию простого чат-бота.

24 июня 2015 года разработчики Telegram открыли платформу для создания ботов (программ, которые выполняют определенные действия по заданному алгоритму). За полтора года работы платформы набралось много интересных чат-ботов, решающих множество проблем и позволяющих с пользой провести время в мессенджере.

Шаг 1: регистрация бота у @BotFather

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

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

image

Результаты

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

Благодаря удобному API, боты Telegram могут стать хорошей платформой для автоматизации рутинных действий, настройки уведомлений, удобному и быстрому получению информации и созданию игр. Бесплатными площадками для продвижения могут послужить каталоги ботов Telegram Bot Store, TeleChappy или 50bots. А анализировать активность пользователей можно с помощью бесплатного инструмента для аналитики ботов от Яндекса — Botan.

От редакции

PHP — один из самых популярных языков программирования. Его легко изучать, с ним легко работать, у него мощное сообщество. 5 мая «Нетология» запускает курс «PHP/SQL: back-end разработка и базы данных», где ведущие программисты расскажут об управляющих конструкциях, циклах, функциях, о строках и массивах. Вы узнаете все про реляционные базы данных и язык запросов SQL, научитесь устанавливать и настраивать веб-сервер nginx и php, управлять базами данных различной сложности. Ждем вас!

Оцените статью

Средняя оценка 3.3 / 5. Всего проголосовало 7

image Темы: программирование

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий