Сегодня поговорим о том, как написать бота для Телеграм на php. Материал рассчитан на программистов начального уровня, владеющих азами php. Итак, начнем.
Подготовка к написанию бота
Прежде чем мы приступим к созданию бота, убедимся в том, что в нашем распоряжении имеются хостинг, домен и SSL-сертификат для него (т.е URL начинается с https).
BotFather. Получение API токена
1. Авторизуемся в Телеграмм. Через поиск находим BotFather (https://web.telegram.org/#/im?p=@BotFather), добавляемся к нему нажав «Start»;
2. Вводим /start
3. Появится список команд, доступных для работы с этим ботом. Введём /newbot
4. Придумываем уникальное имя для нашего бота. Например arch_wood
5. Вводим уникальное имя пользователя для бота, которое обязательно должно оканчиваться на _bot. В примере выше я придумал arch_wood_bot. Если имя уже занято, вы получите сообщение «Sorry, this username is already taken. Please try something different.» Тогда придется придумать что-то другое.
6. После того как уникальное имя боту будет задано мы получим сообщение с ключем (токеном), который будет выделен красным либо синим цветом (зависит от активной цветовой схемы месенджера). Например: 314548665:AAtttG4r4OF_QzMsaZjTpvN9Mb04ttYi6GA
7. Копируем ключ. Переходим к кодингу.
Работа с TelegramBotApi
Дабы облегчить себе жизнь, взаимодействовать с 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.
Важно! Кодировка индексного 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()); // создаем файл дабы остановить повторные регистрации
}
}
Сохраняем индексный файл в том виде, в каком он есть сейчас, а после обратимся к этому файлу по прямому URL. После первого такого обращения в папке с ботом должен появиться 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();
Cохраняем индексный файл и тестировать нашего бота! Ура! Все прекрасно работает! Дальнейший кодинг зависит исключительно от стоящих перед Вами задач. Мне лишь остается ознакомить вас с общим принципом работы библиотеки TelegramBotApi.
Как работает библиотека TelegramBotApi
Все команды TelegramBotApi задаются блоком:
$bot->command('start', function ($message) use ($bot) {
...
});
Где $message — объект Message. Советую ознакомиться со всми возможными полями здесь — Types/Message.php
Второй момент. Команды перечисляются до вызова $bot->run();
, если прописать какую-то из команд ниже $bot->run();
- она не будет выполняться. Т.е. $bot->run();
должен замыкать наш код.
Отправка сообщения в TelegramBot API
Отправка сообщения выполняется командой:
$bot->sendMessage(id пользователя которому отправляем, текст сообщения);
Отправка картинок в TelegramBot API
Чтобы переслать пользователю картинку - достаточно передать ее URL. Мессенджер самостоятельно скачает, сконвертирует, а затем перешлет изображение пользователю. В качестве примера запрограммируем команду /getpic.
// передаем картинку
$bot->command('getpic', function ($message) use ($bot) {
$pic = "https://icopydoc.ru/wp-content/uploads/fortelegrambot.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 = "https://icopydoc.ru/wp-content/uploads/maxim_glazunov-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 для телеграмма. Успехов в разработке!
Алекс Аква Зооцентр - 22:16
Почему то у меня не отображаются ответы бота на сообщения и команды, хотя по уверениям @BotFather все ОК. Не передаются команды на сервер. Сам php скрипт отправляет принудительно сообщения. Где то читал, что русские сервера глушат ботов, может еще по какой причине.