Сегодня разберемся, как написать своего простейшего телеграм бота, который будет выполнять простейшие команды пользователя в режиме чате/диалога. “Пишем боту команду, получаем ответ.”
/**/
Материалы по теме ботов в php
Смотрим , что есть в интернете по теме (на самом деле, примеров и бибилиотек доступно много).
-
Хороший простейший пример: Пишем простого чат-бота для Telegram на PHP https://habr.com/ru/company/netologyru/blog/326174/
-
Пишем бота Telegram на PHP https://code.tutsplus.com/ru/articles/how-to-start-a-telegram-bot-with-php—cms-26329
-
Библиотеки от Телеграм: https://core.telegram.org/bots/samples
Справочники по работе с API
-
Справочник по Bot API https://tlgrm.ru/docs/bots/api
-
Официальный справочник от Телеграм: Telegram Bot API https://core.telegram.org/bots/api
Предварительно: настройки ssl на сервере
Для работы телеграм ботов, на сайте д.б. настроено ssl/https соединение, для чего нужно установить ssl сертификат. Разбираемся как это сделать в моей отдельной заметке.
Или просто ставим ssl в контрольной панели вашего хостинг- провайдера, например, инструкция для Masterhost: https://masterhost.ru/support/faq/ssl/install/
Создаем свой бот (по готовому примеру)
Начнем с примера (1) от Нетологии из cсылок выше (возьмем его за основу, но адаптируем под себя)
Создаем бота в Телеграм
Регистрация проходит в 5 простых этапов:
Открываете чат с @BotFather;
Вводите или выбираете из списка команду /newbot;
Отправляете желаемое название для бота, например:
MishaikonBot
Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, NetologyRSSbot;
mishaikon_bot
По желанию можно сразу настроить полное или краткое описание, список команд и аватарку.
Пишем код
Что наш бот будет уметь
Пусть меню будет таким:
Выберите нужную команду:
/start — приветствие
/help — помощь
/about — обо мне
/soc — мои сайты и соцсети (список)
/news — последние посты из моего блога
То есть бот будет уметь показывать заданный текст и читать RSS ленту блога, выводя последние записи оттуда (заголовки со ссылками).
Создаем проект
советую все делать в PhpStorm
# create prj dir mkdir chatbot && cd chatbot # create bot file cat mishaikon_bot.php <вставляем сюда исходники, указанные ниже> # setup telegram library composer require irazasyed/telegram-bot-sdk
Библиотека с зависимостями поставилась:
Исходники кода
Основной файл с логикой бота:
<?php
/**
* Mishaikon news bot
* @see https://habr.com/ru/company/netologyru/blog/326174/
*/
ini_set("display_errors", 1);
error_reporting(E_ALL);
// Подключаем библиотеки
include('vendor/autoload.php');
use TelegramBotApi;
use TelegramBotObjectsMessage as MessageObject;
/**
* Telegram message
*/
class TgMessage {
private string $text;
private int $chat_id;
private string $fromUsername;
/**
* @param array $params
*/
public function __construct(array $params) {
// Текст сообщения
$this->text = $params["text"];
// Уникальный идентификатор чата
$this->chat_id = $params["chat"]["id"];
// message sender username
$this->fromUsername = (isset($params["from"]["username"]) ? $params["from"]["username"] : '');
}
/**
* @return int
*/
public function getChatId() {
return $this->chat_id;
}
public function getFromUserName() {
return $this->fromUsername;
}
/**
* @return mixed|string
*/
public function getText() {
return $this->text;
}
}
/**
* Bot @mishaikon_bot
*/
class MishaikonBot {
private Api $tgApi;
private array $config;
private TgMessage $msg;
/**
* Constructor
*/
public function __construct() {
// config file
$filename = basename(__FILE__);
$filename = strtok($filename, ".") . ".ini";
$this->config = parse_ini_file($filename, true);
// Устанавливаем токен
$this->tgApi = new Api($this->config['bot']['api_key']);
}
/**
* @return void
*/
public function setWebhook() {
$url = $this->config['bot']['webhook_url'];
echo "Setting webhook to '$url' ...";
$result = $this->tgApi->setWebhook(['url' => $url]);
echo "Result : ";
var_dump($result);
}
/**
* Write to debug log
* @param $this- >msg_text
* @return bool
*/
public function writeLog($msg_text) {
$filename = $this->config['common']['log_file'];
$fo = fopen($filename, "a");
if ($fo == false) {
return false;
}
$res = fwrite($fo, $msg_text . "n");
if ($res == false) {
return false;
}
$res = fclose($fo);
if ($res == false) {
return false;
}
return true;
}
/**
* @param string $reply
* @return MessageObject
* @throws TelegramBotExceptionsTelegramSDKException
*/
public function sendMsg(string $reply): MessageObject {
return $this->tgApi->sendMessage(['chat_id' => $this->msg->getChatId(), 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply]);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// ACTIONS
/**
* Show social networks list
* @return bool
* @throws TelegramBotExceptionsTelegramSDKException
*/
private function actSoc(): bool {
$reply ="<b>Мои блоги со статьями:</b> n" .
"🌎 Основной блог (фото/видео/заметки): http://www.mishaikon.ru n" .
"🌎 Живой Журнал (копия блога): https://mishaikon.livejournal.com/ n" .
"🌎 Яндекс-дзен: https://zen.yandex.ru/user/13791326 n" .
"🌎 Блог о программировании и IT: http://www.nujensait.ru nn" .
"<b>Все мои видео-ролики</b>: n" .
"🎥 Ютуб: https://youtube.com/c/mishaikon n" .
"🎥 ТикТок: https://www.tiktok.com/@mishaikon nn" .
"<b>Мои основные соцсети:</b> n" .
"📸 Вконтакте: https://vk.com/mishaikon n" .
"📸 Телеграм канал: https://t.me/mishaikon_vlog n" .
"📸 Инстаграм: http://instagram.com/mishaikon nn" .
"<b>Мои доп. соцсети</b> (копии постов): n" .
"🌎 Фейсбук: http://www.facebook.com/mishaikon n" .
"🌎 Одноклассники: https://ok.ru/profile/90610013839 n" .
"🌎 Твиттер: http://twitter.com/mishaikon n" .
"🌎 Тамблр: https://mishaikon.tumblr.com/ n";
$this->sendMsg($reply);
return true;
}
/**
* Start action
* @return bool
* @throws TelegramBotExceptionsTelegramSDKException
*/
private function actStart(): bool {
$name = $this->msg->getFromUsername(); // Юзернейм пользователя
$reply = "Приветствую, {$name}! 🙋 n" .
"Меня зовут Михаил, и это мой бот-помощник, 🤖 который поможет узнать обо мне больше.";
$this->sendMsg($reply);
return $this->actHelp();
}
/**
* @return bool
* @throws TelegramBotExceptionsTelegramSDKException
*/
private function actHelp(): bool {
$reply = "Выберите нужную команду: n" .
"/start - приветствие n" .
"/help - помощь n" .
"/about - обо мне n" .
"/soc - мои сайты и соцсети (список) n" .
"/news - последние посты из моего блога www.mishaikon.run";
$this->sendMsg($reply);
return true;
}
/**
* About me (info)
* @return bool
* @throws TelegramBotExceptionsTelegramSDKException
*/
private function actAbout(): bool {
$years_birth = floor((time() - strtotime($this->config['me']['birth_date'])) / (3600 * 24 * 365) );
$years_in_msk = floor((time() - strtotime($this->config['me']['in_msk_date'])) / (3600 * 24 * 365) );
$reply = "👋 Я Михаил. Рад знакомству ) n".
"Мне {$years_birth} лет. n".
"👶 Родился в Челябинске. n".
"🏢 Живу и работаю в Москве, последние {$years_in_msk} лет. n".
"💻 Работаю веб-программистом. n".
"🌎 Мой технический блог по IT: www.nujensait.ru n".
"✈ Люблю путешествия, спорт, блоггинг (как хобби). n".
"📝 Мой блог об активном отдыхе и тревеле: www.mishaikon.ru n".
"✍ Также пишу заметки о жизни в соцсетях, их список тут: /soc n".
//"Почитать мои заметки вы можете здесь, набрав команду /blog n".
//"Вы можете написать мне сообщение выбрав команду /msg n".
"🙋 Будем знакомы )";
$this->sendMsg($reply);
return true;
}
/**
* Show last news list
* @return bool
* @throws TelegramBotExceptionsTelegramSDKException
*/
private function actNews(): bool {
$html = simplexml_load_file('http://mishaikon.ru/rss');
$cnt = 0;
$reply = "";
foreach ($html->channel->item as $item) {
$reply .= "⦿ <b>" . $item->title . "</b>" .
" <a href='" . $item->link . "'>xE2x9ExA1</a>nn";
$cnt++;
if ($cnt > $this->config['news']['posts_limit']) {
break;
}
}
$this->sendMsg($reply);
return true;
}
/**
* Default messagges handler
* @return bool
* @throws TelegramBotExceptionsTelegramSDKException
*/
private function actDefault(): bool {
if(!$this->msg->getText()) {
$reply = "Отправьте сообщение.";
} else if (substr($this->msg->getText(), 0, 1) === '/') {
$reply = "Неизвестная команда: "<b>" . $this->msg->getText() . "</b>"";
} else {
return $this->actHelp();
}
$this->sendMsg($reply);
return true;
}
/**
* @return bool
*/
private function actMenu() : bool {
//$keyboard = [["/blog"], ["/help"]]; // Клавиатура
//$reply = "Выберите действие:";
//$reply_markup = $this->tgApi->replyKeyboardMarkup(['keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false]);
//$this->tgApi->sendMessage(['chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup]);
return true;
}
/**
* Handle message from telegram
* @return bool
* @throws TelegramBotExceptionsTelegramSDKException
*/
public function getMessage(): bool {
$input = file_get_contents('php://input');
$requestBody = (array)json_decode($input, true);
if (!isset($requestBody['message'])) {
echo "Error: Message body is empty";
return false;
}
// Передаем в переменную $result полную информацию о сообщении пользователя
$result = $this->tgApi->getWebhookUpdates();
$msg = new TgMessage($result["message"]);
$this->msg = $msg;
switch ($this->msg->getText()) {
case "/menu":
return $this->actMenu();
case "/start":
return $this->actStart();
case "/about":
return $this->actAbout();
case "/help":
return $this->actHelp();
case "/soc":
return $this->actSoc();
case "/news":
return $this->actNews();
default:
return $this->actDefault();
} // eof switch
}
}
$bot = new MishaikonBot();
$action = (isset($_GET['action']) ? $_GET['action'] : '');
switch ($action) {
case 'webhook':
$bot->setWebhook();
break;
case 'message':
$bot->getMessage();
break;
case 'test':
print "Testing ...n";
print "Write to log ...n";
$res = $bot->writeLog("Test");
echo "Result: ";
var_dump($res);
break;
default:
echo "Unknown action: " . $action;
break;
}
Все настройки вынесем в отдельный конфиг файл — mishaikon_bot.ini
(правим под себя все)
[common] log_file = 'mishaikon_bot.log' [bot] ; токен, полученный у @BotFather api_key = '726880...................K4wU' bot_name = 'mishaikon_bot' webhook_url = 'https://XXXX.ru/bots/mishaikon_bot.php?action=message' [news] posts_limit = 8 [me] birth_date = "1996-05-26" in_msk_date = "2002-05-17"
Заливаем исходники на сервер
В нашем случае, исходники разместим на своем домене, тут:
https://XXXXX.ru/bots/
Заливаем сюда в папку /bots через sftp файл mishaikon_bot.php
Привязываем вебхук
https://api.telegram.org/52255........luU?url=https://XXXXXX.ru/bots/mishaikon_bot.php?action=message
Или через консоль (то же самое):
https://XXXXXX.ru/bots/mishaikon_bot.php?action=webhook
Проверяем что все работает
Открываем диалог с ботом : https://t.me/mishaikon_bot
Пишем команды:
Заключение
Остались вопросы? Пишите в комментариях )





Нет Ответов