Старт

BotFather и токен

Создание бота через @BotFather, получение и безопасное хранение токена в PHP, проверка токена методом getMe с разбором JSON-ответа.

@BotFather — официальный бот Telegram для создания и настройки ботов. Без него у вас не будет API-токена, а значит — нет доступа к Bot API.

Создание бота: пошагово

  1. Откройте Telegram → найдите @BotFather (с галочкой верификации).
  2. Отправьте команду /newbot.
  3. Введите отображаемое имя (любое, до 64 символов, видно пользователям в чате).
  4. Введите username — уникальный, латиница, цифры, подчёркивание, обязательно заканчивается на bot (например: my_shop_bot).
  5. 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.

Что делать, если токен утек

  1. В BotFather отправьте /revoke → выберите бота → подтвердите. Старый токен мгновенно станет недействительным.
  2. Скопируйте новый токен из ответа BotFather.
  3. Обновите .env / переменные окружения на сервере.
  4. Перезапустите воркеры / перезагрузите 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 — разбор ответа и проверка токена