Старт
BotFather и токен
Создание бота через @BotFather, получение и безопасное хранение токена в PHP, проверка токена методом getMe с разбором JSON-ответа.
@BotFather — официальный бот Telegram для создания и настройки ботов. Без него у вас не будет API-токена, а значит — нет доступа к Bot API.
Создание бота: пошагово
- Откройте Telegram → найдите
@BotFather(с галочкой верификации). - Отправьте команду
/newbot. - Введите отображаемое имя (любое, до 64 символов, видно пользователям в чате).
- Введите username — уникальный, латиница, цифры, подчёркивание, обязательно заканчивается на
bot(например:my_shop_bot). - BotFather ответит сообщением с HTTP API token вида
123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw.
Анатомия токена
Токен состоит из двух частей, разделённых двоеточием:
123456789— числовой ID бота (тот же, что вернётgetMeв полеid).AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw— секретный ключ авторизации.
Никогда не публикуйте токен целиком. В логах и скриншотах маскируйте вторую часть: 123456789:AAH***.
Хранение токена в PHP-проекте
Правило: токен живёт только в переменных окружения или в локальном конфиге, который не попадает в Git.
# .env (пример, не коммитить)
TELEGRAM_BOT_TOKEN=123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
<?php
// config/bootstrap.php или начало скрипта
$token = getenv('TELEGRAM_BOT_TOKEN');
if ($token === false || $token === '') {
throw new RuntimeException('TELEGRAM_BOT_TOKEN is not set. Check .env or server env.');
}
// Базовая валидация формата (не гарантирует валидность, но отсекает опечатки)
if (!preg_match('/^\d+:[A-Za-z0-9_-]{35}$/', $token)) {
throw new RuntimeException('TELEGRAM_BOT_TOKEN has invalid format');
}
echo "Token loaded, bot ID: " . explode(':', $token)[0] . PHP_EOL;
Запустите в терминале: php config/bootstrap.php — должны увидеть Token loaded, bot ID: 123456789. Если исключение — проверьте .env и php -i | grep -i env.
Что делать, если токен утек
- В BotFather отправьте
/revoke→ выберите бота → подтвердите. Старый токен мгновенно станет недействительным. - Скопируйте новый токен из ответа BotFather.
- Обновите
.env/ переменные окружения на сервере. - Перезапустите воркеры / перезагрузите PHP-FPM / передеплойте контейнер.
Полезные команды BotFather (шпаргалка)
/setdescription— описание бота (до 512 символов, видно в профиле)./setabouttext— текст «О боте» (до 120 символов, под именем)./setuserpic— аватар (картинка 640×640, PNG/JPG)./setcommands— список команд для меню (формат:command - Description, по одной на строку)./setdomain— домен для Telegram Login Widget и Mini App./setmenubutton— кнопка меню для запуска Mini App./deletebot— безвозвратно удалить бота.
Проверка токена кодом (используем обёртку из прошлой главы)
В главе Bot API vs MTProto мы написали функцию telegramApi() — здесь просто вызываем её для метода getMe.
<?php
require_once __DIR__ . '/config/bootstrap.php'; // загрузили $token
require_once __DIR__ . '/src/TelegramClient.php'; // там функция telegramApi()
$response = telegramApi($token, 'getMe');
// Как посмотреть результат в терминале:
print_r($response);
// или для JSON-красоты:
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
Ожидаемый успешный ответ API:
{
"ok": true,
"result": {
"id": 123456789,
"is_bot": true,
"first_name": "My Shop",
"username": "my_shop_bot",
"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.id— числовой ID бота (должен совпадать с первой частью токена).result.username— ваш username без @, используйте в deep-links и коде.result.can_read_all_group_messages—falseпо умолчанию; включите через/setprivacyв BotFather, если бот должен видеть все сообщения в группах.
Типичные ошибки (поле ok: false):
401 Unauthorized+description: "Unauthorized"— токен неверен или отозван.400 Bad Request+description: "Bad Request: chat not found"— не относится кgetMe, но встретится позже при отправке сообщений.
Если видите ok: true — поздравляю, бот готов к работе. Дальше научимся получать обновления от пользователей.
Дальше: Первый запрос: getMe — разбор ответа и проверка токена