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

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

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

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

Знакомство: зачем писать ботов на Go

Боты на golang — самый быстрый путь от пустой папки до живого проекта: Telegram Bot API прячет от вас вёрстку, базы и настройку серверов, оставляя чистую логику на Go. В этом уроке — обзор возможностей Bot API, разбор, почему для ботов берут именно Go, и карта всех 25 уроков курса.

Содержание урока · 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 из продвинутого курса: они же станут скелетом бота-будильника ближе к финалу нашего курса.

Цель курса: тридцать строк работающего бота

GO
package 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 будет отдельный урок в конце курса.

Два способа получать обновления#

КритерийLong pollingWebhook
Кто инициирует соединениеваш ботсерверы 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)
}

Проба пера: два фрагмента из будущего кода

Допишите мажорную версию в пути импорта и имя конструктора бота — оба встретятся в третьем уроке.

import ( tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/" ) func main() { bot, err := tgbotapi.("ВАШ_ТОКЕН") if err != nil { log.Panic(err) } }

Соберите каркас любого бота

Расставьте строки каркаса в порядке исполнения: от проверки токена до цикла обновлений.

Строки

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

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

Кейс: бот-дежурный, который жил в терминале#

История с последствиями, к которой курс вернётся на финише. Внутренний бот-дежурный для уведомлений о деплое запустили руками в открытой ssh-сессии на сервере: всё работало до первого закрытия терминала — процесс умер вместе с сессией, и команда полдня получала тишину там, где должны были быть алерты. Диагноз банальный, а последствия дорогие: долгоживущий бот обязан переживать выход из терминала — systemd-юнит или хотя бы nohup, и это не тема финала курса, а вечернее дело после четвёртого урока. Второй урок той же истории: уведомления в Telegram оказались единственным каналом, который команда реально читала, и бот из игрушки стал инфраструктурой — с неё начинается уважение к токену из следующего урока. Деплой и автозапуск разобраны в уроке про VPS и systemd.

Курс целиком — 25 уроков от первого токена до бота-трекера привычек с деплоем на VPS. Расписание начала простое: во втором уроке заводим бота в BotFather и учимся беречь токен, в третьем ставим библиотеку и пишем первый код с проверкой токена, в четвёртом собираем эхо-бота, в пятом вскрываем механику long polling до самого дна. Полный план с описанием каждого урока — на странице курса. Одна честная оговорка: сетевой код в браузерной песочнице сайта не запустится — нужен локальный Go с go.dev и настоящий токен; интерактивы урока работают и без этого, а практику начинайте с домашнего задания ниже.

Карточки: словарь ботовода

Термин

Telegram Bot API

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

Набор HTTPS-методов на api.telegram.org: бот отправляет и получает JSON. Методы вида sendMessage, getUpdates, getMe; библиотека оборачивает их в структуры Go.

1 / 6

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

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +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-кнопки, файлы, форматирование. Затем опишите бота, которого сами напишете к финалу курса: одна фраза о задаче и три команды со смыслом. Этот набросок станет сквозным проектом всех следующих уроков — он же спасёт вас от написания очередного бота-погодника без цели.

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

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

Можно ли писать ботов на Python и стоит ли учить Go ради этого?

Можно — python-telegram-bot и aiogram популярны и хороши. Go берут за деплой одним бинарником, предсказуемую память и горутины: бот живёт на дешёвом VPS годами без сюрпризов с версиями интерпретатора. Если основы Go уже знакомы, бот — идеальный первый проект; если нет — начните с базового курса на этом сайте. Сам Bot API одинаков для всех языков, поэтому выученные здесь понятия переезжают куда угодно.

Чем бот отличается от пользовательского аккаунта с автопрограммой?

Бот создаётся через BotFather и работает по официальному Bot API: стабильно и без риска бана. Управление пользовательским аккаунтом идёт через MTProto-клиенты, нарушает условия использования Telegram и может закончиться блокировкой номера. В курсе рассматривается только официальный путь — он же единственный, на котором строят коммерческие боты.

Нужен ли сервер, чтобы начать?

Нет. Первая половина курса работает через long polling с обычного ноутбука: бот сам опрашивает Telegram, поэтому NAT и серый IP не мешают. Сервер понадобится к уроку про webhook и деплой — когда захотите, чтобы бот отвечал людям и без вашего компьютера, и примерно тогда же решится вопрос автозапуска через systemd.

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

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

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

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

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

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

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