Как создать Телеграм бот на php (инструкция)

В прошлый раз мы разбирали более простой способ создания бота для телеграмм, который не требовал знаний программирования т.к. использовал сторонний сервис и визуальный конструктор. Сегодня предлагаю поднять планку и поговорить о том, как написать бота для Телеграм на php (это язык программирования). Если вы не программист, то материал ниже будет вам непонятен, поэтому советую прочитать другую статью. Итак, начнем.

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

Прежде чем мы приступим к написанию бота, убедимся, что у нас имеется в распоряжении хостинг и домен с 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

Клонируем проект с гита

Заходим в папку и убеждаемся, что все файлы успешно установлены.

Телеграм бот 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. Если файла появился — значит все сделали правильно и Телеграмм знает, где лежит наш бот.

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 для телеграмма. Успехов в разработке! В следующий раз мы продолжим дорабатывать нашего бота и разберем как добавить кнопки, а пока рекомендую скачать исходники текущего урока:

Скачать исходники php-бота.

Оцените статью
Добавить комментарий