---
title: "Знакомство: зачем писать ботов на Go"
description: "Боты на golang — быстрый первый проект: обзор Telegram Bot API, что умеют боты, почему Go удобен для ботов и как устроен курс. С примерами кода и таблицей."
course: "Telegram-боты на Go: от эха до полноценного сервиса"
url: "https://golangmaster.ru/courses/telegram-bot/lessons/01-znakomstvo-telegram-bot/"
published: "2026-09-19"
updated: "2026-09-25"
minutes: 16
---

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

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

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

Представьте: идея сервиса есть, пользователи поняли, а вёрстки, деплоя и базы данных на старте нет — и не нужно. Интерфейсом становится сам 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](/courses/go-basics/) здесь работают на вас, а не против. Статическая типизация ловит опечатки в полях Message на этапе компиляции, а не в продакшене в три ночи. Деплой — один бинарник: кросс-компиляция GOOS=linux GOARCH=amd64, копирование файла на VPS, запуск; ни рантайма, ни виртуальных окружений, ни зависимости от версии интерпретатора. Памяти бот на Go ест единицы мегабайт, поэтому хватает самого дешёвого сервера за пару сотен рублей. Отдельный бонус — экосистема: к боту приклеиваются те же библиотеки, что и к любому Go-сервису, от клиентов баз данных до структурных логгеров, и бот перестаёт быть игрушкой, превращаясь в обычную часть вашего бэкенда. А долгие очереди отправки и напоминания по таймерам — это goroutine и time.Ticker из [продвинутого курса](/courses/go-advanced/): они же станут скелетом бота-будильника ближе к финалу нашего курса.

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

```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](/courses/telegram-bot/lessons/18-webhook-bot/), когда бот переедет на сервер. Неподтверждённые обновления Telegram хранит сутки: если процесс упал, после рестарта накопившаяся очередь приедет целиком. Ответ бот отправляет отдельным HTTPS-вызовом sendMessage, и у отправки свои лимиты — про них и про код 429 будет отдельный урок в конце курса.

> **Токен — это и есть бот.** У бота нет логина и пароля: есть только токен вида 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw. Кто держит токен, тот и есть бот — может читать входящие, писать вашим пользователям и переориентировать доставку обновлений. Хостинги с публичным кодом сканируют репозитории на утечки, и захват уехавшего в git токена — вопрос минут. Как хранить токен правильно и как его отзывать — центральная тема второго урока.

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

| Критерий | Long polling | Webhook |
| --- | --- | --- |
| Кто инициирует соединение | ваш бот | серверы Telegram |
| Что нужно снаружи | ничего: NAT и ноутбук не мешают | домен, TLS-сертификат, открытый порт |
| Задержка доставки | в пределах таймаута опроса | минимальная |
| Копий процесса | только одна | сколько угодно за балансировщиком |
| Где в курсе | уроки с третьего по семнадцатый | урок про webhook и деплой |

### Проверка: пропуск в API

**Вопрос:** Что нужно программе, чтобы она могла работать с Telegram Bot API?

- Пользовательский аккаунт с номером телефона
- ✅ Токен, выданный BotFather
- SSL-сертификат и доменное имя
- Учётную запись разработчика в Telegram

Единственный пропуск в API — токен: строка, которую выдаёт BotFather при создании бота. Домен и сертификат нужны только для webhook, а отдельного аккаунта разработчика в Telegram не существует: токен выдаётся сразу при создании.

### Проверка: кто инициирует соединение

**Вопрос:** Кто устанавливает HTTP-соединение при long polling?

- Сервер Telegram подключается к боту
- ✅ Бот сам опрашивает метод getUpdates
- Соединение держит посредник-прокси
- Обе стороны одновременно

При long polling бот сам вызывает getUpdates, и сервер удерживает запрос открытым до появления обновлений. Telegram инициирует соединение только в режиме webhook — и именно поэтому polling работает из-за NAT, файрволов и мобильного интернета без белого адреса.

### Что сделает бот на нажатие кнопки

```go
for update := range updates {
        if update.Message == nil {
                continue
        }

        log.Println(update.Message.Text)
}
```

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

- Ответит на нажатие кнопки
- ✅ Пропустит обновление: update.Message пуст, сработал continue
- Упадёт с паникой
- Напечатает пустую строку

Нажатие inline-кнопки приезжает обновлением без поля message: update.Message равно nil, проверка пропускает такое обновление, и цикл спокойно ждёт следующее. Без этой проверки было бы разыменование nil-указателя и падение процесса — самая известная ошибка первого бота.

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

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

```go
import (
        tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/___"
)

func main() {
        bot, err := tgbotapi.___("ВАШ_ТОКЕН")
        if err != nil {
                log.Panic(err)
        }
}
```

Подсказка: Пятая версия библиотеки живёт в суффиксе пути /v5; бот создаёт функция NewBotAPI.

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

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

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

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

1. `bot, err := tgbotapi.NewBotAPI(token)`
2. `if err != nil { log.Panic(err) }`
3. `u := tgbotapi.NewUpdate(0)`
4. `u.Timeout = 60`
5. `updates := bot.GetUpdatesChan(u)`
6. `for update := range updates { handle(update) }`

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

История с последствиями, к которой курс вернётся на финише. Внутренний бот-дежурный для уведомлений о деплое запустили руками в открытой ssh-сессии на сервере: всё работало до первого закрытия терминала — процесс умер вместе с сессией, и команда полдня получала тишину там, где должны были быть алерты. Диагноз банальный, а последствия дорогие: долгоживущий бот обязан переживать выход из терминала — systemd-юнит или хотя бы nohup, и это не тема финала курса, а вечернее дело после четвёртого урока. Второй урок той же истории: уведомления в Telegram оказались единственным каналом, который команда реально читала, и бот из игрушки стал инфраструктурой — с неё начинается уважение к токену из следующего урока. Деплой и автозапуск разобраны в [уроке про VPS и systemd](/courses/telegram-bot/lessons/24-deploy-bota/).

Курс целиком — 25 уроков от первого токена до бота-трекера привычек с деплоем на VPS. Расписание начала простое: во [втором уроке](/courses/telegram-bot/lessons/02-botfather-i-token/) заводим бота в BotFather и учимся беречь токен, в [третьем](/courses/telegram-bot/lessons/03-ustanovka-telegram-bot-api/) ставим библиотеку и пишем первый код с проверкой токена, в [четвёртом](/courses/telegram-bot/lessons/04-pervyj-bot-echo/) собираем эхо-бота, в [пятом](/courses/telegram-bot/lessons/05-long-polling/) вскрываем механику long polling до самого дна. Полный план с описанием каждого урока — на [странице курса](/courses/telegram-bot/). Одна честная оговорка: сетевой код в браузерной песочнице сайта не запустится — нужен локальный Go с go.dev и настоящий токен; интерактивы урока работают и без этого, а практику начинайте с домашнего задания ниже.

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

- **Telegram Bot API** — Набор HTTPS-методов на api.telegram.org: бот отправляет и получает JSON. Методы вида sendMessage, getUpdates, getMe; библиотека оборачивает их в структуры Go.
- **Токен бота** — Строка вида 123456:AAHdqTcv..., выданная BotFather. Полная замена логина и пароля: кто держит токен, тот управляет ботом.
- **Update** — Объект-конверт одного события: update_id и поле с содержимым — message, callback_query, edited_message. Приезжает через getUpdates или webhook.
- **chat_id** — Идентификатор чата типа int64: приватный диалог, группа или канал. По нему бот знает, куда отправлять ответ.
- **Long polling** — Режим getUpdates: сервер Telegram держит HTTP-запрос открытым до появления обновлений или таймаута. Домен не нужен.
- **Webhook** — Режим, при котором Telegram сам присылает обновления POST-запросом на ваш HTTPS-адрес. Нужны домен и сертификат.

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

- Бот — аккаунт 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.
