---
title: "BotFather: создаем бота и получаем токен"
description: "BotFather и создание бота: команда /newbot, имя и username с суффиксом bot, формат токена телеграм бота, хранение в переменной окружения и отзыв при утечке."
course: "Telegram-боты на Go: от эха до полноценного сервиса"
url: "https://golangmaster.ru/courses/telegram-bot/lessons/02-botfather-i-token/"
published: "2026-09-19"
updated: "2026-09-25"
minutes: 16
---

# BotFather: создаем бота и получаем токен

*Курс «Telegram-боты на Go: от эха до полноценного сервиса», урок 2 из 25. ~16 минут. Обновлено 25.09.2026. Источник: https://golangmaster.ru/courses/telegram-bot/lessons/02-botfather-i-token/*

BotFather — создание бота за три минуты: официальный бот Telegram выдаёт токен, ставит имя, описание и аватар. Разберём /newbot по шагам, формат токена телеграм бота, безопасное хранение и немедленный отзыв при утечке.

Папка проекта создана, Go установлен, идея сформулирована — не хватает аккаунта. Регистрацией ботов занимается BotFather: наберите в поиске Telegram @BotFather, рядом с именем будет галочка verified. Это такой же бот, только системный — штаб-квартира всех остальных: он выдаёт токены, ставит аватарки и описания, собирает меню команд и отзывает доступ, если токен утёк. Общение с ним — текстовые команды со слэшем: /newbot, /mybots, /setdescription. Никаких веб-панелей, форм и капч: создали бота — получили строку токена, а вся остальная настройка тоже текстовая. BotFather не берёт денег и не требует ничего кроме аккаунта Telegram: создание бота бесплатно, и лимитов на старте хватает с любым запасом. В этом уроке пройдём путь от /newbot до связки токен-в-переменной-окружения, разберём, из чего состоит токен телеграм бота и почему его место — в чём угодно, кроме исходников.

### BotFather: создание бота через /newbot

Откройте чат с BotFather и отправьте /newbot. Дальше два вопроса. Первый: name — отображаемое имя, которое видно в списке чатов; здесь любой язык, пробелы и эмодзи, например Гомастер Помощник. Второй: username — уникальный адрес бота в t.me, и вот тут правила жёсткие: только латиница, цифры и подчёркивания, от 5 до 32 символов, и обязательно суффикс bot на конце — без учёта регистра. MyHelper_bot пройдёт, MyHelper — нет, а GoMaster_bot окажется занят в эту же секунду кем-то на другом конце планеты. Username не меняется после создания: он становится частью ссылки t.me/MyHelper_bot и остаётся с ботом навсегда, поэтому выбирайте так, чтобы не пришлось краснеть перед работодателем. Если имя занято, BotFather сухо предложит подумать ещё. В конце он пришлёт сообщение с токеном — длинную строку, похожую на официальный пример из документации: 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw. Это самое ценное сообщение в жизни вашего бота.

> **name и username — разные вещи.** Отображаемое имя меняется сколько угодно раз командой /setname и может быть хоть на русском. Username — неизменяемый технический адрес, всегда латиницей и с суффиксом bot. В коде вы встретите username в bot.Self.UserName — именно его печатает лог при старте из третьего урока.

### Токен телеграм бота: из чего состоит

Токен телеграм бота — две части через двоеточие. До двоеточия — числовой ID бота: он назначен навсегда и совпадает с полем id в ответах API. После — секретная строка примерно из 35 символов латиницы, цифр, дефисов и подчёркиваний: это и есть пароль. Проверить токен, не написав ни строчки кода, можно прямо в браузере: откройте адрес api.telegram.org/botВАШ_ТОКЕН/getMe — Telegram ответит JSON с именем бота, если токен живой, и описанием ошибки Unauthorized, если нет. Тот же запрос библиотека делает при каждом запуске через NewBotAPI, поэтому битый токен вы обнаружите на старте, а не при первом сообщении. У токена нет срока действия: он работает, пока вы его не отзовёте командой /revoke. Отзыв мгновенный и необратимый — старая строка умирает в ту же секунду, новая приходит следующим сообщением от BotFather.

### Токен из переменной окружения

```go
package main

import (
        "log"
        "os"

        tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

func main() {
        token := os.Getenv("BOT_TOKEN")
        if token == "" {
                log.Fatal("BOT_TOKEN не задан: export BOT_TOKEN=...")
        }

        bot, err := tgbotapi.NewBotAPI(token)
        if err != nil {
                log.Panic(err)
        }

        log.Printf("бот %s готов к работе", bot.Self.UserName)
}
```

os.Getenv читает переменную окружения, заданную при запуске; если она пустая, log.Fatal печатает сообщение и завершает процесс с ненулевым кодом выхода — продолжать не с чем. NewBotAPI внутри делает запрос getMe: на живой токен отвечает данными бота, на битый — ошибкой Unauthorized. bot.Self.UserName — username бота, тот же, что придумывали в BotFather.

### Запуск с переменной окружения

```go
export BOT_TOKEN="110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw"

go run main.go
```

Переменная окружения живёт до конца сессии терминала: экспортировали — запустили — токен виден программе через os.Getenv, но отсутствует в файлах проекта. Для постоянной прописки строку export добавляют в профиль шелла или держат токен в файле .env рядом с проектом, добавленном в .gitignore.

### Где хранить токен телеграм бота

Хардкод в main.go ломается на первом git add. История коммитов вечна: удалите строку из файла — она останется в прошлых коммитах, а если репозиторий успел стать публичным, токен уже считан ботами-сканерами. Рабочие варианты по возрастанию сложности. Локально: переменная окружения — export BOT_TOKEN=110201543:AAH... перед go run, или файл .env, добавленный в .gitignore и читаемый на старте. В команде: тот же .env в менеджере секретов или закрытом канале, но не в общем чате проекта. На VPS: секция Environment в unit-файле systemd или отдельный файл через EnvironmentFile. Логика везде одна: код знает только имя переменной, значение живёт на машине запуска. Проверить себя просто: git status не должен показывать .env в списке файлов, а поиск по репозиторию на первые цифры токена должен возвращать пустоту — двухминутная привычка, которая однажды спасёт продакшен. Если храните конфиги библиотекой вроде viper, у неё есть и переменные окружения, и файлы — связка командной строки, файлов и секретов разобрана в курсе про [Cobra](/courses/cobra/), и тамошние принципы переносятся на ботов один в один.

> **Токен утёк: счёт идёт на минуты.** Отправили токен в публичный репозиторий — считайте, бота уже угнали: сканеры вылавливают паттерн вида цифры-двоеточие-секрет на git-хостингах быстрее, чем вы допишете сообщение коммита. Злоумышленник может читать входящие, писать вашим подписчикам и перенаправить доставку обновлений на свой сервер. Действия в порядке срочности: /revoke в BotFather (или /mybots, затем API Token и Revoke current token) — старый токен умирает мгновенно; вставьте новый в переменную окружения на всех машинах; только потом чистите репозиторий и историю. Сам факт утечки не откатить, но пять минут реакции сохраняют бота и его аудиторию.

### Что сломалось: staging и прод на одном токене

Классический инцидент второй недели: разработчик поднял локальную копию бота для отладки, не убрав продакшен-токен из .env, и оба процесса начали жить одной жизнью — точнее, половиной. Long polling отдаёт каждое обновление только одному получателю: сообщения распределялись между локальным отладчиком и продом в случайном порядке, пользователи получали ответы через раз, а отладчик видел чужие данные реальных людей. Диагноз ставится за минуту: getMe отвечает одинаково — значит, токен один. Лечение: /revoke и развод по окружениям — у staging свой бот с username вроде MyHelper_dev_bot и своим .env. Правило короткое: один токен — один процесс, и стажинговый секрет никогда не копируется в прод, даже «на пять минут посмотреть».

### Настройка бота: описание, аватар и команды

Свежий бот выглядит голым: без описания и аватара, с пустым профилем. BotFather закрывает и это. /setdescription — текст, который пользователь видит в пустом чате до нажатия Start: одна-две строки о том, что бот делает и с чего начать, — фактически ваш лендинг в двух предложениях. /setabouttext — фраза в профиле бота. /setuserpic — аватар. /setcommands — список команд, который Telegram показывает в меню слева от поля ввода: каждая строка вида command — описание; описание помогает человеку понять бота без чтения документации, а сами команды в коде обработаем в [седьмом уроке](/courses/telegram-bot/lessons/07-komandy-bota/). Центр управления — /mybots: список ваших ботов и меню настроек каждого, включая API Token, где живут кнопка Revoke и настройки платежей. Вернитесь в /mybots всякий раз, когда забудете, где что меняется: это панель администратора, притворяющаяся чатом.

### Команды BotFather, которые пригодятся в курсе

- /newbot — создание бота: имя, username, выдача токена.
- /mybots — панель управления: список ботов, настройки, токен, отзыв.
- /setname и /setdescription — отображаемое имя и приветствие в пустом чате.
- /setuserpic — аватар бота.
- /setcommands — меню команд в интерфейсе Telegram.
- /setprivacy — видимость сообщений в группах: по умолчанию бот слышит не всё.
- /revoke — отзыв токена: мгновенно и необратимо, старая строка перестаёт работать.

Ещё одна настройка, о которой узнают поздно и с болью, — приватность в группах. По умолчанию бот в группе видит не все сообщения, а только команды, адресованные ему, ответы на его сообщения и служебные события — это /setprivacy в режиме Enabled. Текущее состояние проверяется в /mybots: Bot Settings, затем Group Privacy — туда же придётся заглянуть, когда бот переедет в командные чаты. Для бота-модератора, который должен читать весь чат, приватность придётся выключить, и сделать это лучше до отладки: половина жалоб почему бот меня игнорирует лечится именно здесь. В приватных диалогах правило другое и жёстче: бот не может написать человеку первым. Пока пользователь не нажал Start, sendMessage от бота к нему уходит с ошибкой Forbidden: bot was blocked by the user. Отсюда дизайн рассылок и напоминаний в конце курса: сначала Start, потом право писать — это не прихоть, а фундаментальное ограничение Bot API.

### Проверка: правила username

**Вопрос:** Какой username из перечисленных BotFather примет?

- ГоБот
- ✅ gomaster-bot-2025
- MyHelper
- bot_gomaster

Правила username: только латиница, цифры и подчёркивания, от 5 до 32 символов, и суффикс bot именно на конце. ГоБот — кириллица, MyHelper — нет суффикса, а bot_gomaster заканчивается не тем, чем нужно. Ещё нюанс: подчёркивание — единственный допустимый разделитель, дефисы в username запрещены.

### Проверка: реакция на утечку

**Вопрос:** Токен попал в публичный репозиторий. Первое действие?

- Удалить строку из кода и закоммитить
- Переименовать бота через /setname
- ✅ Немедленно /revoke в BotFather и заменить токен на машинах
- Написать в поддержку Telegram

Удаление строки из текущей версии не убирает токен из истории коммитов, а переименование не меняет секрет. Отзыв — единственное мгновенное лекарство: старый токен умирает сразу, новый приходит следующим сообщением BotFather. Поддержка отвечает за часы, а сканеры работают за минуты — не в вашу пользу.

### Что будет с испорченным токеном

```go
token := "110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw"
token = token[:9] + "X" + token[10:]

bot, err := tgbotapi.NewBotAPI(token)
if err != nil {
        log.Panic(err)
}
```

**Что выведет программа?**

- Бот запустится: важен только ID до двоеточия
- ✅ log.Panic с ошибкой Unauthorized: getMe не принял токен
- Программа зависнет в ожидании сети
- Бот запустится, но не получит обновления

Секретная часть проверяется целиком: NewBotAPI делает getMe, Telegram на неверный токен отвечает 401 Unauthorized, и программа паникует на старте. Важно, что это происходит до любых сообщений: конфигурационную ошибку лучше обнаружить в первую секунду.

### Восстановите чтение токена

Впишите пакет переменных окружения, функцию чтения и вариант log, завершающий процесс.

```go
package main

import (
        "log"
        "___"

        tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

func main() {
        token := os.___("BOT_TOKEN")
        if token == "" {
                log.___("BOT_TOKEN не задан")
        }

        bot, err := tgbotapi.NewBotAPI(token)
        if err != nil {
                log.Panic(err)
        }
}
```

Подсказка: Переменные окружения читает пакет os функцией Getenv; log.Fatal печатает сообщение и завершает процесс.

Правильные ответы в пропусках: `os`, `Getenv`, `Fatal`

### Соберите main() с токеном из окружения

Расставьте строки: от входа в программу до создания клиента бота.

Правильный порядок строк:

1. `func main() {`
2. `token := os.Getenv("BOT_TOKEN")`
3. `if token == "" { log.Fatal("пустой токен") }`
4. `bot, err := tgbotapi.NewBotAPI(token)`
5. `if err != nil { log.Panic(err) }`
6. `}`

Бот зарегистрирован, токен живёт в переменной окружения, описание и меню команд на месте — аккаунт готов к работе. Следующий шаг технический: в [третьем уроке](/courses/telegram-bot/lessons/03-ustanovka-telegram-bot-api/) поставим библиотеку telegram-bot-api, вызовем NewBotAPI и увидим в логе username бота. За ним — [первый работающий бот](/courses/telegram-bot/lessons/04-pervyj-bot-echo/): эхо в тридцать строк, которое уже можно показывать друзьям. Если хочется параллельно освежить, как в Go устроены переменные окружения и ошибки, загляните в [базовый курс](/courses/go-basics/) — код следующих уроков опирается на него напрямую. И напоминание на дорожку: токен из переписки с BotFather переселите в .env сегодня, до первого коммита, а не после первого инцидента.

### Карточки: BotFather и токен

- **BotFather** — Официальный бот Telegram для управления ботами: создание /newbot, выдача и отзыв токенов, описание, аватар, меню команд. Панель — /mybots.
- **Username бота** — Уникальный адрес t.me/...: латиница, цифры, подчёркивания, 5-32 символа, обязательно заканчивается на bot. Не меняется после создания.
- **Токен** — Строка вида 123456:AAHdq...: числовой ID бота, двоеточие, секретная часть из примерно 35 символов. Полная замена логина и пароля; отзывается /revoke.
- **/newbot** — Команда создания бота: BotFather спрашивает name на любом языке и username с суффиксом bot, затем выдаёт токен.
- **/revoke** — Отзыв текущего токена: мгновенно и необратимо. Первое действие при любой утечке, до чистки репозитория.
- **getMe** — Метод Bot API, возвращающий данные бота по токену. Им библиотека проверяет токен при запуске; им же проверяют токен браузером.

## Коротко: что запомнить

- Создание бота — это /newbot в BotFather: name на любом языке и username из латиницы с суффиксом bot, навсегда.
- Токен вида 123456:AAHdq... — ID и секрет через двоеточие; это единственный ключ к боту, логинов и паролей у ботов нет.
- Живость токена проверяется getMe — браузером вручную или автоматически в NewBotAPI при каждом старте.
- Место токена — переменная окружения или .env вне git: в истории коммитов секреты не умирают.
- Утечка лечится только /revoke: старый токен умирает мгновенно, новый приходит сообщением от BotFather.
- В группах по умолчанию работает privacy mode, а в личке бот не пишет первым — ждём Start.

## Домашнее задание

Заведите бота для курса: /newbot, придумайте имя и username с суффиксом bot, сохраните токен в файл .env рядом с проектом и добавьте .env в .gitignore — строго до первого коммита. Заполните /setdescription двумя строками о назначении бота и пропишите через /setcommands три команды: start, help и одну свою. Проверьте токен браузером через getMe и убедитесь, что Telegram отвечает JSON с именем именно вашего бота.

## Вопросы и ответы по уроку

### Что делать, если токен потерян?

Откройте /mybots, выберите бота, пункт API Token — там кнопка Revoke current token: старый токен умирает, новый приходит сообщением. Восстановить старую строку нельзя, только отозвать и перевыпустить, поэтому заранее храните токен в .env или менеджере секретов. Заодно включите двухфакторную аутентификацию на самом Telegram-аккаунте: он теперь владелец бота, и его защита важнее пароля от хостинга.

### Можно ли поменять username бота?

Нет, username фиксируется при создании навсегда. Меняется только отображаемое имя через /setname. Если адрес критичен, придётся удалить бота через /deletebot и создать заново, но учтите: пользователи, ссылка и накопленные подписчики при этом теряются.

### Сколько ботов можно создать на один аккаунт?

BotFather не накладывает заметного лимита на количество ботов на аккаунт — на практике хватает любого разумного числа. Разумнее другое правило: у каждого бота своя задача. Бот на все случаи жизни быстро превращается в необслуживаемый клубок команд и клавиатур.
