Создание интерактивных карт Таро, которые переворачиваются при нажатии — это отличный способ повысить вовлеченность пользователей в вашем Telegram-боте или Mini App. В этой статье мы разберем три основных подхода к реализации этой механики: от простых ботов на Inline-кнопках до современных Telegram Mini Apps с полноценной 3D-анимацией.
Способ 1: Telegram Bot API (Inline-кнопки) — «Эмуляция» переворота
Это классический способ работы через Bot API. Настоящей анимации переворота здесь нет, но мы создаем иллюзию за счет редактирования сообщения (editMessageMedia или editMessageText + editMessageReplyMarkup).
Логика работы:
- Бот отправляет сообщение с фото «Рубашки» карты и Inline-кнопкой «Перевернуть» (или просто делает всю карту кнопкой).
- Пользователь нажимает кнопку -> приходит
CallbackQuery. - Бот выбирает случайную карту (или берет заранее определенную).
- Бот вызывает
editMessageMedia, заменяя фото рубашки на фото лицевой стороны карты. - Клавиатура меняется: кнопка «Перевернуть» исчезает или меняется на «Новый расклад» / «Толкование».
Пример кода (Python / aiogram 3.x):
# Обработчик нажатия на кнопку "Перевернуть"
@router.callback_query(F.data == "flip_card")
async def flip_card_handler(callback: CallbackQuery, bot: Bot):
# 1. Генерируем карту (упрощенно)
card_name = "The Fool" # В реальности — случайный выбор из колоды
card_image_url = f"https://example.com/tarot/{card_name}.jpg"
back_image_url = "https://example.com/tarot/back.jpg"
# 2. Новая клавиатура (без кнопки переворота, с действиями)
new_keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="📖 Толкование", callback_data=f"meaning_{card_name}")],
[InlineKeyboardButton(text="🔄 Новый расклад", callback_data="new_spread")]
])
# 3. Редактируем медиа (меняем картинку)
# Важно: используем InputMediaPhoto
try:
await callback.message.edit_media(media=media, reply_markup=new_keyboard)
await callback.answer("Карта перевернута! ✨")
except Exception as e:
# Если сообщение не изменилось (например, тапнули дважды)
await callback.answer("Уже перевернуто", show_alert=False)
Плюсы:
- Работает на всех платформах (Android, iOS, Desktop, Web) без исключений.
- Не требует хостинга для веб-приложения (достаточно сервера для бота).
- Простая реализация за 15 минут.
Минусы:
- Нет анимации. Картинка меняется мгновенно («мигание»).
- Задержка сети (Round-trip к серверу Telegram) создает лаг 0.5–2 сек.
- Сложно сделать «переворот назад» (на рубашку) без лишних сообщений.
Способ 2: Telegram Mini Apps (Web Apps) — Настоящая 3D-анимация (Рекомендуемый)
Технологический стек:
- Фреймворк: React / Vue / Svelte / Vanilla JS (любой, собирающийся в статику).
- Стили: CSS 3D Transforms (
transform-style: preserve-3d,rotateY). - SDK:
@twa.dev/sdkилиtelegram-web-app.jsдля связи с ботом (закрытие, отправка данных, MainButton). - Хостинг: Vercel, Netlify, GitHub Pages, VPS (HTTPS обязателен).
Реализация CSS Flip-эффекта (Vanilla JS / React):
<div class="tarot-card" onclick="flipCard(this)">
<div class="card-inner">
<div class="card-face card-back">
<img src="/assets/card_back.png" alt="Рубашка" />
&div>
<div class="card-face card-front">
<img src="/assets/cards/the_fool.png" alt="Шут" />
</div>
</div>
</div>
CSS (Суть магии):
.tarot-card {
width: 100%;
max-width: 300px;
aspect-ratio: 2 / 3.5; /* Пропорции Таро /
perspective: 1000px; / Глубина 3D /
cursor: pointer;
-webkit-tap-highlight-color: transparent; / Убираем подсветку тапа на iOS /
}
.card-inner {
position: relative;
width: 100%;
height: 100%;
text-align: center;
transition: transform 0.8s cubic-bezier(0.4, 0.0, 0.2, 1); / Плавность /
transform-style: preserve-3d; / ВАЖНО: сохраняет 3D детей /
box-shadow: 0 10px 30px rgba(0,0,0,0.3);
border-radius: 16px;
}
.tarot-card.flipped .card-inner {
transform: rotateY(180deg);
}
.card-face {
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden; / Скрываем заднюю грань /
backface-visibility: hidden;
border-radius: 16px;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.card-front {
transform: rotateY(180deg); / Лицевая сторона изначально перевернута /
background: #fff;
}
.card-back {
background: linear-gradient(145deg, #1a1a2e, #16213e); / Красивая рубашка /
z-index: 2; / Поверх лицевой до переворота */
}
.card-face img { width: 100%; height: 100%; object-fit: cover; }
JavaScript (Логика):
function flipCard(element) {
// Защита от двойного тапа во время анимации
if (element.classList.contains('flipping')) return;
element.classList.add('flipping');
// Если карта еще не перевернута -> переворачиваем
if (!element.classList.contains('flipped')) {
// 1. Загружаем данные карты (API бота или локально)
// await loadCardData(element);
element.classList.add('flipped');
// 2. Показываем кнопку "Толкование" в Telegram UI (MainButton)
// Telegram.WebApp.MainButton.setText("📖 Узнать значение").show;
} else {
// Логика "перевернуть обратно" (опционально)
element.classList.remove('flipped');
}
// Снимаем блокировку после окончания анимации (0.8s = 800ms)
setTimeout( => element.classList.remove('flipping'), 800);
}
Интеграция с Telegram Bot (Backend):
Mini App не хранит состояние колоды безопасно. Логика расклада должна быть на сервере.
- Mini App открывается с параметрами
startapp=spread_3_cards. - При загрузке Mini App делает
fetchк вашему API:GET /api/spread?type=3_cards&user_id=.... - Бэкенд возвращает JSON:
[{id: 1, name: "The Fool", img: "...", is_reversed: false}, ...]. - Фронтенд рендерит 3 карты «рубашкой вверх».
- По тапу на конкретную карту -> флип -> подгрузка толкования (или оно уже в JSON).
- Кнопка MainButton (низу экрана) -> «Сохранить расклад» / «Поделиться» -> вызывает
Telegram.WebApp.sendData(JSON.stringify(result))-> бот получаетweb_app_dataи сохраняет в БД/присылает красивый отчет.
- Нативная 60 FPS анимация (GPU-ускорение).
- Звуки, вибрация (
Telegram.WebApp.HapticFeedback.impactOccurred('medium')), частицы, шейдеры. - Работает офлайн (Service Workers) после первого захода.
- Полный контроль UX: свайпы, зум, поворот телефона.
- Требует HTTPS-хостинга и домена.
- Сложнее в разработке (нужен фронтенд-разработчик).
- На очень старых устройствах (Android < 6, iOS < 12) могут быть баги с
backface-visibility(решается полифиллами или фоллбэком на 2D).
Способ 3: Telegram Web App + Canvas / WebGL (Three.js / PixiJS), Для AAA-уровня
Если вы делаете «Игру в Таро» с физикой карт (перемешивание руками, раздача веером, реалистичное изгибание бумаги), CSS 3D не справиться. Нужен Canvas/WebGL.
- Three.js — 3D сцена, реалистичное освещение, тени, изгиб карты (vertex shader displacement).
- PixiJS, 2D WebGL рендерер, очень быстрый, отлично подходит для «псевдо-3D» флипов с искажением перспективы.
- GSAP (GreenSock) — для сложных таймлайнов анимаций (перемешивание -> раздача -> флип).
Пример идеи: Пользователь тапает «Перемешать» -> карты на экране физически перемешиваются (physics engine) -> пользователь тапает на одну -> она подлетает к центру и плавно переворачивается с эффектом «свечения».
Сложность: Высокая. Требует опыта с графикой. Обычно избыточно для обычного бота-таролога.
Архитектура данных: Как хранить колоду и расклады
Независимо от способа отображения, данные должны быть структурированы.
Пример схемы БД (PostgreSQL / MongoDB):
-- Таро колода (78 карт)
CREATE TABLE tarot_cards (
id SERIAL PRIMARY KEY,
arcana_type VARCHAR(20), -- 'major' | 'minor'
suit VARCHAR(20), -- 'wands', 'cups', 'swords', 'pentacles' (для minor)
number INT, -- 0-21 (major), 1-14 (minor)
name_ru VARCHAR(100), -- 'Шут', 'Туз Кубков'
name_en VARCHAR(100),
meaning_upright TEXT, -- Прямое значение
meaning_reversed TEXT, -- Перевернутое значение
img_front_url VARCHAR(255),
img_back_url VARCHAR(255) -- Обычно одна на все
);
-- Расклады пользователей
CREATE TABLE spreads (
id UUID PRIMARY KEY DEFAULT gen_random_uuid,
user_id BIGINT NOT NULL, -- Telegram User ID
spread_type VARCHAR(50), -- 'three_cards', 'celtic_cross', 'yes_no'
cards JSONB NOT NULL, -- [{card_id: 1, position: 'past', is_reversed: false}, ...]
question TEXT,
created_at TIMESTAMP DEFAULT NOW
);
Алгоритм «Честного» расклада (Provably Fair):
Чтобы пользователь доверял боту, используйте Client Seed + Server Seed (как в крипто-казино) или просто crypto.getRandomValues на клиенте (в Mini App) для генерации индексов карт, отправляя только результат на сервер для сохранения.
Чек-лист запуска (Best Practices)
| Этап | Действие | Инструмент |
|---|---|---|
| Ассеты | Подготовьте 78 карт + рубашку. Формат: WebP (lossless или quality 85%). Размер: ~400x600px (для Mini App) или 640×960 (для ретины). Оптимизируйте через sharp / imagemin. | Figma/Photoshop + Sharp/Node |
| Кэширование | Настройте Cache-Control: public, max-age=31536000, immutable для статики карт. Используйте CDN (Cloudflare, CloudFront). | Nginx / Vercel / Cloudflare |
| Предзагрузка | В Mini App при загрузке делайте preload изображений первых 3-5 карт расклада, чтобы флип был мгновенным. | JS new Image.src = ... |
| Тактильная отдача | Обязательно добавьте Telegram.WebApp.HapticFeedback.impactOccurred('medium') при тапе на карту. Это создает ощущение «физического» касания. | Telegram Web App SDK |
| Доступность (a11y) | Добавьте aria-label и поддержку клавиатуры (Enter/Space на фокусе) для десктопной версии Telegram. | |
| Аналитика | Трекайте события: card_flipped, spread_completed, share_clicked (через ваш бэкенд или Яндекс.Метрика/GA4 внутри Mini App). | Custom Events |
Примеры Open Source проектов для изучения
В предоставленной вами информации упоминается репозиторий pamnard/TaroBot (Google Apps Script + ChatGPT). Это хороший старт для понимания логики на GAS, но для UI переворота лучше посмотреть современные Mini Apps.
- GitHub Search:
telegram-mini-app tarot,twa tarot,telegram-web-app card flip. - Изучите репозитории с Three.js картами (запросы:
threejs playing cards flip). - Официальные примеры Telegram: github.com/telegram-web-app (раздел
examples).
🏆 Рекомендация: Telegram Mini App (React/Vue + CSS 3D Flip)
Это идеальный баланс между сложностью разработки (1-3 дня для MVP) и качеством UX (плавная 60fps анимация, звуки, вибрация, работа офлайн).
План действий:
- Создайте бота у @BotFather, включите Menu Button -> Web App.
- Разверните пустой React/Vite проект на Vercel.
- Реализуйте компонент
<TarotCard />с CSS из этой статьи. - Напишите простое API на Python (FastAPI) / Node.js (NestJS/Express) для выдачи раскладов.
- Подключите
@twa.dev/sdk, настройте MainButton и HapticFeedback. - Протестируйте на iOS/Android/Desktop.
Если дедлайн «вчера» и нет фронтендера — делайте Способ 1 (Inline кнопки + editMessageMedia). Пользователи привыкли к такому UX в ботах вроде tarologia_robot, но будьте готовы к жалобам на «тормоза» и отсутствие магии.
Статья подготовлена на основе актуальных возможностей Telegram Bot API 7.0+ и Telegram Mini Apps Platform (на июль 2026 г.).