Skip to content

Telegram-бот на вебхуках с отправкой и приёмом файлов, Spring, БД Redis, генерация файлов Word и Excel с помощью Apache POI, релиз на Heroku

License

Notifications You must be signed in to change notification settings

zhennik26/writeReadRightBot

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Что это?

Telegram-бот для генерации готового для печати Word-файла, содержащего задания для запоминания правописания словарных слов русского языка

Пользователь может использовать встроенные словари для 1-4 классов и формировать собственный, используя инструменты бота

Бот принесёт пользу родителям, которые хотят подтянуть грамотность своих детей

Статья на Хабре

Лицензия

Этот проект лицензируется в соответствии с лицензией Apache 2.0

Подробности в файле LICENSE

Попробовать

@WriteReadRightBot доступен в Telegram

Автор

Сергей Козырев

Контакты для связи

Telegram @taksebe

Создано с помощью

Java™ SE Development Kit 11.0.5

Spring Framework

Git - управление версиями

GitHub - репозиторий

Redis - СУБД

Telegram Bots - взаимодействие с Telegram

Apache Maven - сборка, управление зависимостями

Apache POI - создание файлов Word и Excel

Lombok - упрощение кода, замена стандартных java-методов аннотациями

Heroku - деплой, хостинг

Полный список зависимостей и используемые версии компонентов можно найти в pom.xml

Сборка и запуск

Перед сборкой необходимо создать бота с помощью BotFather и сохранить его имя и токен (они понадобятся для запуска)

Далее

git clone https://github.com/taksebe-official/writeReadRightBot

Создать в проекте файл src/main/resources/application.yaml (или .properties, если Вам так привычнее)

Добавить в него настройки Telegram:

telegram.api-url: "https://api.telegram.org/"
telegram.user: <имя бота, полученное от BotFather>
telegram.token: <токен бота, полученный от BotFather>
telegram.webhook-path: <см чуть ниже>
server.port: <см чуть ниже>

Для получения настроек telegram.webhook-path и server.port при локальной отладке можно использовать прекрасную утилиту ngrok, здесь инструкция конкретно для вебхуков Telegram

Далее нужно добавить в тот же файл настройки подключения к БД Redis:

spring.redis.database: 0
spring.redis.host: <хост БД Redis>
spring.redis.port: <порт БД Redis>
spring.redis.password: <пароль БД Redis>
spring.redis.ssl: true

Можно уже на этом этапе использовать Heroku Redis. Для создания БД необходимо:

  • Зарегистрироваться на Heroku
  • Создать проект - New/Create new app в правой части экрана
  • Перейти на вкладку Resources
  • В разделе Add-ons ввести в поисковую строку "Heroku Redis", выбрать её в результатах поиска
  • Подтвердить подключение БД к проекту
  • В правом верхнем углу нажать на иконку в виде квадрата из синих точек, выбрать пункт Data, в открывшемся списке баз нажать на только что созданную. Первые несколько минут после подключения может тормозить и показывать ошибку
  • Перейти на вкладку Settings
  • Нажать на кнопку View credentials в правой части экрана
  • Вуаля, перед Вами настройки подключения к БД. Скопируйте их в Ваш файл application
Учтите, что эти настройки Heroku периодически меняет, поэтому иногда нужно будет заново копировать их в Ваш проект

Далее:

mvn clean install
java $JAVA_OPTS -jar target/write-read-1.0-SNAPSHOT.jar

Порядок развёртывания на Heroku

Проект писался для релиза на Heroku и содержит специфический для этой площадки файл system.properties, в котором нужно указать версию Java, если она отлична от 8. Ещё один специфический для Heroku файл Procfile в данном случае можно не добавлять, он будет сгенерирован автоматичеки на основе pom.xml

Сначала нужно обязательно удалить/закомментировать в файле src/main/resources/application.yaml (или .properties) настройки подключения к БД - она подцепится автоматически, поскольку подключена к проекту на Heroku. Если оставить эти настройки, ничего не заведётся, они нужны только для внешнего подключения к этой БД

Погнали:

//предварительно зарегистрироваться на Heroku
heroku login
heroku create <имя приложения>

Далее зайти на Heroku и добавить в созданный проект БД Heroku Redis (инструкция выше в этом ReadMe, в разделе "Сборка и запуск")

Далее:

mvn clean install
git push heroku master
//установить количество контейнеров (dynos) для типа процесса web
heroku ps:scale web=1

В интерфейсе управления приложением в личном кабинете на Heroku можно перейти к логам (прячутся под кнопкой More в правом верхнем углу) и убедиться, что приложение запущено

Далее необходимо зарегистрировать webhook в Telegram - для этого нужно отправить в любом браузере ссылку вида:

https://api.telegram.org/bot<токен бота от Botfather>/setWebhook?url=<URL веб-приложения на Heroku>

URL веб-приложения можно получить, нажав на кноку Open app (в правом верхнем углу) - приложение откроется в новой вкладке, необходимо скопировать URL в адресной строке

Теперь можно проверять бота непосредственно в Telegram

При необходимости в интерфейсе управления приложением на вкладке Deploy можно переключить деплой на GitHub-репозиторий (по запросу или автоматически)

Что можно доделать

Как известно, Heroku гасит веб-приложения, которые не используются какое-то время, поэтому на первое сообщение бот может отвечать порядка 8-10 секунд - он ждёт, когда приложение развернётся с нуля. Это позволяет на бесплатном тарифе хостить много редко используемых веб-приложений - в тарифе учитывается только время аптайма

Чтобы заставить приложение работать постоянно, можно добавить в проект пинг по расписанию условного Google, но нужно понимать, что в этом случае бот будет съедать львиную долю бесплатного тарифа. Я жадный, я так делать не буду:)

Отдельное спасибо

Владу, который всё ещё возится со мной, неразумным, хотя, казалось бы, я уже давно должен был повзрослеть

About

Telegram-бот на вебхуках с отправкой и приёмом файлов, Spring, БД Redis, генерация файлов Word и Excel с помощью Apache POI, релиз на Heroku

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%