Пример полнофункционального Telegram-бота, написанного на Java 21 с использованием фреймворка Nyagram.
Этот проект демонстрирует, как создавать сложных ботов без "лапши" из кода, используя декларативный подход, встроенную машину состояний (FSM) и валидацию данных.
- ☁️ Текущая погода: Получение данных через OpenWeatherMap API.
- 🔄 Интерактивность: Inline-кнопки для обновления прогноза без отправки новых сообщений.
- 🗣 FSM (Диалоги): Пошаговый сценарий подписки на рассылку (
/subscribe-> Город -> Время). - 🛡 Валидация: Автоматическая проверка формата времени через аннотацию
@Validation. - 🧠 Обработка ошибок: Глобальный перехват исключений через
@BotControllerAdvice. - ⏰ Планировщик: Рассылка прогнозов по расписанию (Spring Scheduler).
- 💾 База данных: Использование Spring Data JPA и H2 (In-Memory) для хранения подписок.
- Java 21
- Spring Boot 3.2
- Nyagram 1.1.1 (Telegram Bot Framework)
- H2 Database (для простоты запуска, данные хранятся в памяти)
- Lombok
- Установленный JDK 21.
- Токен Telegram-бота (получить у @BotFather).
- API ключ OpenWeatherMap (бесплатно на openweathermap.org).
Откройте файл src/main/resources/application.yml и вставьте свои ключи:
nyagram:
bot-token: "ВАШ_ТЕЛЕГРАМ_ТОКЕН"
bot-username: "ИМЯ_ВАШЕГО_БОТА"
weather:
api-key: "ВАШ_OPENWEATHER_API_KEY"Linux / macOS:
./gradlew bootRunWindows:
gradlew.bat bootRunПосле запуска бота отправьте команду /start.
| Команда | Описание |
|---|---|
/start |
Приветствие и клавиатура меню |
/weather <город> |
Узнать погоду (например, /weather Москва) |
/subscribe |
Начать диалог подписки на рассылку |
/help |
Справка по командам |
Алиасы: Вы также можете писать "погода Лондон" или "подписаться" (или использовать кнопки меню).
command/— Обработчики команд (/start,/weather).flow/— Сценарии FSM (диалог подписки).handler/— Обработчики Callback-запросов (нажатия кнопок).config/— Конфигурация, включая глобальный обработчик ошибок (GlobalErrorHandler).service/— Бизнес-логика (запросы к API погоды).scheduler/— Периодические задачи (рассылка).entity/&repository/— Работа с базой данных.
Вот как просто реализуется шаг диалога с проверкой формата времени:
@StateAction(value = "WAIT_TIME", clearAfter = true)
public void onTimeInput(
CommandContext ctx,
@SessionData("city") String city, // Данные из прошлого шага
@Validation(pattern = "^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$") String time // Валидация
) {
// Этот метод выполнится ТОЛЬКО если время введено верно
repository.save(new Subscription(ctx.getChatId(), city, time));
ctx.reply("✅ Подписка оформлена!");
}
Made with ❤️ using Nyagram
Документация фреймворка
Документация фреймворка