🎯 Цель работы:
Познакомиться с архитектурой взаимодействия клиент-сервер в контексте Telegram-ботов. Освоить базовые принципы работы с библиотекой для Telegram Bot API, обработки входящих сообщений и отправки ответов. Подготовить инфраструктуру для создания более сложного приложения.
📋 Задание
Создать Telegram-бота, который принимает текстовые сообщения и обрабатывает их согласно одному из алгоритмов (см. свой вариант).
Минимальные требования
- Получить текстовое сообщение от пользователя, обработать его по индивидуальному алгоритму, вывести ответное сообщение
- “простой эхо-бот”
- работа с классом String и StringBuilder
Указания по разработке
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 | Конвертер во “взрывной” текст | Преобразуйте текст так, чтобы после каждой согласной буквы добавлялся символ “💥”. | "Бум!" → "Б💥ю💥м💥!" |