В прошлый раз мы разбирали более простой способ создания бота для телеграмм, который не требовал знаний программирования т.к. использовал сторонний сервис и визуальный конструктор. Сегодня предлагаю поднять планку и поговорить о том, как написать бота для Телеграм на php (это язык программирования). Если вы не программист, то материал ниже будет вам непонятен, поэтому советую прочитать другую статью. Итак, начнем.
- Подготовка к написанию бота
- Клонирование проекта с Гитхаба
- Кодинг Telegram бота на php
- Что такое webhook?
- Обязательные команды для ботов
- Принцип работы библиотеки TelegramBotApi
- Отправка сообщения в TelegramBot API
- Отправка картинок в TelegramBot API
- Отправка документов и голосовых сообщений
- Получение сообщений из чата
- Сообщаем Botfather-у список наших команд
Подготовка к написанию бота
Прежде чем мы приступим к написанию бота, убедимся, что у нас имеется в распоряжении хостинг и домен с https, а также API токен, который нам выдал Botfather (подробнее о том, как получить API ключ для Телеграмм бота см. тут).
Обращаться к API Телеграма будем при помощи TelegramBotApi. Соответственно, чтобы клонировать проект с Гитхаба нам понадобиться Composer. Composer как правило не устанавливается без файла php.exe. Самый просто способ это исправить — установить Open Server.
Клонирование проекта с Гитхаба
Открываем командную строку, при помощи команды cd заходим в папку в которую будем устанавливать код и выполняем последовательно следующие команды:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Далее устанавливаем telegram-bot/api
php composer.phar require telegram-bot/api
Заходим в папку и убеждаемся, что все файлы успешно установлены.
Теперь данные файлы помещаем на наш хостинг в папку, в которой будет располагаться наш бот. На этом подготовка завершена — приступим к кодингу.
Кодинг Telegram бота на php
В папке с ботом создадим файл index.php в котором мы и будем писать код нашего бота. Важно! Кодировка файла — utf-8 без bom!
header('Content-Type: text/html; charset=utf-8');
// подключаемся к API
require_once("vendor/autoload.php");
// создаем переменную бота
$token = "токен, который выдал BotFather";
$bot = new \TelegramBot\Api\Client($token);
После того как мы создали переменную бота $bot, мы можем обращаться к api, но прежде нам необходимо зарегистрировать webhook.
Что такое webhook?
WebHook — это механизм по которому выполняется связка бота с telegram’ом. Когда пользователь в телеграме вводит команду, ее надо каким-то образом передавать на сервер и получать ответ. Webhook как раз для этого и нужен. Он сообщает телеграму куда передавать команды. Поскольку Телеграм НЕ ЗНАЕТ, где именно расположен код нашего бота, то нам нужно это исправить.
Для этой цели у нас существует команда: $bot->setWebhook
// если бот еще не зарегистрирован - регистрируем
if(!file_exists("registered.trigger")){
/**
* файл registered.trigger будет создаваться после регистрации бота.
* если этого файла нет существует, значит бот не
* зарегистрирован в Телеграмм
*/
// URl текущей страницы
$page_url = "https://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
$result = $bot->setWebhook($page_url);
if($result){
file_put_contents("registered.trigger",time()); // создаем файл дабы остановить повторные регистрации
}
}
Прежде чем продолжить писать код — сохраним индексный файл и запустим его в том виде, в котором он есть сейчас. После запуска в папке с ботом должен появиться еще один файл — registered.trigger. Если файла появился — значит все сделали правильно и Телеграмм знает, где лежит наш бот.
Обязательные команды для ботов
Теперь необходимо научить нашего бота реагировать на обязательные для всех ботов команды /start и /help.
// обязательное. Запуск бота
$bot->command('start', function ($message) use ($bot) {
$answer = 'Добро пожаловать!';
$bot->sendMessage($message->getChat()->getId(), $answer);
});
// помощь
$bot->command('help', function ($message) use ($bot) {
$answer = 'Команды:
/help - помощь';
$bot->sendMessage($message->getChat()->getId(), $answer);
});
// запускаем обработку
$bot->run();
Снова сохраняем индексный файл и попробуем потестировать нашего бота! Ура, все пашет! Дальнейший кодинг зависит от поставленной Вами задачи, а потому самое время поговорить о том, как устроена наша API библиотека
Принцип работы библиотеки TelegramBotApi
Команды задаются блоком:
$bot->command('start', function ($message) use ($bot) {
});
Где $message — объект Message, все его поля можно посмотреть тут — Types/Message.php
Все команды должны быть до вызова $bot->run();
, а иначе не будет работать. Т.е. $bot->run();
должен замыкать наш код.
Отправка сообщения в TelegramBot API
Отправка сообщения выполняется командой:
$bot->sendMessage(id пользователя которому отправляем, текст сообщения);
Отправка картинок в TelegramBot API
Отправка картинок осуществляется через передачу Телеграмму ссылки на эту картинку. Мессенджер самостоятельно скачивает изображение и отдает пользователю! Для примера отправим юзеру картинку если он введет команду /getpic.
// передаем картинку
$bot->command('getpic', function ($message) use ($bot) {
$pic = "http://binetmed15.beget.tech/wp-content/uploads/forbot.jpg";
$bot->sendPhoto($message->getChat()->getId(), $pic);
});
Отправка документов и голосовых сообщений
Документы, в отличие от картинок необходимо оправлять ввиде POST. К счастью, библиотека TelegramBotApi сделает все что нужно без нашего с вами участия. Сначала загрузим документ в папку с нашим ботом (см картинку ниже)
Для отправки документа используем следующий код:
// передаем документ
$bot->command('getdoc', function ($message) use ($bot) {
$document = new \CURLFile('sendfrombot.txt');
$bot->sendDocument($message->getChat()->getId(), $document);
});
Обратите внимание, что строчка
$document = new \CURLFile('sendfrombot.txt');
предполагает размещение txt-файла sendfrombot в в корневой папке бота. Однако, можно передавать в переменную и обычный урл. С передачей голосовых сообщения (войсов) ситуация аналогична:
// передаем войс
$bot->command('getvoice', function ($message) use ($bot) {
$voice = "http://binetmed15.beget.tech/wp-content/uploads/glazunov_maxim-prividenie.mp3";
$bot->sendVoice(
$message->getChat()->getId(),
$voice //,
//$duration,
//$replyToMessageId,
//$replyMarkup,
//$disableNotification
);
});
Получение сообщений из чата
Для получения данных из чата в API имеется команда .on(). С ее помощью мы можем прикрутить к нашему телеграм-боту, нейросеть для анализа сообщений или соорудитеь простенькую болталку по алгоритму Маркова, для отправки случайных сообщений в ответ на месенджы пользователя. Выглядеть это может примерно так:
// болталка
$bot->on(function($Update) use ($bot){
$message = $Update->getMessage();
$mtext = $message->getText();
$cid = $message->getChat()->getId();
if(mb_stripos($mtext,"привет бот") !== false){
$bot->sendMessage($message->getChat()->getId(), "и тебе здорова, чувак!");
}
}, function($message) use ($name){
return true; // когда тут true - команда проходит
});
Сообщаем Botfather-у список наших команд
После того как команды прописаны необходимо сообщить Botfather’у об их наличии (строго говоря это не является обязательным, но желательно все же добавить). Открываем чат с Botfather и вбиваем /setcommands (в случае опечатки используем команду /setcommands для переопределения).
Теперь потестим нашего телеграм-бота.
Как видим, все ок! Теперь вы знаете как создать своего бота на php для телеграмма. Успехов в разработке! В следующий раз мы продолжим дорабатывать нашего бота и разберем как добавить кнопки, а пока рекомендую скачать исходники текущего урока: