Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 2 из 25 ~16 мин +20 XP

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

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

Содержание урока · 9 разделов

Папка проекта создана, 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. Это самое ценное сообщение в жизни вашего бота.

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

Токен телеграм бота — две части через двоеточие. До двоеточия — числовой 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, и тамошние принципы переносятся на ботов один в один.

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

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

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

Свежий бот выглядит голым: без описания и аватара, с пустым профилем. BotFather закрывает и это. /setdescription — текст, который пользователь видит в пустом чате до нажатия Start: одна-две строки о том, что бот делает и с чего начать, — фактически ваш лендинг в двух предложениях. /setabouttext — фраза в профиле бота. /setuserpic — аватар. /setcommands — список команд, который Telegram показывает в меню слева от поля ввода: каждая строка вида command — описание; описание помогает человеку понять бота без чтения документации, а сами команды в коде обработаем в седьмом уроке. Центр управления — /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 примет?

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

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

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

Прочитайте код и выберите, что он выведет:

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

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

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

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

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) } }

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

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

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Бот зарегистрирован, токен живёт в переменной окружения, описание и меню команд на месте — аккаунт готов к работе. Следующий шаг технический: в третьем уроке поставим библиотеку telegram-bot-api, вызовем NewBotAPI и увидим в логе username бота. За ним — первый работающий бот: эхо в тридцать строк, которое уже можно показывать друзьям. Если хочется параллельно освежить, как в Go устроены переменные окружения и ошибки, загляните в базовый курс — код следующих уроков опирается на него напрямую. И напоминание на дорожку: токен из переписки с BotFather переселите в .env сегодня, до первого коммита, а не после первого инцидента.

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

Термин

BotFather

нажмите, чтобы перевернуть
Определение

Официальный бот Telegram для управления ботами: создание /newbot, выдача и отзыв токенов, описание, аватар, меню команд. Панель — /mybots.

1 / 6

Песочница урока

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.

Вывод

Запустите код, чтобы увидеть вывод.

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

  • Создание бота — это /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 с именем именно вашего бота.

Личные заметкиПусто
Хранятся только в вашем браузере (Telegram · BotFather: создаем бота и получаем токен)

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

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

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

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

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

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

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

Термины урока

Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.

Следующая ступень учебного пути

Prometheus25 уроков~12 чпрактика25 уроков уже доступны

Мониторинг Go с Prometheus: метрики, Grafana, алерты

Курс по метрикам в Go: Counter, Gauge, Histogram, лейблы, PromQL, Grafana-дашборды, алерты и бизнес-метрики. 25 уроков с примерами client_golang.

  • Понимать четыре типа метрик и выбирать правильный
  • Экспортировать метрики из Go через promhttp
  • Инструментировать HTTP-запросы и бизнес-события
  • Писать PromQL-запросы: rate, sum, p99