Старт
Первый запрос: 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 и начните обрабатывать сообщения пользователей.