🎯 Цель работы:

Познакомиться с архитектурой взаимодействия клиент-сервер в контексте Telegram-ботов. Освоить базовые принципы работы с библиотекой для Telegram Bot API, обработки входящих сообщений и отправки ответов. Подготовить инфраструктуру для создания более сложного приложения.

📋 Задание

Создать Telegram-бота, который принимает текстовые сообщения и обрабатывает их согласно одному из алгоритмов (см. свой вариант).

Минимальные требования

Указания по разработке

Telegram Bot API — это HTTP-интерфейс, который позволяет программам взаимодействовать с мессенджером Telegram.

Бот-токен – это Уникальный ключ, который идентифицирует вашего бота. Запрашивается у @BotFather:

Пример: 1234567890:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw

!он уникален, и конфиденциален, поэтому недопускать его прямого указания в коде и документации)

Платформа Телеграм поддреживает два механизма клиент-серверного взаимодействия:

Long Polling (используется в этой работе), когда бот постоянно спрашивает сервер “Есть ли новые сообщения?” Webhooks, когда сервер сам уведомляет бота о новых событиях

Поллинг - это опрос, т.е. программа периодически опрашивает серверы Telegram: “Есть ли для меня новые сообщения (обновления — Update)?”.

Update - единица обновления, представляет 0бъект, содержащий информацию о событии (новое сообщение, нажатие кнопки и т.д.)

{
  "update_id": 123456,
  "message": {
    "message_id": 1,
    "from": {
      "id": 12345,
      "first_name": "Иван",
      "last_name": "Иванов"
    },
    "chat": {
      "id": 12345,
      "type": "private"
    },
    "text": "/start"
  }
}

Алгоритм работы поллинг-бота - это цикл “спросил -> получил список Update -> обработал” и так бесконечно.

Каждое событие (текстовое сообщение, callback от кнопки) — это Update. Из него извлекается Message, а из него — Chat (диалог) и User (отправитель). Их идентификаторы (chatId) — ключ для ответа. Большую часть работы берет библиотека Телеграм, но состояние сеанс поддерживается программно.

Хороший учебный курс по ТелеграмAPI

Порядок работы

ШАГ 1. Создайте проект

src/main/java/ru/university/textbot/
├── TextBotApplication.java      # Главный класс приложения
├── TextProcessorBot.java        # Основной класс бота
├── processor/                   # Пакет с обработчиками текста
│   ├── TextProcessor.java       # Обработчик текста
│   ├── 
│   └── ...                          
└── config/
    └── BotConfig.java          # Конфигурация бота

ШАГ 2. Включите зависимости

<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots-longpolling</artifactId>
            <version>9.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots-client</artifactId>
            <version>9.2.1</version>
        </dependency>

ШАГ 3 Регистрация бота и получение токена

Откройте Telegram, найдите официального бота @BotFather.

Отправьте ему команду /newbot и следуйте инструкциям.

После создания бота вы получите API-токен

Поместите его в конфигурационный класс

public class BotConfig {

    public static final String BOT_USERNAME = "Это имя Вашего бота";
    public static final String BOT_TOKEN = "сюда полученный код";
    public static final String RESOURCES_PATH = "src/main/resources/";
}

ШАГ 4 Создание поллинг-бота

import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient;
import org.telegram.telegrambots.longpolling.util.LongPollingSingleThreadUpdateConsumer;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.meta.generics.TelegramClient;

public class TextProcessorBot implements LongPollingSingleThreadUpdateConsumer {
    private final TelegramClient telegramClient;

    // Конструктор принимает токен для инициализации клиента
    public TextProcessorBot(String botToken) {
        telegramClient = new OkHttpTelegramClient(BotConfig.botToken);
    }

    @Override
    public void consume(Update update) {
        // Проверяем, что полученное обновление содержит текстовое сообщение
        if (update.hasMessage() && update.getMessage().hasText()) {
            String userMessageText = update.getMessage().getText();
            long chatId = update.getMessage().getChatId();

            // Определяем ответ в зависимости от команды
            String answerText;
            if (userMessageText.equals("/start")) {
                answerText = "Привет! Я эхо-бот. Просто напиши мне что-нибудь.";
            } else if (userMessageText.equals("/help")) {
                answerText = "Я повторю за тобой любое текстовое сообщение.";
            } else {
                answerText = "Эхо: " + userMessageText;
            }

            // Создаем объект ответного сообщения с использованием билдера
            SendMessage reply = SendMessage
                    .builder()
                    .chatId(chatId)
                    .text(answerText)
                    .build();

            // Пытаемся отправить сообщение
            try {
                telegramClient.execute(reply);
            } catch (TelegramApiException e) {
                 System.err.println("❌ Ошибка обработки сообщения: " + e.getMessage());
                e.printStackTrace();
                sendText(chatId, "⚠️ Произошла ошибка. Попробуйте еще раз.");
            }
        }
    }
}

ШАГ 5. Создание главного класса для запуска (BotAppStarter.java) Создайте класс с методом main

import org.telegram.telegrambots.longpolling.TelegramBotsLongPollingApplication;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

import java.util.Scanner;

public class TextBotApplication {
    public static void main(String[] args) {

        try {
            // Создаем экземпляр бота
            TextProcessorBot quizBot = new TextProcessorBot();

            // Создаем приложение Long Polling
            TelegramBotsLongPollingApplication botsApplication =
                    new TelegramBotsLongPollingApplication();

            // Регистрируем бота
            botsApplication.registerBot(BotConfig.BOT_TOKEN, quizBot);

            System.out.println("✅ Бот успешно запущен!");
            System.out.println("🤖 Имя бота: @" + BotConfig.BOT_USERNAME);
            System.out.println("📊 Ожидание сообщений...");
            System.out.println("Для остановки нажмите Ctrl+C");

            // Бесконечный цикл для работы приложения
            Thread.currentThread().join();

        } catch (TelegramApiException e) {
            System.err.println("❌ Ошибка Telegram API: " + e.getMessage());
            e.printStackTrace();
        } catch (InterruptedException e) {
            System.out.println("👋 Бот остановлен");
        } catch (Exception e) {
            System.err.println("❌ Неожиданная ошибка: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Пояснение к коду Если главный поток, запустивший это фоновое опросное соединение, завершится — завершится и вся программа JVM, вместе с фоновым потоком. Бот “умрет”.

Thread.currentThread().join() блокирует главный поток и заставляет его ждать… самого себя бесконечно. Это стандартный и элегантный способ оставить консольное приложение работающим, пока его явно не закроют.

В качестве альтернативы рассмотирте:

Scanner scanner = new Scanner(System.in);
    while (!scanner.nextLine().equalsIgnoreCase("stop")) {
        System.out.println("Бот продолжает работу...");
    }
    System.out.println("Завершение работы.");

ШАГ 6. Запуск и тестирование

Запустите метод main в классе TextBotApplication.

В консоли должно появиться сообщение “Бот успешно запущен!”.

Найдите своего бота в Telegram по имени (которое вы дали ему в @BotFather) и отправьте ему команду /start или любое текстовое сообщение.

ШАГ 7. Реализуйте класс TextProcessor.java

в соотвествии с индивидуальным вариантом, работа со строками

выполните тестирование работы бота.

✅ Критерии оценивания

Критерий Балл Описание  
  Работоспособность 1 Эхо-бот с индивидуальным вариантом
  Понятность 1 Внесение незначительных изменений в код (в аудитории)
  Интерфейс 1 Выполняет не менее 3 команд (старт, стоп, помощь и т.д.)
  Логгирование 1 Создает журнал событий, описания работы и запросов в отдельный поток ошибок
  Соблюдение дедлайна 1 Сдача вовремя

Индивидуальные задания

Название задания Описание для студента Пример ввода → вывода
1 Шифр Цезаря Реализуйте шифр Цезаря со сдвигом на 3 буквы вперед в алфавите. Сохраняйте регистр, изменяйте только буквы. "Hello, Lab 5!""Khoor, Ode 5!"
2 Инвертор строки Возвращайте строку, записанную задом наперед. "Telegram""margeleT"
3 Счетчик слов Подсчитайте и верните количество слов в сообщении (слова разделены пробелами). "Это второе сообщение""Слов: 3"
4 Генератор аббревиатур Создайте аббревиатуру из первых букв каждого слова. "Объектно Ориентированное Программирование""ООП"
5 Удалитель гласных Удалите из текста все гласные буквы (а, е, ё, и, о, у, ы, э, ю, я). "Программирование""Пргрммвн"
6 Удалитель согласных Удалите из текста все согласные буквы. "Программирование""оаиаое"
7 Чередование регистра Преобразуйте строку так, чтобы буквы чередовались в регистре (НаПрИмЕр ТаК). "чередование""ЧеРеДоВаНиЕ"
8 Сортировка букв Отсортируйте все буквы в строке в алфавитном порядке (пробелы и знаки препинания удалите). "программист""агммноррпист"
9 “Свинский латынь” (Pig Latin) Для каждого слова перенесите первую букву в конец и добавьте “ay”. "simple bot""implesay otbay"
10 Двоичный кодировщик Замените каждый символ строки на его двоичный код (ASCII/Unicode). "AI""1000001 1001001"
11 Анализатор дубликатов Найдите и выведите только символы, которые повторяются в строке более 1 раза. "программирование""р, а, м, и"
12 Генератор лесенки Выводите слово, на каждой новой строке добавляя по одной букве. "Код""К\nКо\nКод"
13 Шифр Атбаш Примените шифр Атбаш для русского алфавита (замените букву на противоположную по порядку: а→я, б→ю и т.д.). "Привет""Поцэгь"
14 Калькулятор частоты Для каждого слова в тексте укажите, сколько раз оно встретилось. "код код тест""код: 2, тест: 1"
15 Генератор палиндромов Проверьте, является ли строка палиндромом (читается одинаково слева направо и справа налево). "А роза упала на лапу Азора""Это палиндром"
16 Форматировщик в CamelCase Преобразуйте фразу в camelCase (первое слово с маленькой, последующие с заглавной, пробелы удалить). "my telegram bot""myTelegramBot"
17 Разделитель по гласным Разделите строку на слоги, предполагая, что слог начинается с каждой гласной. "программирование""про-гра-мми-ро-ва-ни-е"
18 Кодировщик в азбуку Морзе Преобразуйте текст в азбуку Морзе (только буквы, пробелы между буквами). "SOS""... --- ..."
19 Генератор “радужного” текста Оберните каждую букву строки в соответствующий цветовой тег для HTML/разметки (циклично: red, orange, yellow и т.д.). "Привет""<span style='color:red;'>П</span><span style='color:orange;'>р</span>..."
20 Анаграмма-проверка Примите две строки, разделенные запятой, и проверьте, являются ли они анаграммами (состоят из одних и тех же букв). "кот, ток""Это анаграмма"
21 Усилитель эмоций Усильте эмоции: замените все восклицательные знаки на три подряд, а вопросительные — на два. "Что?! Серьезно!""Что??!! Серьезно!!!"
22 Генератор хештегов Преобразуйте фразу в хештег: слова без пробелов, каждое с заглавной буквы, в начале #. "удачная лабораторная""#УдачнаяЛабораторная"
23 Шифр рельсовой изгороди Закодируйте сообщение шифром “рельсовой изгороди” (Rail Fence Cipher) с глубиной 3. "ПРИВЕТМИР""ПЕМРИВТИР"
24 Поиск самой длинной строки Примите строки, разделенные точкой с запятой, и найдите самую длинную. "кот;студент;лабораторная""самая длинная: лабораторная"
25 Транслитератор Реализуйте простую транслитерацию с русского на английский (например, по ГОСТу). "Щука""Shchuka"
26 Генератор акростиха Составьте акростих из первых букв каждого слова переданной фразы. "Язык Java мощный""ЯJM"
27 Сжатие повторений Сожмите строку, заменяя повторяющиеся подряд символы на символ и число повторений (RLE). "АААББВГГГ""А3Б2В1Г3"
28 Валидатор пароля Проверьте, соответствует ли строка (пароль) требованиям: >=8 символов, есть цифра и заглавная буква. "Pass123""Слабый пароль"
29 Перемешиватель букв В каждом слове перемешайте все буквы, кроме первой и последней. "Программирование это интересно""Пгоарммриаове это итернесно"
30 Конвертер во “взрывной” текст Преобразуйте текст так, чтобы после каждой согласной буквы добавлялся символ “💥”. "Бум!""Б💥ю💥м💥!"