Старт

Bot API vs MTProto

Сравнение Bot API и MTProto: почему для PHP-ботов почти всегда нужен HTTPS/JSON, а не бинарный протокол. Пример getMe на cURL с разбором ответа.

Telegram даёт два стека: Bot API — обычный HTTPS/JSON, и MTProto — бинарный TCP-протокол, на котором работают официальные клиенты. Для 95% задач (магазины, CRM, Mini Apps, рассылки) нужен только Bot API. MTProto оправдан, если нужно читать чужие сообщения в группах, отслеживать статус «печатает» или реакции в реальном времени — то есть писать юзербота. Цена: сложная сессия, частые поломки при обновлении схемы, высокий риск бана за массовые действия.

Bot API — как это работает на PHP

Каждый метод — POST-запрос к https://api.telegram.org/bot<TOKEN>/methodName. Тело — JSON, ответ — JSON с полями ok (bool), result (объект/массив), при ошибке — error_code и description. Ниже минимальный рабочий фрагмент: получаем информацию о боте через getMe.

<?php

$token = getenv('TELEGRAM_BOT_TOKEN');
if (!$token) {
die('TELEGRAM_BOT_TOKEN не задан в окружении\n');
}

$url = "https://api.telegram.org/bot{$token}/getMe";

$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_TIMEOUT => 10,
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlErr = curl_error($ch);
curl_close($ch);

if ($curlErr) {
die("cURL error: {$curlErr}\n");
}
if ($httpCode !== 200) {
die("HTTP {$httpCode}: {$response}\n");
}

$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die("Invalid JSON: " . json_last_error_msg() . "\n");
}

if (!($data['ok'] ?? false)) {
die("API error: " . ($data['description'] ?? 'unknown') . "\n");
}

// Красивый вывод для терминала
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n";

Запустите: php getme.php. В терминале увидите структуру ответа — так вы привыкнете проверять ok и разбирать result.

{
"ok": true,
"result": {
"id": 123456789,
"is_bot": true,
"first_name": "MyBot",
"username": "mybot_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
}
}

Что смотреть: ok=true — запрос прошёл, в result лежит объект User (бот). Поля can_read_all_group_messages и supports_inline_queries показывают права бота — их задаёт BotFather. Если ok=false, смотрите error_code (401 — неверный токен, 404 — метод не существует) и description.

Сравнение для принятия решения

  • Протокол: Bot API — HTTPS/JSON (любой HTTP-клиент), MTProto — бинарный TCP (нужна спец-библиотека).
  • Авторизация: Bot API — токен от BotFather, MTProto — api_id/api_hash + файл сессии пользователя.
  • Задержка: Bot API — десятки–сотни мс (через серверы Telegram), MTProto — единицы–десятки мс (прямое соединение).
  • Доступ к данным: Bot API — только сообщения, адресованные боту (команды, упоминания, личка), MTProto — всё, что видит аккаунт.
  • Риск бана: Bot API — низкий при штатной работе, MTProto — высокий за спам, массовые инвайты, юзербот-паттерны.
  • Экосистема PHP: Bot API — чистый cURL / Guzzle / Symfony HttpClient, MTProto — нет стабильных библиотек (порт danog/MadelineProto сложен в поддержке).

Практический чек-лист: когда точно нужен Bot API

  • Бот для магазина, поддержки, рассылок, Mini App.
  • Нужен деплой на обычном хостинге / VPS без долгих процессов.
  • Команда пишет на PHP (Yii2, Laravel, чистый PHP).
  • Важно предсказуемое поведение при обновлениях Telegram.

Если пункт про «чтение чужих сообщений в группах без упоминания бота» — единственный блокер, тогда смотрите в сторону MTProto (Python/Node), но готовьтесь к поддержке сессий и миграциям схем.

В этом гайде

Дальше — только Bot API: HTTPS + cURL, getenv('TELEGRAM_BOT_TOKEN'), JSON наружу/обратно. Telegram сам обновляет протокол, ваш PHP-код не ломается. Начнём с получения токена у BotFather.

Дальше: BotFather и токен — как создать бота, получить токен и безопасно хранить его в окружении.