Почему 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.