Как создать собственного Таро‑бота в Telegram

Хочешь личного предсказателя? Инструкция, как запустить Таро-бота в Telegram с раскладами и картами. Простой код для новичков!

В этой статье мы подробно разберём, как создать собственного Таро‑бота в мессенджере Telegram. Вы получите готовые примеры кода, узнаете о необходимых инструментах и сможете быстро запустить бота, который будет делать расклады Таро, отправлять изображения карт и давать интерпретацию.

Содержание

  1. Что понадобится
  2. Создание бота через BotFather
  3. Настройка проекта
  4. Колода Таро в формате JSON
  5. Логика работы бота
  6. Примеры команд
  7. Развёртывание и поддержка

Telegram‑боты – это удобный способ автоматизировать любые задачи в чатах. Таро‑бот может выполнять:

  • Одноразовый расклад «Карта дня»;
  • Классические расклады (Кельтский крест, три карты и т.д.);
  • Отправку изображений карт с описанием;
  • Сохранение истории раскладов для пользователя.

Мы будем использовать язык Python и популярную библиотеку python-telegram-bot. Всё, что вам понадобится – это базовые знания Python и доступ к серверу (можно использовать бесплатный Heroku, Railway или любой VPS).

Что понадобится

  • Учётная запись в Telegram.
  • Бот, созданный через BotFather (получите токен).
  • Python 3.8+ установленный на локальном компьютере или сервере.
  • Библиотеки:
    pip install python-telegram-bot==20.3
    pip install aiohttp
    pip install pyyaml
  • Колода Таро в виде JSON‑файла (пример ниже).
  • Опционально: Docker‑образ для удобного развёртывания.

Создание бота через BotFather

  1. Откройте чат с BotFather.
  2. Отправьте команду /newbot и следуйте инструкциям:
    • Придумайте имя бота (например, TarotOracleBot).
    • Придумайте уникальное юзернейм (должно оканчиваться на bot, например Tarot_Oracle_bot).
  3. BotFather пришлёт вам токен. Сохраните его в безопасном месте – он понадобится в коде.

Настройка проекта

Создаём простую структуру проекта:

tarot_bot/
├── bot.py
├── tarot_deck.json
├── requirements.txt
└── config.yaml # хранит токен и настройки

config.yaml

telegram:
 token: "YOUR_TELEGRAM_BOT_TOKEN"
 allowed_users: [] # если пусто – доступ всем
logging:
 level: INFO

tarot_deck.json

Ниже минимальный пример колоды из 22 старших арканов. В реальном проекте добавьте изображения и более подробные описания.

[
 { "id": 0,
 "name": "Шут",
 "image": "https://example.com/tarot/0_fool.jpg",
 "keywords": ["новый старт", "наивность", "риски"],
 "description_upright": "Смелый шаг в неизвестность, открытость новым возможностям.",

 "description_reversed": "Беспечность, глупые поступки, отсутствие плана."
 },
 {
 "id": 1,
 "name": "Маг",
 "image": "https://example.com/tarot/1_magician.jpg",
 "keywords": ["воля", "манифестация", "творчество"],
 "description_upright": "Умение использовать ресурсы, концентрация и действие.",
 "description_reversed": "Обман, неумение реализовать задуманное."
 }
 /* … остальные карты … */
]

Логика работы бота

Основные функции бота:

  • /start – приветствие и инструкция.
  • /card – случайная карта (в прямом или перевёрнутом виде).
  • /spread – расклад из нескольких карт (например, три‑карточный).
  • /help – список доступных команд.

Код bot;py

#!/usr/bin/env python3
import logging
import random
import json
import yaml
from pathlib import Path
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
 ApplicationBuilder,
 CommandHandler,
 ContextTypes,
 CallbackQueryHandler,
)

CONFIG_PATH = Path(__file__).parent / "config.yaml"
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
 cfg = yaml.safe_load(f)

TOKEN = cfg["telegram"]["token"]
ALLOWED_USERS = set(cfg["telegram"]["allowed_users"])

logging.basicConfig(
 format="%(asctime)s ― %(name)s ― %(levelname)s ― %(message)s",
 level=getattr(logging, cfg["logging"]["level"]),
)
logger = logging.getLogger(__name__)

DECK_PATH = Path(__file__).parent / "tarot_deck.json"
with open(DECK_PATH, "r", encoding="utf-8") as f:
 DECK = json.load(f)

def get_random_card:
 """Возвращает случайную карту и флаг перевёрнутости."""
 card = random.choice(DECK)
 reversed_flag = random.choice([True, False])
 return card, reversed_flag

def format_card_message(card, reversed_flag):
 """Генерирует текстовое сообщение о карте."""
 orientation = "перевёрнутая" if reversed_flag else "прямая"
 description = (
 card["description_reversed"]
 if reversed_flag
 else card["description_upright"]
 )
 keywords = ", ".join(card["keywords"])
 return (
 f"{card['name']} ({orientation})
"
 f"Ключевые слова: {keywords}

"
 f"{description}"
 )

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
 if ALLOWED_USERS and str(update.effective_user.id) not in ALLOWED_USERS:
 await update.message.reply_text("❌ У вас нет доступа к этому боту.")
 return

 text = (
 "Привет! Я Таро‑бот 🃏.
"
 "Я могу вытянуть карту, сделать расклад и объяснить её значение.

"
 "Доступные команды:
"
 "/card – случайная карта
"
 "/spread – три‑карточный расклад
"
 "/help – справка"
 )
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
 await start(update, context) # переиспользуем приветствие

async def card_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
 if ALLOWED_USERS and str(update.effective_user.id) not in ALLOWED_USERS:
 await update.message.reply_text("❌ У вас нет доступа к этому боту.")
 return

 card, rev = get_random_card
 caption = format_card_message(card, rev)

 # Отправляем изображение с подписью
 await context.bot.send_photo(
 chat_id=update.effective_chat.id,
 photo=card["image"],
 caption=caption, )

async def spread_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
 if ALLOWED_USERS and str(update.effective_user.id) not in ALLOWED_USERS:
 await update.message.reply_text("❌ У вас нет доступа к этому боту.")
 return

 # Трёхкарточный расклад: прошлое – настоящее – будущее
 positions = ["Прошлое", "Настоящее", "Будущее"]
 cards = [get_random_card for _ in range(3)]

 media = []
 for (card, rev), pos in zip(cards, positions):
 caption = f"{pos}: {format_card_message(card, rev)}"
 media.append(
 {
 "type": "photo",
 "media": card["image"],
 "caption": caption, }
 )

 # Telegram API позволяет отправлять группы медиа через send_media_group
 await context.bot.send_media_group(
 chat_id=update.effective_chat.id,
 media=[telegram.InputMediaPhoto(**m) for m in media]
 )

def main:
 app = ApplicationBuilder.token(TOKEN).build

 app.add_handler(CommandHandler("start", start))
 app.add_handler(CommandHandler("help", help_command))
 app.add_handler(CommandHandler("card", card_command))
 app.add_handler(CommandHandler("spread", spread_command))

 logger.info("Бот запущен")
 app.run_polling

if __name__ == "__main__":
 main

Примеры команд и их вывод

/card

Бот отправит изображение случайной карты с описанием. Пример сообщения:

<b>Шут</b> (прямая)
<i>Ключевые слова:</i> новый старт, наивность, риски

Смелый шаг в неизвестность, открытость новым возможностям.

/spread

Трёхкарточный расклад «Прошлое – Настоящее – Будущее». Бот отправит три фото в виде медиа‑группы, каждое с подписью.

Развёртывание и поддержка

  • Локальный запуск: python bot.py – удобно для отладки.
  • Docker:
    FROM python:3.11-slim
    WORKDIR /app
    COPY . /app
    RUN pip install -r requirements.txt
    CMD ["python", "bot.py"]

    Затем собрать образ docker build -t tarot-bot . и запустить docker run -d --restart unless-stopped tarot-bot.

  • Облачные платформы (Heroku, Railway, Render) – достаточно добавить репозиторий и указать переменную окружения TELEGRAM_TOKEN.
  • Обновление колоды: просто замените tarot_deck.json и перезапустите процесс.

Создание Таро‑бота в Telegram – отличный способ практиковать навыки программирования, а также предложить пользователям интересный сервис. В статье мы рассмотрели:

  • Регистрацию бота через BotFather;
  • Подготовку окружения и зависимостей;
  • Структуру проекта и пример JSON‑колоды;
  • Полный пример кода с обработкой команд;
  • Способы развёртывания и дальнейшего развития.

Теперь вы можете расширять бота: добавлять новые расклады, сохранять историю в базе данных, интегрировать AI‑модели для более гибкой интерпретации, а также оформлять красивый UI с клавиатурой и инлайн‑кнопками.

Удачной разработки и вдохновения от карт Таро! 🍀