Содержание урока · 10 разделов
Представьте: идея сервиса есть, пользователи поняли, а вёрстки, деплоя и базы данных на старте нет — и не нужно. Интерфейсом становится сам Telegram: люди пишут боту в привычном чате, ваш код получает текст и отвечает. Бот — это специальный аккаунт Telegram, которым управляет программа, а не человек: у него нет телефона и сим-карты, в профиле стоит пометка bot, а общение с внешним миром идёт через Telegram Bot API — набор HTTP-методов на api.telegram.org. Для новичка это благодарнейший формат первого проекта: за один вечер бот отвечает реальным людям, и результат видно в телефоне, а не только в консоли. Для опытного разработчика бот — быстрый способ сделать внутренний ассистент: уведомления о деплое, дежурства, заявки из формы, оповещения о падении сервера. В этом уроке разберём, что умеет Bot API, почему боты на golang стали массовым выбором для таких задач и как построен курс, который вы начали.
Что такое бот с точки зрения Telegram#
Со стороны пользователя бот почти не отличается от собеседника: тот же чат, те же сообщения, стикеры и кнопки. Под капотом разница принципиальная. Бот — это учётная запись, чьё поведение полностью определяется токеном и программой, которая с этим токеном ходит в API. Человек получает сообщения, когда Telegram доставляет их на телефон; бот получает обновления, когда ваша программа спрашивает сервер Telegram: что нового? Каждое событие — входящее сообщение, нажатие кнопки, подписка на канал, редактирование текста — приезжает в программу как объект Update. Внутри Update лежит Message с текстом, автором (поле From) и чатом (Chat) — тем самым chat_id, по которому бот знает, куда отвечать. Дальше программа решает, что с этим делать, и отправляет ответ отдельным HTTPS-запросом. Всё. Ни сырых сокетов, ни собственного протокола: HTTPS и JSON, аккуратно завёрнутые в библиотеку из третьего урока курса. Библиотека лишь упаковывает этот обмен в типы: вы работаете со структурами Go, а не с сырыми JSON-строками, и компилятор ловит половину ошибок ещё до запуска. Кто хочет заглянуть глубже, увидит весь обмен глазами библиотеки, включив Debug-режим из третьего урока.
Telegram Bot API: обзор возможностей#
Прежде чем писать код, посмотрим на карту: telegram bot api обзор возможностей помогает заранее понять, где бот — правильное решение, а где честнее сделать сайт или мобильное приложение. Поверхность API большая, но устроена единообразно: метод HTTPS-запроса, на вход JSON, на выход JSON с готовыми объектами. Одни методы отправляют — sendMessage, sendPhoto, sendDocument; другие получают — getUpdates, getMe; третьи настраивают бота — setMyCommands, setWebhook. Имена говорящие и построены по одной схеме: send — отправить, get — получить, set — настроить, delete — откатить настройку; этого словаря хватает на весь справочник, и после пары недель работы вы угадываете имя метода до чтения документации. В курсе мы пройдём основные группы по возрастанию сложности, а полный справочник живёт на core.telegram.org — библиотека лишь оборачивает его методы в структуры Go, поэтому после курса официальная документация читается как продолжение этого сайта.
Что умеет Bot API из коробки#
- Текст с форматированием: жирный, курсив, моноширинный код и ссылки — HTML или Markdown в поле ParseMode.
- Клавиатуры: reply-кнопки под полем ввода и inline-кнопки прямо в сообщении с callback-запросами.
- Файлы: фото, видео, голосовые, документы и стикеры — отправка и получение в обе стороны.
- Команды и меню: /start, /help и собственное меню команд в интерфейсе Telegram.
- Группы и каналы: модерация, закрепление сообщений, приветствия новых участников.
- Платежи, Telegram Stars, inline-режим и Mini Apps — веб-интерфейс прямо внутри Telegram.
Почему боты пишут на Go#
Язык для бота выбирается под три задачи: держать тысячи диалогов одновременно, переживать всплески трафика и просто деплоиться. Go закрывает все три. Горутины делают разговор с каждым пользователем дешёвым: запустить тысячу параллельных обработчиков — не событие, а норма; каналы из базового курса Go здесь работают на вас, а не против. Статическая типизация ловит опечатки в полях Message на этапе компиляции, а не в продакшене в три ночи. Деплой — один бинарник: кросс-компиляция GOOS=linux GOARCH=amd64, копирование файла на VPS, запуск; ни рантайма, ни виртуальных окружений, ни зависимости от версии интерпретатора. Памяти бот на Go ест единицы мегабайт, поэтому хватает самого дешёвого сервера за пару сотен рублей. Отдельный бонус — экосистема: к боту приклеиваются те же библиотеки, что и к любому Go-сервису, от клиентов баз данных до структурных логгеров, и бот перестаёт быть игрушкой, превращаясь в обычную часть вашего бэкенда. А долгие очереди отправки и напоминания по таймерам — это goroutine и time.Ticker из продвинутого курса: они же станут скелетом бота-будильника ближе к финалу нашего курса.
Цель курса: тридцать строк работающего бота
GOpackage main
import (
"log"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)
func main() {
bot, err := tgbotapi.NewBotAPI("ВАШ_ТОКЕН")
if err != nil {
log.Panic(err)
}
u := tgbotapi.NewUpdate(0)
u.Timeout = 60
updates := bot.GetUpdatesChan(u)
for update := range updates {
if update.Message == nil {
continue
}
msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
msg.ReplyToMessageID = update.Message.MessageID
bot.Send(msg)
}
}Эскиз эхо-бота из четвёртого урока, чтобы вы видели цель: NewBotAPI проверяет токен, GetUpdatesChan отдаёт канал обновлений, цикл забирает их по одному. На каждое сообщение создаётся ответ через NewMessage с chat_id автора и уходит bot.Send. Пока не пытайтесь запустить: нужен локальный Go и настоящий токен из второго урока, у браузерной песочницы сайта нет доступа к сети.
Как выглядит обновление в сыром виде
GO{
"update_id": 123456789,
"message": {
"message_id": 42,
"from": {
"id": 111111111,
"is_bot": false,
"first_name": "Анна"
},
"chat": {
"id": 111111111,
"type": "private"
},
"date": 1717171717,
"text": "привет"
}
}Ровно то, что Telegram отдаёт по getUpdates до любых обёрток: объект Update с update_id и полем message. Внутри message — message_id, from, chat и text; поля chat.id и from.first_name встретятся в коде эхо-бота буквально. Обновления без поля message — нажатия inline-кнопок, правки текста, callback-запросы — приедут в других полях того же конверта, об этом ниже.
Как бот общается с сервером Telegram#
Обмен всегда инициирует ваша программа — Telegram сам к боту не стучится. Получать события можно двумя способами. Первый — long polling: бот раз за разом вызывает метод getUpdates, и сервер держит запрос открытым, пока не появится новое обновление или не истечёт таймаут; этот путь занимает первую половину курса и работает хоть с ноутбука без домена и белого IP. Второй — webhook: Telegram сам доставляет POST-запрос на ваш HTTPS-адрес, для чего нужны домен, сертификат и открытый порт; к нему придём в уроке про webhook, когда бот переедет на сервер. Неподтверждённые обновления Telegram хранит сутки: если процесс упал, после рестарта накопившаяся очередь приедет целиком. Ответ бот отправляет отдельным HTTPS-вызовом sendMessage, и у отправки свои лимиты — про них и про код 429 будет отдельный урок в конце курса.
У бота нет логина и пароля: есть только токен вида 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw. Кто держит токен, тот и есть бот — может читать входящие, писать вашим пользователям и переориентировать доставку обновлений. Хостинги с публичным кодом сканируют репозитории на утечки, и захват уехавшего в git токена — вопрос минут. Как хранить токен правильно и как его отзывать — центральная тема второго урока.
Два способа получать обновления#
| Критерий | Long polling | Webhook |
|---|---|---|
| Кто инициирует соединение | ваш бот | серверы Telegram |
| Что нужно снаружи | ничего: NAT и ноутбук не мешают | домен, TLS-сертификат, открытый порт |
| Задержка доставки | в пределах таймаута опроса | минимальная |
| Копий процесса | только одна | сколько угодно за балансировщиком |
| Где в курсе | уроки с третьего по семнадцатый | урок про webhook и деплой |
Проверка: пропуск в API
Что нужно программе, чтобы она могла работать с Telegram Bot API?
Проверка: кто инициирует соединение
Кто устанавливает HTTP-соединение при long polling?
Что сделает бот на нажатие кнопки
Прочитайте код и выберите, что он выведет:
for update := range updates {
if update.Message == nil {
continue
}
log.Println(update.Message.Text)
}Проба пера: два фрагмента из будущего кода
Допишите мажорную версию в пути импорта и имя конструктора бота — оба встретятся в третьем уроке.
Соберите каркас любого бота
Расставьте строки каркаса в порядке исполнения: от проверки токена до цикла обновлений.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Кейс: бот-дежурный, который жил в терминале#
История с последствиями, к которой курс вернётся на финише. Внутренний бот-дежурный для уведомлений о деплое запустили руками в открытой ssh-сессии на сервере: всё работало до первого закрытия терминала — процесс умер вместе с сессией, и команда полдня получала тишину там, где должны были быть алерты. Диагноз банальный, а последствия дорогие: долгоживущий бот обязан переживать выход из терминала — systemd-юнит или хотя бы nohup, и это не тема финала курса, а вечернее дело после четвёртого урока. Второй урок той же истории: уведомления в Telegram оказались единственным каналом, который команда реально читала, и бот из игрушки стал инфраструктурой — с неё начинается уважение к токену из следующего урока. Деплой и автозапуск разобраны в уроке про VPS и systemd.
Курс целиком — 25 уроков от первого токена до бота-трекера привычек с деплоем на VPS. Расписание начала простое: во втором уроке заводим бота в BotFather и учимся беречь токен, в третьем ставим библиотеку и пишем первый код с проверкой токена, в четвёртом собираем эхо-бота, в пятом вскрываем механику long polling до самого дна. Полный план с описанием каждого урока — на странице курса. Одна честная оговорка: сетевой код в браузерной песочнице сайта не запустится — нужен локальный Go с go.dev и настоящий токен; интерактивы урока работают и без этого, а практику начинайте с домашнего задания ниже.
Карточки: словарь ботовода
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- Бот — аккаунт Telegram, которым управляет программа через Bot API: HTTPS и JSON, без ручных протоколов.
- Update — конверт события: внутри message с текстом, from и chat.id; у кнопок и правок свои поля, message пуст.
- Bot API умеет форматированный текст, клавиатуры, файлы, команды, группы, платежи и Mini Apps.
- Go для ботов: горутины на диалоги, один бинарник в деплой, статическая типизация и единицы мегабайт памяти.
- Получение обновлений: long polling через getUpdates или webhook на свой HTTPS-адрес; неподтверждённое хранится сутки.
- Токен — это и есть бот: утечка означает захват, хранить в переменных окружения, отзывать при малейшем подозрении.
- Песочница сайта сетевой код не запустит: для практики нужен локальный Go и токен из второго урока.
Домашнее задание
Присмотритесь к ботам, которыми уже пользуетесь: возьмите двух своих любимцев и выпишите, какие возможности Bot API они задействуют — команды, reply- или inline-кнопки, файлы, форматирование. Затем опишите бота, которого сами напишете к финалу курса: одна фраза о задаче и три команды со смыслом. Этот набросок станет сквозным проектом всех следующих уроков — он же спасёт вас от написания очередного бота-погодника без цели.
Личные заметкиПусто
Вопросы и ответы по уроку
Можно ли писать ботов на Python и стоит ли учить Go ради этого?
Можно — python-telegram-bot и aiogram популярны и хороши. Go берут за деплой одним бинарником, предсказуемую память и горутины: бот живёт на дешёвом VPS годами без сюрпризов с версиями интерпретатора. Если основы Go уже знакомы, бот — идеальный первый проект; если нет — начните с базового курса на этом сайте. Сам Bot API одинаков для всех языков, поэтому выученные здесь понятия переезжают куда угодно.
Чем бот отличается от пользовательского аккаунта с автопрограммой?
Бот создаётся через BotFather и работает по официальному Bot API: стабильно и без риска бана. Управление пользовательским аккаунтом идёт через MTProto-клиенты, нарушает условия использования Telegram и может закончиться блокировкой номера. В курсе рассматривается только официальный путь — он же единственный, на котором строят коммерческие боты.
Нужен ли сервер, чтобы начать?
Нет. Первая половина курса работает через long polling с обычного ноутбука: бот сам опрашивает Telegram, поэтому NAT и серый IP не мешают. Сервер понадобится к уроку про webhook и деплой — когда захотите, чтобы бот отвечал людям и без вашего компьютера, и примерно тогда же решится вопрос автозапуска через systemd.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Изучайте дальше
Следующая ступень учебного пути
Мониторинг Go с Prometheus: метрики, Grafana, алерты
Курс по метрикам в Go: Counter, Gauge, Histogram, лейблы, PromQL, Grafana-дашборды, алерты и бизнес-метрики. 25 уроков с примерами client_golang.
- Понимать четыре типа метрик и выбирать правильный
- Экспортировать метрики из Go через promhttp
- Инструментировать HTTP-запросы и бизнес-события
- Писать PromQL-запросы: rate, sum, p99