Telegram-бот для создания напоминаний и просмотра погоды.
Бот работает в режиме polling, сохраняет пользователей и напоминания в PostgreSQL и отправляет сообщение в указанный момент времени.
- создание напоминаний с названием, описанием и датой/временем;
- пропуск описания при создании напоминания;
- просмотр списка всех напоминаний с пагинацией;
- удаление напоминаний по номеру;
- получение текущей погоды по названию города;
- получение своего Telegram ID;
- кнопки для отмены, возврата и повторного ввода данных.
| Команда | Описание |
|---|---|
/start |
Приветствие и старт работы с ботом |
/info |
Список всех доступных команд |
/create |
Создать новое напоминание |
/rlist |
Показать список напоминаний |
/id |
Показать ваш Telegram ID |
/help |
Связь с автором бота |
/weather |
Узнать погоду по городу |
Бот использует простую модель состояний пользователя:
1— обычный режим;2— ввод названия напоминания;3— ввод описания;4— ввод даты и времени;5— ввод города для погоды.
Когда пользователь запускает создание напоминания, бот последовательно запрашивает:
- название;
- описание;
- дату и время.
После успешного сохранения напоминание записывается в базу данных и планируется через node-schedule.
Бот принимает несколько форматов ввода даты и времени. Например:
15 03 2024 10:3015.03.2024 10:3015/03/2024 10:3015 марта 2024 10:3010:30
Если введено только время, бот подставляет текущую дату.
Команда /rlist показывает список напоминаний пользователя.
- если напоминаний больше 10, бот выводит кнопки
>>и<<для перелистывания; - кнопка
Удалить по номеруоткрывает режим выбора конкретного напоминания; - для удаления достаточно нажать кнопку с номером напоминания.
Команда /weather переводит бота в режим ввода города.
После ввода названия города бот обращается к API погоды и возвращает:
- название города;
- описание погоды;
- температуру;
- скорость ветра.
Если город не найден, бот предложит попробовать ещё раз.
.
├── index.js
├── bot.js
├── db.js
├── config.js
├── .env.example
├── handlers/
│ ├── handlers.js
│ ├── msgHandler/
│ └── dataHandler/
├── helpers/
├── models/
└── README.md
index.js— точка входа приложения, инициализация БД и регистрация хендлеров;config.js— лёгкий загрузчик переменных окружения из локального.env;bot.js— создание экземпляра Telegram Bot API черезBOT_TOKEN;db.js— подключение к PostgreSQL через Sequelize с параметрами из окружения;models/User.js— модель пользователя;models/Reminder.js— модель напоминания;handlers/handlers.js— обработка сообщений и callback-кнопок;helpers/getWeather.js— запрос погоды;helpers/generateReminderMessage.js— формирование списка напоминаний и inline-кнопок.
- Node.js 18+;
- PostgreSQL;
- Telegram Bot Token;
- доступ к интернету для запроса погоды.
- Склонируйте проект или распакуйте архив.
- Установите зависимости:
npm install- Создайте локальный файл
.envна основе.env.example:
cp .env.example .env- Заполните значения для Telegram-бота и PostgreSQL.
- Подготовьте PostgreSQL базу данных.
- Запустите приложение:
npm startПроект читает настройки из .env.
BOT_TOKEN=your_telegram_bot_token
DB_NAME=ReminderDB
DB_USER=postgres
DB_PASSWORD=12345
DB_HOST=localhost
DB_PORT=5000BOT_TOKEN— токен Telegram-бота;DB_NAME— имя базы данных PostgreSQL;DB_USER— пользователь PostgreSQL;DB_PASSWORD— пароль пользователя PostgreSQL;DB_HOST— адрес сервера PostgreSQL;DB_PORT— порт PostgreSQL.
По умолчанию в проекте используются такие параметры подключения:
- база данных:
ReminderDB - пользователь:
postgres - пароль:
12345 - хост:
localhost - порт:
5000
Эти значения можно переопределить через .env.
bot.js берёт токен из переменной окружения BOT_TOKEN.
Это позволяет безопасно хранить секреты вне репозитория и использовать разные значения для локальной разработки, тестового и боевого окружения.
- напоминания планируются в памяти процесса; после перезапуска сервера уже запланированные задания не пересоздаются автоматически;
- погодный API по-прежнему вызывается напрямую из кода;
- бот хранит состояние диалога в базе данных, поэтому несколько пользователей могут работать одновременно.
/create
→ Введите название напоминания
→ Введите описание (необязательно)
→ Введите дату
Можно пропустить описание кнопкой Пропустить.
/rlist
/weather
→ Москва