Telegram бот на Kotlin: создаём с нуля за час

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

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

Начать курс

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

Вы когда-нибудь задумывались, почему Kotlin так быстро завоевал сердца разработчиков? Дело в том, что этот язык сочетает в себе лаконичность Python и мощь Java, но при этом лишён их недостатков. Когда речь заходит о создании Telegram бота на Kotlin, вы получаете не просто рабочее решение, а элегантный, производительный и легко поддерживаемый код.

Представьте: вы пишете бота, который обрабатывает тысячи запросов в секунду, работает без сбоев и при этом код занимает в два раза меньше строк, чем на Java. Звучит как мечта? На самом деле — реальность. Telegram бот на Kotlin — это не только модно, но и практично. Особенно если вы уже знакомы с экосистемой JVM или хотите попробовать что-то новое после Python.

В этом гайде мы шаг за шагом создадим полноценного бота: от регистрации в BotFather до развертывания на сервере. Вы узнаете, как обрабатывать команды, работать с клавиатурами и даже отправлять файлы. Поехали!

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

Прежде чем писать код, нам нужно получить токен — ключ доступа к Telegram API. Это делается через официального бота BotFather. Процесс займёт меньше минуты.

  • Откройте Telegram и найдите @BotFather.
  • Отправьте команду /newbot.
  • Придумайте имя (например, MyKotlinBot) и username, заканчивающийся на bot (например, MyKotlinBot).
  • Сохраните полученный токен — он понадобится для подключения.

Теперь настроим проект. Я рекомендую использовать IntelliJ IDEA Community Edition (она бесплатна и отлично дружит с Kotlin). Создайте новый Gradle-проект с Kotlin DSL.

Добавляем зависимости

Для работы с Telegram API мы будем использовать библиотеку TelegramBots — это стандарт де-факто в мире Kotlin и Java. Откройте файл build.gradle.kts и добавьте:

dependencies {
    implementation("org.telegram:telegrambots:6.9.7.1")
    implementation("org.telegram:telegrambotsextensions:6.9.7.1")
    implementation("ch.qos.logback:logback-classic:1.5.6")
}

Первая библиотека — ядро, вторая — полезные расширения (например, для обработки команд), третья — логирование, чтобы видеть ошибки.

Шаг 2: Пишем первого бота на Kotlin

Создайте класс MyBot, который наследуется от TelegramLongPollingBot. Это самый простой способ: бот будет сам опрашивать сервер Telegram на наличие новых сообщений.

import org.telegram.telegrambots.bots.TelegramLongPollingBot
import org.telegram.telegrambots.meta.api.objects.Update

class MyBot : TelegramLongPollingBot() {

    override fun getBotUsername(): String = "MyKotlinBot" // ваш username

    override fun getBotToken(): String = "ВАШ_ТОКЕН_ЗДЕСЬ" // токен от BotFather

    override fun onUpdateReceived(update: Update?) {
        // Пока просто заглушка
        if (update?.hasMessage() == true && update.message.hasText()) {
            println("Получено сообщение: ${update.message.text}")
        }
    }
}

Теперь нужно запустить бота. Создайте файл Main.kt с точкой входа:

import org.telegram.telegrambots.meta.TelegramBotsApi
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession

fun main() {
    val botsApi = TelegramBotsApi(DefaultBotSession::class.java)
    botsApi.registerBot(MyBot())
    println("Бот запущен!")
}

Запустите — и ваш первый Telegram бот на Kotlin уже жив! Пока он только выводит сообщения в консоль, но это только начало.

Шаг 3: Обрабатываем команды и отправляем ответы

Просто читать сообщения скучно. Давайте научим бота отвечать на команды. Для этого используем аннотацию @BotCommand из расширений, но сначала перепишем класс, чтобы он наследовался от TelegramLongPollingBot и реализовал интерфейс CommandRegister.

На самом деле проще добавить обработку вручную в методе onUpdateReceived. Вот пример с командами /start и /help:

import org.telegram.telegrambots.bots.TelegramLongPollingBot
import org.telegram.telegrambots.meta.api.methods.send.SendMessage
import org.telegram.telegrambots.meta.api.objects.Update
import org.telegram.telegrambots.meta.exceptions.TelegramApiException

class MyBot : TelegramLongPollingBot() {

    override fun getBotUsername(): String = "MyKotlinBot"
    override fun getBotToken(): String = "ВАШ_ТОКЕН"

    override fun onUpdateReceived(update: Update?) {
        if (update?.hasMessage() == true && update.message.hasText()) {
            val message = update.message
            val chatId = message.chatId.toString()
            val text = message.text

            when (text) {
                "/start" -> sendMessage(chatId, "Привет! Я бот на Kotlin. Чем могу помочь?")
                "/help" -> sendMessage(chatId, "Доступные команды:\n/start - приветствие\n/help - помощь\n/about - обо мне")
                "/about" -> sendMessage(chatId, "Я создан с помощью библиотеки TelegramBots на языке Kotlin.")
                else -> sendMessage(chatId, "Извините, я не знаю такой команды. Напишите /help")
            }
        }
    }

    private fun sendMessage(chatId: String, text: String) {
        val message = SendMessage().apply {
            setChatId(chatId)
            setText(text)
        }
        try {
            execute(message)
        } catch (e: TelegramApiException) {
            e.printStackTrace()
        }
    }
}

Обратите внимание: мы вынесли отправку сообщения в отдельный метод. Это переиспользуемый код — в будущем вы сможете вызывать его из любого места.

Шаг 4: Интерактивные клавиатуры на Kotlin

Telegram бот на Kotlin становится гораздо интереснее, когда у него есть кнопки. Клавиатуры бывают двух типов: ReplyKeyboardMarkup (под полем ввода) и InlineKeyboardMarkup (прямо в сообщении).

Добавим inline-клавиатуру к команде /help. Замените соответствующий вызов:

import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton

// Внутри метода onUpdateReceived:
"/help" -> {
    val keyboard = InlineKeyboardMarkup().apply {
        keyboard = listOf(
            listOf(
                InlineKeyboardButton("О боте").apply { callbackData = "about" },
                InlineKeyboardButton("Контакты").apply { callbackData = "contact" }
            ),
            listOf(
                InlineKeyboardButton("Закрыть").apply { callbackData = "                

Блоги

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