В этой статье мы подробно разберём, как создать собственного Таро‑бота в мессенджере Telegram. Вы получите готовые примеры кода, узнаете о необходимых инструментах и сможете быстро запустить бота, который будет делать расклады Таро, отправлять изображения карт и давать интерпретацию.
Содержание
- Что понадобится
- Создание бота через BotFather
- Настройка проекта
- Колода Таро в формате JSON
- Логика работы бота
- Примеры команд
- Развёртывание и поддержка
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
- Откройте чат с BotFather.
- Отправьте команду
/newbotи следуйте инструкциям:- Придумайте имя бота (например, TarotOracleBot).
- Придумайте уникальное юзернейм (должно оканчиваться на
bot, например Tarot_Oracle_bot).
- 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 с клавиатурой и инлайн‑кнопками.
Удачной разработки и вдохновения от карт Таро! 🍀