Старт

Первый запрос: getMe

Первый запрос к Bot API: метод getMe для проверки токена. Разбираем ответ, типичные ошибки и как смотреть результат в терминале.

Базовый URL Bot API: https://api.telegram.org/bot<TOKEN>/<METHOD>. Самый безопасный «пинг» — метод getMe: он не шлёт сообщения пользователям, не требует chat_id и сразу показывает, жив ли токен и каков username бота. Это первый запрос, который стоит выполнить сразу после получения токена у @BotFather.

Используем функцию из прошлой главы

В главе BotFather и токен мы написали обёртку telegramApi() — здесь просто вызываем её. Короткое напоминание сигнатуры (полный код там):

<?php
// src/TelegramClient.php
function telegramApi(string $token, string $method, array $params = []): array
{
$url = 'https://api.telegram.org/bot' . $token . '/' . $method;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => $params !== [],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => $params === [] ? null : json_encode($params, JSON_UNESCAPED_UNICODE),
]);
$body = curl_exec($ch);
$code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$err = curl_error($ch);
curl_close($ch);

if ($body === false) {
throw new RuntimeException('Network error: ' . $err);
}
$data = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Invalid JSON: ' . json_last_error_msg());
}
if ($code >= 400 || empty($data['ok'])) {
throw new RuntimeException('Telegram error: ' . ($data['description'] ?? ('HTTP ' . $code)));
}
return $data['result'];
}

Вызов getMe и осмотр результата

Создайте файл first_request.php рядом с TelegramClient.php. Токен берём только из окружения — никаких хардкодов.

<?php
// first_request.php
require_once __DIR__ . '/src/TelegramClient.php';

$token = getenv('TELEGRAM_BOT_TOKEN');
if (!$token) {
fwrite(STDERR, "TELEGRAM_BOT_TOKEN не задан в окружении\n");
exit(1);
}

try {
$me = telegramApi($token, 'getMe');
// Успех — $me уже содержит result (массив User)
echo "OK\n";

// 1. Быстрый взгляд — var_dump
var_dump($me);

// 2. Красивый JSON для копирования в issue/лог
echo json_encode($me, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n";

// 3. Доступ к отдельным полям
printf("Bot: @%s (id=%d)\n", $me['username'], $me['id']);

} catch (RuntimeException $e) {
fwrite(STDERR, 'FAIL: ' . $e->getMessage() . "\n");
exit(1);
}

Пример JSON-ответа и разбор полей

Telegram возвращает обёртку с ok и result. Наша функция уже сняла обёртку и вернула result. Если бы мы смотрели «сырой» ответ:

{
"ok": true,
"result": {
"id": 123456789,
"is_bot": true,
"first_name": "My Cool Bot",
"username": "mycoolbot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false,
"can_connect_to_business": false,
"has_main_web_app": false
}
}
  • ok: true — запрос прошёл, в result лежит объект User.
  • id — уникальный числовой идентификатор бота (нужен редко, например для deep-linking tg://user?id=123456789).
  • username — публичный юзернейм без @, используйте в ссылках https://t.me/mycoolbot.
  • first_name — отображаемое имя, можно менять через BotFather (/setname).
  • can_join_groups — может ли бот быть добавлен в группы (настройка /setjoingroups).
  • can_read_all_group_messages — Privacy Mode: false = бот видит все сообщения в группе (настройка /setprivacy).
  • supports_inline_queries — включён ли Inline Mode (/setinline).
  • can_connect_to_business — может ли бот подключаться к Business-аккаунтам.
  • has_main_web_app — есть ли у бота настроенное Mini App (/setmenubutton).

Типичные ошибки и как их читать

Telegram часто отдаёт HTTP 200 даже при ошибке — всегда смотрите поле ok. Наша функция бросает исключение, если ok: false или HTTP ≥ 400.

{
"ok": false,
"error_code": 401,
"description": "Unauthorized"
}
  • 401 Unauthorized — токен неверен, отозван через /revoke или содержит непечатные символы (пробел в конце, BOM, перенос строки). Проверьте: var_dump($token) — длина ~46 символов, формат 123456:ABC-DEF....
  • 400 Bad Request — неверный метод (опечатка в имени) или битый JSON в теле запроса.
  • 429 Too Many Requests — превышен лимит вызовов (30 req/s на токен). В заголовке ответа Retry-After указано секунд ожидания. Наш клиент пока не обрабатывает ретраи — добавим в главе Production: очередь и retries.
  • Network error / curl error — нет интернета, DNS, блокировка Роскомнадзором (нужен прокси/VPN на сервере).

Как проверить в терминале

$ export TELEGRAM_BOT_TOKEN=123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
$ php first_request.php
OK
array(8) {
["id"]=>
int(123456789)
["is_bot"]=>
bool(true)
["first_name"]=>
string(11) "My Cool Bot"
["username"]=>
string(10) "mycoolbot"
...
}
{
"id": 123456789,
"is_bot": true,
"first_name": "My Cool Bot",
"username": "mycoolbot",
...
}
Bot: @mycoolbot (id=123456789)

Если видите FAIL: Unauthorized — проверьте .env, нет ли BOM, кавычек или переносов строки. getenv() вернёт false, если переменная не задана. Убедитесь, что токен не попал в git — добавьте .env в .gitignore.

Дальше: получите апдейты через getUpdates и начните обрабатывать сообщения пользователей.