Как новичку подарить жизнь telegram-боту на java
Как все начиналось
Мне 43 года и я профессиональный юрист. Неуемная интеллектуальная энергия и неудовлетворенность основной профессией 2,5 года назад привели меня в IT. Да-да, вот так — взрослая тетя с гуманитарным образованием решила попробовать себя на ниве программирования и замахнулась аж на такой язык как… JAVA!
Замахнулась, переквалифицировалась на дистанционных курсах одного крупного рогатого скота образовательного ресурса и, поскольку прагматичная жажда наживы необходимость зарабатывать на кусок хлеба с маслом здесь и сейчас не дает ей возможности оставить основное место работы и уйти на неведомые просторы для it-специалиста, решила совместить опыт юриста и знания java-разработчика.
Оглянувшись по сторонам и не встретив направленных на меня глаз, я поняла — все эти глаза устремлены в гаджеты! Месседжеры и социальные сети правят умами. Значит, надо действовать через них.
И тут я вспомнила, что самый частый юридический вопрос, с которым ко мне обращаются друзья/знакомые — это просьба дать ту или иную форму документа (договора, расписки, заявления, доверенности и т.д.). Эврика! — нужна несложная мобильная программа с формами самых востребованных документов, чтобы их оставалось просто скачать и наполнить необходимыми сведениями. И тут самым коротким путем к конечному пользователю мне представился telegram-бот.
Поскольку на курсах таким тонкостям не учили, вооружившись статьями и видеороликами из всемирной паутины, закатав рукава я принялась создавать свою первую «взрослую» программу-помощника человечеству!
Про регистрацию бота через BotFather, структуру кода и возможности Telegram Bot Api создано достаточно статей и видео-уроков, чтобы новичок самостоятельно написал программу, прекрасно функционирующую в среде разработки (у меня это IntelliJ IDEA Community Edition).
Но вот с какими трудностями я столкнулась после того, как мой бот стал отвечать на команды и успешно присылать в чат формы документов:
Бот должен сохранять посетителей в базе данных для последующего использования статистики его востребованности независимо от того, на каком оборудовании этот бот запущен;
Бот должен жить сам по себе, не завися от работоспособности и активности моего ноутбука.
Да, есть Docker, который позволит собрать программу со всеми зависимостями и взаимодействиями с другими приложениями. Но, как новичку, использование Dockerа в такой простой программе как telegram-бот мне показалось несопоставимо сложно (особенно, если учесть специфику Windows 10 Home (кто знает, о чем речь, тот поймет, как «устают ноги в танцах с бубнами» при установке Docker на эту операционную систему). Поэтому нужен был какой-то более просто инструмент.
Трудности были также в вопросе деплоя и запуска программы — основная масса статей и инструкций, помогающих новичку дать независимую жизнь своему боту, касается ботов, написанных на Python, а также посвящены платформам Heroku и DigitalOcean hosting, которые с марта 2022 года практически недоступны российскому пользователю (если через VPN доступ к самим ресурсам еще возможен, то оплатить их услуги во сто крат сложнее, чем установить Docker на Windows 10 Home).
Выход найден!
Для решения своих проблем я решила использовать один из хостингов, без проблем функционирующих в России, поддерживаюobq использование баз данных MySQL и управление ими, а также предоставляющий в аренду виртуальный VPS, куда можно выгрузить и запустить своего бота!
Для создания исполняемого jar-файла (для запуска его на виртуальных ресурсах), я использовала плагин Apache Assembly (build моего файла pom.xml):
Процесс выгрузки telegram-бота на VPS (после регистрации и создания виртуального сервера Ubuntu 22.04 с SSL-сертификатом):
1. Для общения с VPS установить клиент удалённого доступа (у меня — PuTTY) , открыть его и подключиться к своему серверу. Все требуемые данные для входа предоставляются провайдером после аренды VPS (в т.ч. присылаются на электронную почту).
2. В открывшемся терминале ввести имя пользователя и пароль.
Установить необходимые пакеты, введя команды:
Для обновления: apt update
Для установки нужного пакета Java (в моем в проекте использована 11-я версия): apt-get install openjdk-11-jdk.
Для проверки, установилась ли нужная версия, ввести: java -version.
Для установки утилиты screen (консольная утилита, позволяющая в действующей SSH сессии открывать виртуальные терминалы, чтобы после завершения удалённого подключения бот продолжал работать в независимом режиме): install screen.
Перенести бот на сервер: для передачи на сервер файлов бота установить FTP-клиент (у меня — FileZilla), в котором активироваться (данные для входа те же, что предоставил провайдер для сервера),
после чего полностью перенести всю директорию с приложением в root (вместе с исполняемым jar-файлом)
5. Запустить бота на сервере:
в терминале PuTTY выполнить команду, создающую screen, который будет поддерживать непрерывную работу приложения: screen -S docBot (где docBot — имя директории с проектом).
в этом скрине перейти в директорию, где расположен исполняемый jar-файл: cd /root/docBot/out/artifacts/docBot_jar,
запустить jar-файл, для чего ввести: java -jar docBot.jar
В случае успеха в терминале PuTTY отобразятся те же процессы, что и в консоли среды разработки. После можно выйти из клиента.
Отдельно следует обратить внимание на такой нюанс: функционал моего бота был основан на отправке пользователю готовых форм документов в формате word. Такие формы хранились в соответствующей папке в директории /src/main/resources/…
После переноса бота на удаленный сервер и его запуска, при кажущейся беспроблемной самостоятельной жизни программы у меня перестали отправлять файлы пользователю, вместо этого в терминале PuTTY стала выдаваться ошибка: «I/O exception (java.io.FileNotFoundException) caught when processing request to {s}→https://api.telegram.org:443: src/main/resources/… (No such file or directory)»
При этом в среде разработки все по-прежнему функционировало без проблем.
За пару часов кипящего мозга ко мне пришло озарение, что «ларчик открывается очень просто»: поскольку директорию с ботом мы перенесли в root сервера, путь к файлам изменился, и необходимо внести соответствующие корректировки в тех местах кода, где указан путь к файлам (у меня это были классы пакета handler, содержащие в наименовании »… PathsConst.java», где в константе, определяющей начало пути до файла, я дополнительно указала расположение »/root/docBot/src/…»).
Пересобрала бот, перезалила его на сервер через все тот же FileZilla, закрыла предыдущий screen (сперва использовала команду screen -ls, чтобы найти имя сеанса, который хочу закрыть, после чего ввела команду screen -X -S «sessionname» quit), открыла новый и запустила jar-файл обновленного бота.
И, вуаля, все чудесным образом работает уже какой день.
Заключение
Выпуская своего бота в большой мир из маленького мира среды разработки на ноутбуке я поняла, что самым простым в его рождении было — это написание кода. На курсах нас не учили, как коду воплотиться во что-то завершенное и обрести самостоятельность. Пройдя пошаговый путь от разработки до деплоя я захотела поделиться с другими новичками результатами этого пути, которые может быть опытному программисту покажутся смешными и ничего не стоящими, но когда трудности возникают на пути джуниора, они ему кажутся порой непреодолимыми препятствиями, о которые бьешься, ломаешь копья и либо все бросаешь, либо рушишь эти преграды и, окрепнув, идешь дальше.
В конце концов без статей других энтузиастов и альтруистов для таких it-малышей как я не было бы и моего бота)).
Если интересно, код бота с демонстрацией функционала выложен: GitHub.
Адрес бота: Формы документов.