telegram bot api - Как сделать телегам-бота на PHP (Symfony 4)
Primary tabs
(статья будет дополняться)
Бот Telegram
Что же это такое? Если вопрос стоит так, то вам сюда.
С помощью Telegram-ботов сегодня можно обрабатывать сообщения и медиа-контент, работать со сторонними сервисами, организовывать опросы и даже проводить платежи. Давайте разберёмся, как написать своего телеграм-бота на PHP.
Регистрация
Для начала нужно зарегистрировать своего бота. Об этом на просторах интернета написано много статей, которые достаточно полно объясняют, как это сделать, например:
А вот официальная документация от Telegram:
Webhook (обновление данных)
Как настроить и проверить, напишу здесь.
И далее наконец-то буду выкладывать свой вариант PHP-кода.
PHP
Для общения с Telegram-ботом можно использовать библиотеки, напрмер:
Но мы не ищем лёгких путей, поэтому пишу всё руками. Возможно, так будет нагляднее.
Логгирование
Начнём с печального. Логи ошибок, к сожалению, достать невозможно. Единственное, что можно предложить - возможность ручного дампа. Записываем данные, которые нужно проверить в файл:
// ... file_put_contents($this->getProjectDir().'/var/log/telegram.log', 'гет проджект дир'); // ...
В данном случае, происходит проверка, пишутся ли логи в файл telegram.log (предварительно создайте его), но в качестве второго аргумента вы можете передать что угодно.
Принимаем request
При настройке бота мы определили путь (route), на который будет поступать вся информация от Telegram API. У меня это /telegram. (Использую Symfony 4, путь прописываю в аннотации метода контроллера).
Контроллер будет выглядеть так:
// src/Controller/TelegramController.php
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class TelegramController
{
/**
* @Route("/telegram", name="telegram")
*
* @param Request $request
*
* @return JsonResponse
*/
public function telegram(Request $request): JsonResponse {
$result = json_decode($request->getContent(), true);
// ...
return $response;
}Достаём данные
Ну и сразу достаём данные, которые передаёт Telegram API так. Будьте внимательны :) В зависимости от того, какие данные вы ожидаете, массив получаемый данных будет разный.
Роутинг
С помощью switch или elseif перебираем варианты текта сообщений, приходящих нам в Request-е и создаём индивидуальный $response:
switch ($text) :
case '/start':
$responseBody = $startCommandHandler->getResponseBody($telegramId, $chatId);
break;
case 'Анкета':
$responseBody = $worksheetCommandHandler->getResponseBody($telegramId, $chatId);
break;
case 'Отменить':
$responseBody = $cancelCommandHandler->getResponseBody($telegramId, $chatId);
break;
case '/help':
$responseBody = $helpCommandHandler->getResponseBody($chatId);
break;
default:
$responseBody = $defaultHandler->getResponseBody($telegramId, $chatId);
endswitch;
return new JsonResponse($responseBody);Отправляем ответ
Следующий этап - ответ, который мы посылаем API:
// ..
if ($text) {
if ($text == '...') {
// здесь может быть код, если нужно что-то сделать перед ответом
$response = new JsonResponse([
'method' => '...',
// также передаём здась другие аргументы, которые ожидает конкретный метод
]);
} elseif ($text == '...') {
$response = new JsonResponse([
'method' => '...',
]);
} else {
$response = new JsonResponse([
'method' => '...',
]);
}
}
return $response;Методы - варианты response-ов (примеры кода)
Подробнее о действиях (методах), которые может прочитать Telegram API:
- Отправить сообщение. sendMessage()
- Вывести кнопки. sendMessage()
Вот и всё
Слепите всё вместе и получите рабочую модель telegram-bot-а. Логику обработки различных данных, приходящих от telegram API можно выделить в отдельные сервисы, логику формирования response тоже. Тогда вы получите более или менее красивую картинку)
Удачной разработки!♥
Источники
- Log in to post comments
- 14917 reads
vedro-compota
Wed, 02/21/2018 - 19:28
Permalink
file_put_contents(
почему логгер сифони не используете?
_____________
матфак вгу и остальная классика =)
melisa
Thu, 02/22/2018 - 12:03
Permalink
Потому что мой ответ не
Потому что мой ответ не выводится непосредственно в браузере или где-либо ещё, а передаётся API Telegram для дальнейшей обработки. В частности даные, которые мы передаём, вызывают ту или иную функцию API Telegram, которая уже формирует вывод. Соответственно, результат стандартного для Symfony dump() мы просто не увидим.