Розробка Telegram-бота у 2025: мій досвід з aiogram 3, GPT та двома хостинг-провайдерами
Вступ
Привіт! Я хочу поділитися історією свого проєкту — багатофункціонального медичного помічника в Telegram. Ідея народилася з простої потреби: мати під рукою зручний інструмент для відстеження самопочуття, який не вимагає встановлення ще одного мобільного додатку.
У цій статті я розповім про шлях від ідеї до повноцінного сервісу, що працює 24/7. Поговоримо про вибір стеку, архітектуру, інтеграцію з AI, а найцікавіше — про всі ті граблі та помилки, на які я наступив під час розгортання на хмарних платформах.
Мій стек: Python 3, aiogram 3, SQLite, OpenAI API (GPT-4o-mini), schedule, fpdf2, matplotlib, Git, Render.
Розділ 1: Від ідеї до першого прототипу
Все почалося з простого скрипту, який міг лише одне — записувати текст у базу даних. Перша версія була вкрай примітивною, але дозволяла фіксувати симптоми. Стало очевидно, що проєкт потребує «мозку», а також більш складної логіки для взаємодії з користувачем.
Розділ 2: Інтеграція AI — наймаємо «мозкового» співробітника
Я вирішив, що «мозковим центром» для аналізу симптомів має стати велика мовна модель (LLM). Я використовував API від OpenRouter, щоб мати доступ до GPT-4o-mini.
Тут я зіткнувся з першим серйозним викликом — промпт-інжинірингом. Просто сказати AI «проаналізуй симптоми» — це шлях до неточних і навіть небезпечних порад. Головною задачею було навчити модель бути корисним асистентом, а не самопроголошеним лікарем.
Наприклад, початковий промпт призводив до того, що AI міг рекомендувати конкретні ліки. Це неприпустимо. Шляхом ітерацій я прийшов до більш жорсткої інструкції:
...додай окремий розділ під назвою ’Можливі напрямки лікування, які варто обговорити з лікарем:’. У цьому розділі перелічи ТІЛЬКИ загальні класи препаратів... КАТЕГОРИЧНО ЗАБОРОНЕНО називати конкретні торгові марки...
Також я активно використовував AI як свого «асистента-програміста». Замість того, щоб годинами шукати рішення на Stack Overflow, я ставив конкретні задачі: «Напиши функцію на Python для генерації PDF за допомогою fpdf2» або «Як правильно реалізувати FSM-ланцюжок для цього сценарію в aiogram 3?». Це значно прискорило розробку.
Розділ 3: Архітектура та «граблі»
Щоб реалізувати весь функціонал, знадобилося кілька ключових архітектурних рішень.
Машина станів (FSM): Для покрокових сценаріїв, як-от «Щоденний Check-in» чи інтерактивне опитування симптомів, FSM з aiogram стала незамінною. Вона дозволила вести користувача по ланцюжку питань, збираючи дані на кожному етапі.
База даних: Початкова єдина таблиця швидко перетворилася на безлад. Я перейшов до більш структурованої схеми з окремими таблицями для користувачів (users), щоденних записів (health_entries), ліків (medications) та іншого. Це значно спростило запити та аналітику.
Планувальник: Для нагадувань про ліки та щотижневих звітів я використав просту, але надійну бібліотеку schedule, яка запускається в окремому асинхронному потоці.
Розділ 4: Біль розгортання: Від локального ПК до хмар
Це був найважчий і найнервовіший етап. Я вирішив розгорнути бота на Render. Підготував requirements.txt, Procfile, виніс токени у змінні середовища і завантажив все на GitHub. Здавалося, що може піти не так?
А потім почалося. Спочатку я зіткнувся з помилкою TelegramConflictError. Логи показували, що запущено дві копії бота. Я був впевнений, що на локальному ПК все вимкнув, але помилка не зникала. Це змусило мене пройти через кілька кіл відчаю: перезапуски, очищення кешу, і, нарешті, повне анулювання токену в @BotFather та оновлення його на сервері.
Щойно я переміг цю проблему, з’явилася нова: TelegramUnauthorizedError. Знову і знову. Я був впевнений, що копіюю правильний токен! Щоб знайти істину, я додав у код діагностичний print, який показував, який саме токен використовується. Виявилося, що змінні середовища чомусь не оновлювалися миттєво.
Я навіть спробував переїхати на інший сервіс, Railway, але зіткнувся там з обмеженнями безкоштовного тарифу. Врешті-решт, я повернувся на Render, перейшов на мінімальний платний тариф ($7/міс) і, пройшовши процедуру «тотального очищення» (зупинка сервісу -> відкликання токену -> оновлення токену -> чисте розгортання), нарешті досяг стабільної роботи.
Головний висновок цього етапу: Деплоймент — це 90% наполегливості і 10% коду.
Розділ 5: Що вийшло в результаті
Після всіх цих пригод у мене є стабільно працюючий сервіс з таким функціоналом:
- Щоденний Check-in: Відстеження настрою, сну, стресу, активності та споживання води з персональними порадами в кінці.
- Інтерактивний аналіз симптомів з AI: Покрокове опитування для точного аналізу.
- PDF-звіти для лікаря: Зручні звіти, які можна показати на прийомі.
- Гейміфікація: Стріки та досягнення для підвищення мотивації.
- Екстрена картка (/sos): Швидкий доступ до життєво важливої інформації.
- І багато іншого.
Спробувати бота можна тут: [@med_pomichnyk_bot]
Висновки та плани на майбутнє
Цей проєкт став для мене неймовірним пекельним (навчальним) досвідом. Я зрозумів, наскільки важливий правильний деплоймент, і навчився ефективно використовувати AI не як заміну, а як потужного асистента в розробці.
Зараз мій головний пріоритет — зібрати відгуки від перших користувачів. Саме вони покажуть, які функції є найціннішими і куди варто розвивати проєкт далі. Можливо, це буде інтеграція з Google Fit, а можливо, щось зовсім інше.
Дякую, що дочитали! Буду радий відповісти на ваші питання та почути будь-які відгуки в коментарях.
p.s. не судіть сильно цей проєкт, так як я новачок в цьому...і хотів довести сам собі що можу щось зробити в зовсім незнайомій для мене галузі і середовищі😊

13 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів