Увольняем гадалок: Как за 0$ собрать ИИ-бота в Telegram, который делает расклады Таро и толкует сны не хуже людей

Увольняем гадалок: Как за 0$ собрать ИИ-бота в Telegram, который делает расклады Таро и толкует сны не хуже людей

Привет всем! Услуги современных «дипломированных» магов, тарологов и толкователей снов сейчас улетают в космос. При этом эзотерика — это огромный и сверхприбыльный рынок с бешеной вовлеченностью. Как разработчику пройти мимо такого кейса?

Я решил проверить возможности современных LLM-моделей и переложить мистику на плечи искусственного интеллекта. Нейросеть ведь прочитала все книги по психоанализу, досконально знает архетипы К. Г. Юнга и помнит значения всех 78 карт Таро.

В итоге получился полноценный эзотерический Telegram-бот на базе ИИ-агентов, который умеет делать глубокий психологический разбор раскладов Таро и детально толковать сны по системе Миллера. Главная фишка кейса — абсолютная бесплатность инфраструктуры. Бот работает на постоянной основе 24/7, имеет собственный домен, базу данных, а его мозг — связка мощных моделей через API, которая не стоит мне ни цента.

Ниже я без купюр разберу архитектурные мины n8n v2, специфику облака Oracle Cloud, а также поделюсь тем, как планирую монетизировать проект с помощью одной простой продуктовой фишки. Поехали!

Архитектура системы и n8n v2

В качестве визуального бэкенда для проектирования логики я выбрал n8n v2. Это no-code/low-code инструмент для автоматизации, который позволил собрать сложнейший асинхронный автомат состояний без написания сотен строк шаблонного кода для Telegram API.

Вся сессионная логика (состояния sonnik_waiting, taro_waiting, processing) завязана на внутренние Data Tables n8n. Это позволило полностью отказаться от разворачивания отдельной PostgreSQL или Redis, сэкономив ресурсы сервера.

Поток запроса выглядит так: пользователь нажимает кнопку ──> Telegram шлет HTTPS Webhook на сервер ──> n8n проверяет состояние в таблице ──> маршрутизатор распределяет логику на ветку Сонника или Таро ──> код собирает промпты ──> ИИ-Агент выдает ответ в HTML-формате

Грабли №1: Как бесплатно выдать боту «мировой» HTTPS-адрес

Telegram категорически отказывается слать вебхуки на незащищенные http:// протоколы или голые IP-адреса. Нужен домен и SSL-сертификат. Решаем задачу в три шага за 0$:

  1. Сервер: Регистрируем виртуальную машину Oracle Cloud Always Free (1-2 ГБ RAM для n8n хватает с головой).
  2. Домен: Чтобы не платить регистраторам, используем бесплатный динамический DNS-сервис DuckDNS. Он выдает домен третьего уровня вида yourbot.duckdns.org и привязывает его к белому IP-адресу инстанса Oracle.
  3. Шифрование: В терминале сервера разворачиваем Nginx в связке с Certbot (Let's Encrypt). Certbot проверяет наш домен и генерирует валидный SSL-сертификат, а Nginx пробрасывает трафик на внутренний порт n8n (5678).

Грабли №2: Архитектурные мины n8n v2 на удаленном сервере

При переносе проекта с локального ПК на боевой Linux-сервер Oracle мы столкнулись с неочевидным поведением n8n v2.

Мина 1: Конфликт типов данных (String vs Number)

Telegram API передает уникальный идентификатор пользователя chat_id как текстовую строку. Однако современные Data Tables в n8n на сервере требуют строгой типизации. Если колонка в базе определена как Number, попытка записать туда строку валит ноду с ошибкой.

  • Решение: Принудительное приведение типов на уровне выражений (Expressions):
{{ Number($('Telegram Trigger').item.json.callback_query?.message?.chat?.id || $('Telegram Trigger').item.json.message?.chat?.id) }}

Мина 2: Падение потока на пустой выборке (Empty Results)

В конце успешной сессии нода delete_rows очищает базу в целях конфиденциальности. Когда пользователь пишет следующее сообщение, нода data_table_get пытается найти его статус, видит пустую таблицу и аварийно останавливает весь воркфлоу, считая это критической ошибкой. Сигнал до обработчика случайного текста просто не доходил.

  • Решение: В настройках (Settings) ноды data_table_get активируем тумблер Always Output Data. Теперь нода в любом случае отдаст пустой JSON-объект [{}], который полетит дальше по конвейеру, активируя кнопку «Перезапустить бота».

Умный динамический Merge вместо капризных стандартных нод

Поскольку Сонник и Таро работают в изолированных ветках, на вход ИИ-Агента должен приходить унифицированный JSON. Использование стандартной ноды Merge (Choose Branch) в n8n v2 вызывало задержки валидации. Мы заменили её на автономную ноду Code (Merge_Prompts):

let tarot = []; let dreams = []; try { tarot = $("prepare_tarot_prompts").all(); } catch (e) {} try { dreams = $("prepare_dreams_prompts").all(); } catch (e) {} if (tarot.length > 0 && tarot[0].json?.ai_user_prompt) { return tarot; } else if (dreams.length > 0 && dreams[0].json?.ai_user_prompt) { return dreams; } return [{}];

Она отдает ИИ-Агенту чистые переменные, решая проблему пустых ответов (когда LLM путалась в контекстах выполнения веток).

Промпты, психология и гендерный нейтралитет

Интересный вызов подкинул расклад Таро «Вокзал для двоих» (7 карт, описывающих мысли, чувства и поведение обеих сторон).

Изначально ИИ-агенту было жестко приказано соблюдать гендерный нейтралитет и обращаться к пользователю исключительно на «Вы», так как пол человека до старта неизвестен. Но из-за этого для второй стороны (партнера) бот генерировал роботизированные заголовки вроде «Партнер А» / «Партнер Б», либо путал местоимения, выдавая мужчине, гадающему на жену, фразы в духе «Его мысли: Королева Кубков».

Я решил эту проблему точечным изменением структуры промпта в prepare_tarot_prompts. Вместо навязывания жестких местоимений, мы перевели заголовки позиций расклада на универсальный интерактивный формат:

- «r_love_7»: 1. Отношения в паре на данный момент; Столбик Кверента (Вы): 2. Ваши мысли, 3. Ваши чувства, 4. Ваше поведение; Столбик Партнера: 5. Мысли Вашего партнера, 6. Чувства Вашего партнера, 7. Поведение Вашего партнера.

А в системные инструкции добавили строгое табу: Never use terms like "Партнер А" or "Партнер Б". Теперь текст читается как глубокий, дорогой психологический разбор, адаптированный под любую пару.

Бизнес-модель: Зачем делать бота бесплатным?

Поскольку запросы к ИИ-моделям требуют мощностей, содержать полностью бесплатного бота на дистанции — сомнительное удовольствие. Но я внедрил классическую маркетинговую связку: Лид-магнит + Обязательная подписка (ОПП).

Чтобы получить расклад Таро или толкование своего сна абсолютно бесплатно, пользователь должен подписаться на мой эзотерический Telegram-канал. Бот автоматически проверяет подписку через API и только после этого выдает ответ.

В чём выгода? Бот с базой ИИ имеет огромную вирусную ценность. Люди будут приходить за бесплатными гаданиями, автоматически превращаясь в подписчиков канала. Как только живая аудитория на канале вырастет, проект начнет окупаться и приносить чистую прибыль за счет продажи рекламы другим тарологам, астрологам и эзотерикам. Рынок рекламы в этой нише огромный и щедрый.

Проект запущен, работает как часы и полностью готов к нагрузкам.

👉 Протестировать ИИ-мистику на себе можно здесь: @taro_sonnik_ai_bot

Буду рад вашему фидбеку и вопросам по архитектуре n8n в комментариях! Заменит ли ИИ живых гадалок, или у роботов «нет души» для работы с подсознанием? :)