Содержание урока · 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. Это самое ценное сообщение в жизни вашего бота.
Отображаемое имя меняется сколько угодно раз командой /setname и может быть хоть на русском. Username — неизменяемый технический адрес, всегда латиницей и с суффиксом bot. В коде вы встретите username в bot.Self.UserName — именно его печатает лог при старте из третьего урока.
Токен телеграм бота: из чего состоит#
Токен телеграм бота — две части через двоеточие. До двоеточия — числовой ID бота: он назначен навсегда и совпадает с полем id в ответах API. После — секретная строка примерно из 35 символов латиницы, цифр, дефисов и подчёркиваний: это и есть пароль. Проверить токен, не написав ни строчки кода, можно прямо в браузере: откройте адрес api.telegram.org/botВАШ_ТОКЕН/getMe — Telegram ответит JSON с именем бота, если токен живой, и описанием ошибки Unauthorized, если нет. Тот же запрос библиотека делает при каждом запуске через NewBotAPI, поэтому битый токен вы обнаружите на старте, а не при первом сообщении. У токена нет срока действия: он работает, пока вы его не отзовёте командой /revoke. Отзыв мгновенный и необратимый — старая строка умирает в ту же секунду, новая приходит следующим сообщением от BotFather.
Токен из переменной окружения
GOpackage 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.
Запуск с переменной окружения
GOexport 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, и тамошние принципы переносятся на ботов один в один.
Отправили токен в публичный репозиторий — считайте, бота уже угнали: сканеры вылавливают паттерн вида цифры-двоеточие-секрет на 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 — описание; описание помогает человеку понять бота без чтения документации, а сами команды в коде обработаем в седьмом уроке. Центр управления — /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, завершающий процесс.
Соберите main() с токеном из окружения
Расставьте строки: от входа в программу до создания клиента бота.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Бот зарегистрирован, токен живёт в переменной окружения, описание и меню команд на месте — аккаунт готов к работе. Следующий шаг технический: в третьем уроке поставим библиотеку telegram-bot-api, вызовем NewBotAPI и увидим в логе username бота. За ним — первый работающий бот: эхо в тридцать строк, которое уже можно показывать друзьям. Если хочется параллельно освежить, как в Go устроены переменные окружения и ошибки, загляните в базовый курс — код следующих уроков опирается на него напрямую. И напоминание на дорожку: токен из переписки с BotFather переселите в .env сегодня, до первого коммита, а не после первого инцидента.
Карточки: BotFather и токен
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +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 с именем именно вашего бота.
Личные заметкиПусто
Вопросы и ответы по уроку
Что делать, если токен потерян?
Откройте /mybots, выберите бота, пункт API Token — там кнопка Revoke current token: старый токен умирает, новый приходит сообщением. Восстановить старую строку нельзя, только отозвать и перевыпустить, поэтому заранее храните токен в .env или менеджере секретов. Заодно включите двухфакторную аутентификацию на самом Telegram-аккаунте: он теперь владелец бота, и его защита важнее пароля от хостинга.
Можно ли поменять username бота?
Нет, username фиксируется при создании навсегда. Меняется только отображаемое имя через /setname. Если адрес критичен, придётся удалить бота через /deletebot и создать заново, но учтите: пользователи, ссылка и накопленные подписчики при этом теряются.
Сколько ботов можно создать на один аккаунт?
BotFather не накладывает заметного лимита на количество ботов на аккаунт — на практике хватает любого разумного числа. Разумнее другое правило: у каждого бота своя задача. Бот на все случаи жизни быстро превращается в необслуживаемый клубок команд и клавиатур.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Изучайте дальше
Следующая ступень учебного пути
Мониторинг Go с Prometheus: метрики, Grafana, алерты
Курс по метрикам в Go: Counter, Gauge, Histogram, лейблы, PromQL, Grafana-дашборды, алерты и бизнес-метрики. 25 уроков с примерами client_golang.
- Понимать четыре типа метрик и выбирать правильный
- Экспортировать метрики из Go через promhttp
- Инструментировать HTTP-запросы и бизнес-события
- Писать PromQL-запросы: rate, sum, p99