Telegram бот на Go: от идеи до деплоя за 30 минут

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему Go — идеальный язык для Telegram ботов

Если вы когда-нибудь писали ботов на Python, то знаете: всё работает, пока не упираетесь в производительность. Go решает эту проблему на уровне архитектуры. Он быстрый, легковесный и не требует виртуального окружения. Telegram бот на Go — это не просто игрушка, а полноценный сервис, который выдерживает тысячи запросов в секунду и потребляет копейки памяти.

В этой статье мы с нуля создадим бота на Golang, который будет отвечать на команды, обрабатывать сообщения и даже работать с внешним API. Без лишней теории — только код, который можно сразу запустить.

Шаг 1: Подготовка окружения

Прежде чем писать Telegram бота на Go, убедитесь, что у вас установлен Go версии 1.20 или выше. Проверить можно командой:

go version

Если Go не установлен — скачайте с официального сайта. Установка занимает 2 минуты.

Также вам понадобится токен бота. Зайдите в Telegram, найдите BotFather и выполните команду:

/newbot

Введите имя и username бота. После создания BotFather пришлёт токен — сохраните его, он понадобится для подключения к Telegram Bot API.

Шаг 2: Структура проекта

Создайте папку проекта и инициализируйте модуль:

mkdir my-telegram-bot
cd my-telegram-bot
go mod init my-telegram-bot

Для работы с Telegram мы будем использовать библиотеку tgbotapi — это самая популярная Go библиотека Telegram. Установите её:

go get github.com/go-telegram-bot-api/telegram-bot-api/v5

Теперь создайте файл main.go. Базовая структура будет такой:

package main

import (
    "log"
    "os"
    tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

func main() {
    token := os.Getenv("TELEGRAM_BOT_TOKEN")
    bot, err := tgbotapi.NewBotAPI(token)
    if err != nil {
        log.Panic(err)
    }

    bot.Debug = true
    log.Printf("Бот @%s запущен", bot.Self.UserName)

    u := tgbotapi.NewUpdate(0)
    u.Timeout = 60

    updates := bot.GetUpdatesChan(u)

    for update := range updates {
        if update.Message != nil {
            log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
            msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Привет! Я работаю на Go!")
            bot.Send(msg)
        }
    }
}

Запустите бота:

export TELEGRAM_BOT_TOKEN="ваш_токен"
go run main.go

Напишите боту в Telegram — он должен ответить. Если всё работает, переходим к следующему шагу.

Шаг 3: Обработка команд

Просто отвечать «Привет» — скучно. Давайте добавим обработку команд для бота Telegram. Реализуем команды /start и /help:

for update := range updates {
    if update.Message != nil {
        switch update.Message.Command() {
        case "start":
            msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Добро пожаловать! Я бот на Go. Используй /help для списка команд.")
            bot.Send(msg)
        case "help":
            msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Доступные команды:\n/start - приветствие\n/help - помощь\n/echo - повторить сообщение")
            bot.Send(msg)
        default:
            msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Неизвестная команда. Используй /help")
            bot.Send(msg)
        }
    }
}

Теперь бот реагирует на команды. Но это только начало. Настоящая сила Golang Telegram бота — в производительности при работе с большими нагрузками.

Шаг 4: Работа с внешним API

Добавим полезную функцию: бот будет показывать курс криптовалют. Для этого используем публичное API CoinGecko. Создадим отдельный файл api.go:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type CryptoPrice struct {
    Bitcoin struct {
        Usd float64 `json:"usd"`
    } `json:"bitcoin"`
    Ethereum struct {
        Usd float64 `json:"usd"`
    } `json:"ethereum"`
}

func GetCryptoPrices() (string, error) {
    resp, err := http.Get("https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum&vs_currencies=usd")
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    var prices CryptoPrice
    if err := json.NewDecoder(resp.Body).Decode(&prices); err != nil {
        return "", err
    }

    return fmt.Sprintf("Курс BTC: $%.2f\nКурс ETH: $%.2f", prices.Bitcoin.Usd, prices.Ethereum.Usd), nil
}

Теперь добавим команду /crypto в основной цикл:

case "crypto":
    text, err := GetCryptoPrices()
    if err != nil {
        text = "Ошибка получения данных"
    }
    msg := tgbotapi.NewMessage(update.Message.Chat.ID, text)
    bot.Send(msg)

Запустите бота и проверьте команду /crypto. Вы увидите актуальные курсы. Это отличный пример создания бота на Golang с интеграцией сторонних сервисов.

Шаг 5: Inline-режим и кнопки

Современные Telegram боты на Go должны уметь работать с клавиатурами. Добавим inline-кнопки для команды /start:

case "start":
    buttons := tgbotapi.NewInlineKeyboardMarkup(
        tgbotapi.NewInlineKeyboardRow(
            tgbotapi.NewInlineKeyboardButtonData("Курс криптовалют", "crypto"),
            tgbotapi.NewInlineKeyboardButtonURL("GitHub бота", "https://github.com/your-repo"),
        ),
    )
    msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Выберите действие:")
    msg.ReplyMarkup = &buttons
    bot.Send(msg)

Теперь обработаем callback-запросы:

if update.CallbackQuery != nil {
    callback := update.CallbackQuery
    var text string
    switch callback.Data {
    case "crypto":
        text, _ = GetCryptoPrices()
    default:
        text = "Неизвестная кнопка"
    }
    msg := tgbotapi.NewMessage(callback.Message.Chat.ID, text)
    bot.Send(msg)
    bot.Send(tgbotapi.NewCallback(callback.ID, "Готово!"))
}

Теперь бот стал интерактивным. Пользователи могут нажимать кнопки и получать данные — всё это работает асинхронно и быстро благодаря Go.

Блоги

Рекомендаций по книгам