606 lines
24 KiB
Markdown
606 lines
24 KiB
Markdown
# Telegram Tinder Bot 💕
|
||
|
||
Полнофункциональный Telegram бот для знакомств в стиле Tinder с инлайн-кнопками и красивым интерфейсом. Пользователи могут создавать профили, просматривать анкеты других пользователей, ставить лайки, получать матчи и общаться друг с другом.
|
||
|
||
## 🗂️ Структура проекта
|
||
|
||
```
|
||
telegram-tinder-bot/
|
||
├── bin/ # Исполняемые скрипты и утилиты
|
||
│ ├── start_bot.bat # Скрипт запуска для Windows
|
||
│ ├── install_ubuntu.sh # Скрипт установки для Ubuntu
|
||
│ ├── update.sh # Скрипт обновления для Linux/macOS
|
||
│ ├── update.bat # Скрипт обновления для Windows
|
||
│ └── setup.sh # Скрипт настройки окружения
|
||
│
|
||
├── docs/ # Документация проекта
|
||
│ ├── ARCHITECTURE.md # Архитектура приложения
|
||
│ ├── DEPLOYMENT.md # Инструкции по развертыванию
|
||
│ ├── DEPLOY_UBUNTU.md # Инструкции по развертыванию на Ubuntu
|
||
│ ├── LOCALIZATION.md # Информация о локализации
|
||
│ ├── NATIVE_CHAT_SYSTEM.md # Документация по системе чата
|
||
│ ├── PROJECT_SUMMARY.md # Общее описание проекта
|
||
│ └── VIP_FUNCTIONS.md # Описание премиум функций
|
||
│
|
||
├── migrations/ # Миграции базы данных
|
||
│ ├── 1758144488937_initial-schema.js # Начальная схема БД
|
||
│ └── 1758144618548_add-missing-profile-columns.js # Дополнительные колонки
|
||
│
|
||
├── scripts/ # Вспомогательные скрипты
|
||
│ ├── add-hobbies-column.js # Скрипт добавления колонки hobbies
|
||
│ ├── add-premium-columns.js # Скрипт добавления премиум колонок
|
||
│ ├── add-premium-columns.ts # TypeScript версия скрипта
|
||
│ ├── create_profile_fix.js # Исправление профилей
|
||
│ └── migrate-sync.js # Синхронизация миграций
|
||
│
|
||
├── sql/ # SQL скрипты
|
||
│ ├── add_looking_for.sql # Добавление колонки looking_for
|
||
│ ├── add_missing_columns.sql # Добавление недостающих колонок
|
||
│ ├── add_premium_columns.sql # Добавление премиум колонок
|
||
│ ├── add_updated_at.sql # Добавление колонки updated_at
|
||
│ ├── clear_database.sql # Очистка базы данных
|
||
│ └── recreate_tables.sql # Пересоздание таблиц
|
||
│
|
||
├── src/ # Исходный код приложения
|
||
│ ├── bot.ts # Основной файл бота
|
||
│ ├── controllers/ # Контроллеры
|
||
│ ├── database/ # Функции для работы с БД
|
||
│ ├── handlers/ # Обработчики сообщений и команд
|
||
│ ├── locales/ # Локализация
|
||
│ ├── models/ # Модели данных
|
||
│ ├── scripts/ # Скрипты для запуска
|
||
│ │ └── initDb.ts # Инициализация базы данных
|
||
│ ├── services/ # Сервисы и бизнес-логика
|
||
│ ├── types/ # TypeScript типы
|
||
│ └── utils/ # Утилиты и вспомогательные функции
|
||
│
|
||
├── tests/ # Тесты
|
||
│ └── test-bot.ts # Тестовая версия бота
|
||
│
|
||
├── .dockerignore # Игнорируемые Docker файлы
|
||
├── .env # Переменные окружения (локальные)
|
||
├── .env.example # Пример файла переменных окружения
|
||
├── database.json # Конфигурация базы данных
|
||
├── docker-compose.yml # Настройка Docker Compose
|
||
├── Dockerfile # Docker-образ приложения
|
||
├── package.json # Зависимости и скрипты NPM
|
||
└── tsconfig.json # Настройки TypeScript
|
||
```
|
||
|
||
## ✨ Функционал
|
||
|
||
### 🎯 Основные возможности
|
||
|
||
- ✅ **Полная регистрация профиля** - пошаговое создание анкеты с фотографиями
|
||
- ✅ **Умный поиск партнеров** - фильтрация по возрасту, полу и предпочтениям
|
||
- ✅ **Инлайн-кнопки вместо свайпов** - удобные кнопки Like/Dislike/SuperLike под фотографиями
|
||
- ✅ **Система матчинга** - уведомления о взаимных лайках
|
||
- ✅ **Управление фотографиями** - загрузка и просмотр нескольких фото профиля
|
||
- ✅ **Детальные профили** - возраст, город, работа, интересы, описание
|
||
- ✅ **Статистика матчей** - количество лайков и совпадений
|
||
- ✅ **Настройки поиска** - возрастные рамки и гендерные предпочтения
|
||
|
||
### <20> Интерактивные элементы
|
||
|
||
- **👍 Лайк** - выразить симпатию пользователю
|
||
- **👎 Дислайк** - пропустить профиль
|
||
- **⭐ Суперлайк** - показать особый интерес
|
||
- **👤 Просмотр профиля** - детальная информация о кандидате
|
||
- **📸 Больше фото** - дополнительные изображения профиля
|
||
- **🔄 Следующий профиль** - перейти к новому кандидату
|
||
|
||
### 🛠️ Технические особенности
|
||
|
||
- **PostgreSQL** - надежная база данных с UUID и индексами
|
||
- **TypeScript** - типизированный код с проверкой ошибок
|
||
- **Telegram Bot API** - современные инлайн-клавиатуры
|
||
- **Миграции БД** - структурированная схема данных
|
||
- **Error Handling** - обработка ошибок и валидация данных
|
||
- **Docker Support** - контейнеризация для развертывания
|
||
|
||
## 🛠 Технологии
|
||
|
||
- **Node.js 18+** + **TypeScript**
|
||
- **PostgreSQL 16** для хранения данных
|
||
- **node-telegram-bot-api** для работы с Telegram API
|
||
- **UUID** для генерации уникальных ID
|
||
- **dotenv** для управления конфигурацией
|
||
|
||
## <20> Скриншоты
|
||
|
||
### 🚀 Главное меню
|
||
```
|
||
🎉 Добро пожаловать в Telegram Tinder Bot! 🤖
|
||
|
||
Выберите действие:
|
||
[🔍 Искать людей] [👤 Мой профиль] [💕 Мои матчи] [⚙️ Настройки]
|
||
```
|
||
|
||
### 💫 Просмотр анкеты
|
||
```
|
||
👨 Алексей, 25
|
||
📍 Москва
|
||
💼 Программист
|
||
🎯 В поиске: Серьезные отношения
|
||
|
||
"Люблю путешествовать и изучать новые технологии!"
|
||
|
||
[👎 Дислайк] [⭐ Суперлайк] [👍 Лайк]
|
||
[👤 Профиль] [📸 Ещё фото] [🔄 Следующий]
|
||
```
|
||
|
||
### 🎯 Уведомление о матче
|
||
```
|
||
🎉 У вас новый матч! 💕
|
||
|
||
Вы понравились друг другу с Анной!
|
||
Самое время начать общение! 😊
|
||
|
||
[💬 Написать] [👤 Профиль] [🔍 Продолжить поиск]
|
||
```
|
||
|
||
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
### 1. Предварительные требования
|
||
|
||
- Node.js 16+
|
||
- PostgreSQL 12+
|
||
- Telegram Bot Token (получить у [@BotFather](https://t.me/BotFather))
|
||
|
||
### 2. Установка
|
||
|
||
```bash
|
||
# Клонировать репозиторий
|
||
git clone <repository-url>
|
||
cd telegram-tinder-bot
|
||
|
||
# Установить зависимости
|
||
npm install
|
||
|
||
# Скомпилировать TypeScript
|
||
npm run build
|
||
```
|
||
|
||
### 3. Настройка базы данных
|
||
|
||
```bash
|
||
# Создать базу данных PostgreSQL
|
||
createdb telegram_tinder_bot
|
||
|
||
# Инициализация базы данных
|
||
npm run init:db
|
||
```
|
||
|
||
### 4. Запуск бота
|
||
|
||
```bash
|
||
# Запуск на Windows
|
||
.\bin\start_bot.bat
|
||
|
||
# Запуск на Linux/macOS
|
||
npm run start
|
||
```
|
||
|
||
## <20> Развертывание на Ubuntu
|
||
|
||
Для развертывания на Ubuntu 24.04 используйте скрипт установки:
|
||
|
||
```bash
|
||
# Сделать скрипт исполняемым
|
||
chmod +x ./bin/install_ubuntu.sh
|
||
|
||
# Запустить установку
|
||
sudo ./bin/install_ubuntu.sh
|
||
```
|
||
|
||
Подробные инструкции по развертыванию на Ubuntu находятся в [docs/DEPLOY_UBUNTU.md](docs/DEPLOY_UBUNTU.md).
|
||
|
||
## 🔄 Обновление бота
|
||
|
||
### На Windows:
|
||
|
||
```bash
|
||
# Обновление с ветки main
|
||
npm run update:win
|
||
|
||
# Обновление с определенной ветки
|
||
.\bin\update.bat develop
|
||
```
|
||
|
||
### На Linux/macOS:
|
||
|
||
```bash
|
||
# Обновление с ветки main
|
||
npm run update
|
||
|
||
# Обновление с определенной ветки и перезапуском сервиса
|
||
./bin/update.sh develop --restart-service
|
||
```
|
||
|
||
## 🔧 Настройка переменных окружения
|
||
|
||
Создайте `.env` файл:
|
||
|
||
```env
|
||
# Telegram Bot
|
||
TELEGRAM_BOT_TOKEN=123456789:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
|
||
|
||
# PostgreSQL Database
|
||
DB_HOST=localhost
|
||
DB_PORT=5432
|
||
DB_NAME=telegram_tinder_bot
|
||
DB_USER=postgres
|
||
DB_PASSWORD=your_secure_password
|
||
|
||
# Application
|
||
NODE_ENV=production
|
||
PORT=3000
|
||
LOG_LEVEL=info
|
||
|
||
# Optional: File uploads
|
||
UPLOAD_DIR=./uploads
|
||
MAX_FILE_SIZE=5242880
|
||
ALLOWED_FILE_TYPES=image/jpeg,image/png,image/gif
|
||
```
|
||
|
||
## 🔍 Отладка и логи
|
||
|
||
```bash
|
||
# Просмотр логов в реальном времени
|
||
tail -f logs/app.log
|
||
|
||
# Проверка статуса бота
|
||
curl http://localhost:3000/health
|
||
|
||
# Тестирование базы данных
|
||
npm run test:db
|
||
|
||
# Запуск в режиме разработки
|
||
npm run dev
|
||
```
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
### 1. Предварительные требования
|
||
|
||
- Node.js 16+
|
||
- PostgreSQL 12+
|
||
- Telegram Bot Token (получить у [@BotFather](https://t.me/BotFather))
|
||
|
||
### 2. Установка
|
||
|
||
```bash
|
||
# Клонировать репозиторий
|
||
git clone <repository-url>
|
||
cd telegram-tinder-bot
|
||
|
||
# Установить зависимости
|
||
npm install
|
||
|
||
# Скомпилировать TypeScript
|
||
npm run build
|
||
```
|
||
|
||
### 3. Настройка базы данных
|
||
|
||
```bash
|
||
# Создать базу данных PostgreSQL
|
||
createdb telegram_tinder_bot
|
||
|
||
# Запустить миграции
|
||
psql -d telegram_tinder_bot -f src/database/migrations/init.sql
|
||
```
|
||
|
||
### 4. Запуск бота
|
||
|
||
```bash
|
||
# Компиляция TypeScript
|
||
npm run build
|
||
|
||
# Запуск бота
|
||
npm start
|
||
```
|
||
|
||
## 📖 Использование
|
||
|
||
### 🤖 Команды бота
|
||
|
||
- `/start` - **Главное меню** - регистрация или возврат в главное меню
|
||
- `/profile` - **Мой профиль** - просмотр и редактирование профиля
|
||
- `/browse` - **Поиск анкет** - просмотр других пользователей
|
||
- `/matches` - **Мои матчи** - список взаимных лайков
|
||
- `/settings` - **Настройки** - управление профилем и предпочтениями
|
||
- `/help` - **Справка** - информация о командах
|
||
|
||
### 💫 Процесс использования
|
||
|
||
1. **Регистрация**: `/start` → выбор пола → заполнение данных → загрузка фото
|
||
2. **Поиск**: `/browse` → просмотр анкет с инлайн-кнопками
|
||
3. **Лайки**: Используйте кнопки под фотографиями кандидатов
|
||
4. **Матчи**: При взаимном лайке получаете уведомление о матче
|
||
5. **Общение**: Переходите к чату с матчами (функция в разработке)
|
||
|
||
## ⚙️ Конфигурация
|
||
|
||
### Основные настройки
|
||
|
||
```json
|
||
{
|
||
"app": {
|
||
"maxPhotos": 6, // Максимум фото в профиле
|
||
"maxDistance": 100, // Максимальное расстояние поиска (км)
|
||
"minAge": 18, // Минимальный возраст
|
||
"maxAge": 99, // Максимальный возраст
|
||
"superLikesPerDay": 1, // Суперлайков в день
|
||
"likesPerDay": 100 // Обычных лайков в день
|
||
},
|
||
"limits": {
|
||
"maxBioLength": 500, // Максимальная длина описания
|
||
"maxInterests": 10, // Максимум интересов
|
||
"photoMaxSize": 5242880 // Максимальный размер фото (5MB)
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🗄️ База данных
|
||
|
||
### Основные таблицы
|
||
|
||
- **users** - Пользователи Telegram (id, username, first_name, last_name)
|
||
- **profiles** - Анкеты знакомств (name, age, gender, bio, photos, location, job)
|
||
- **search_preferences** - Настройки поиска (age_min, age_max, looking_for)
|
||
- **swipes** - История лайков/дислайков (user_id, target_id, action)
|
||
- **matches** - Взаимные лайки (user_id, matched_user_id, created_at)
|
||
|
||
### Схема БД
|
||
|
||
Полная схема создается автоматически через миграции:
|
||
|
||
```sql
|
||
-- Таблица пользователей Telegram
|
||
CREATE TABLE users (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
telegram_id BIGINT UNIQUE NOT NULL,
|
||
username VARCHAR(255),
|
||
first_name VARCHAR(255) NOT NULL,
|
||
last_name VARCHAR(255),
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- Таблица профилей знакомств
|
||
CREATE TABLE profiles (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
|
||
name VARCHAR(255) NOT NULL,
|
||
age INTEGER NOT NULL CHECK (age >= 18 AND age <= 99),
|
||
gender VARCHAR(10) NOT NULL,
|
||
bio TEXT,
|
||
photos TEXT[], -- JSON массив фотографий
|
||
location VARCHAR(255),
|
||
job VARCHAR(255),
|
||
interests TEXT[], -- JSON массив интересов
|
||
is_active BOOLEAN DEFAULT true,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
## 📊 Алгоритм матчинга
|
||
|
||
Умный алгоритм подбора кандидатов:
|
||
|
||
1. **Фильтрация по предпочтениям** - возраст и пол согласно настройкам
|
||
2. **Исключение просмотренных** - пропуск уже лайкнутых/дислайкнутых
|
||
3. **Приоритет активности** - активные пользователи показываются чаще
|
||
4. **Рандомизация** - случайный порядок для разнообразия
|
||
5. **Географическая близость** - сортировка по городу (если указан)
|
||
|
||
```typescript
|
||
// Пример алгоритма поиска
|
||
async findCandidates(userId: string): Promise<Profile[]> {
|
||
return await this.db.query(`
|
||
SELECT DISTINCT p.* FROM profiles p
|
||
JOIN search_preferences sp ON sp.user_id = $1
|
||
WHERE p.user_id != $1
|
||
AND p.is_active = true
|
||
AND p.age >= sp.age_min
|
||
AND p.age <= sp.age_max
|
||
AND p.gender = sp.looking_for
|
||
AND NOT EXISTS (
|
||
SELECT 1 FROM swipes s
|
||
WHERE s.user_id = $1 AND s.target_id = p.user_id
|
||
)
|
||
ORDER BY RANDOM()
|
||
LIMIT 20
|
||
`, [userId]);
|
||
}
|
||
```
|
||
|
||
## 🔔 Система уведомлений
|
||
|
||
Автоматические уведомления о важных событиях:
|
||
|
||
- 💖 **Новый лайк** - "Кто-то лайкнул ваш профиль!"
|
||
- ⭐ **Суперлайк** - "Вы очень понравились пользователю!"
|
||
- 🎉 **Новый матч** - "У вас новый матч! Начните общение!"
|
||
- <20> **Возвращение** - Напоминания неактивным пользователям
|
||
|
||
## 🚧 Разработка и тестирование
|
||
|
||
### Режим разработки
|
||
|
||
```bash
|
||
# Запуск с горячей перезагрузкой
|
||
npm run dev
|
||
|
||
# Отладочные логи
|
||
DEBUG=* npm run dev
|
||
|
||
# Тестирование отдельных модулей
|
||
npm run test:unit
|
||
npm run test:integration
|
||
```
|
||
|
||
### Структура кода
|
||
|
||
- **Handlers** - Обработчики событий Telegram (команды, кнопки, сообщения)
|
||
- **Services** - Бизнес-логика (профили, матчинг, уведомления)
|
||
- **Models** - Типы данных и интерфейсы TypeScript
|
||
- **Database** - Подключение к PostgreSQL и миграции
|
||
- **Handlers** - Обработчики событий Telegram
|
||
- **Types** - TypeScript интерфейсы и типы
|
||
|
||
## 🔒 Безопасность
|
||
|
||
- Валидация всех пользовательских данных
|
||
- Защита от спама (лимиты на действия)
|
||
- Система жалоб и блокировок
|
||
- Шифрование чувствительных данных
|
||
- Rate limiting для API запросов
|
||
|
||
## 📈 Масштабирование
|
||
|
||
Для высоких нагрузок рекомендуется:
|
||
|
||
- Использовать Redis для кэширования
|
||
## 🚀 Производительность и масштабирование
|
||
|
||
### Оптимизация
|
||
|
||
- **Индексы БД** - на часто запрашиваемых полях (telegram_id, age, gender)
|
||
- **Пагинация** - ограничение выборки кандидатов для экономии памяти
|
||
- **Кэширование** - Redis для часто используемых данных
|
||
- **Оптимизация запросов** - минимизация обращений к БД
|
||
|
||
### Масштабирование
|
||
|
||
```bash
|
||
# Горизонтальное масштабирование
|
||
pm2 start ecosystem.config.js -i max
|
||
|
||
# Мониторинг нагрузки
|
||
pm2 monit
|
||
pm2 logs --lines 100
|
||
```
|
||
|
||
Рекомендации для продакшена:
|
||
- PostgreSQL репликация (master-slave)
|
||
- CDN для изображений профилей
|
||
- Webhook вместо polling для Telegram API
|
||
- Load balancer для множественных инстансов
|
||
|
||
## 🤝 Участие в разработке
|
||
|
||
Мы открыты для вклада в проект! Вот как можно помочь:
|
||
|
||
### 🐛 Сообщение об ошибках
|
||
|
||
1. Проверьте [существующие Issues](../../issues)
|
||
2. Создайте детальный отчет с:
|
||
- Описанием проблемы
|
||
- Шагами воспроизведения
|
||
- Ожидаемым поведением
|
||
- Скриншотами (если применимо)
|
||
|
||
### 💡 Предложения функций
|
||
|
||
1. Опишите предлагаемую функцию
|
||
2. Объясните, почему она нужна
|
||
3. Приложите mockup или схему (если возможно)
|
||
|
||
### 🔧 Pull Request
|
||
|
||
```bash
|
||
# 1. Fork репозитория
|
||
git clone https://github.com/your-username/telegram-tinder-bot.git
|
||
|
||
# 2. Создайте feature branch
|
||
git checkout -b feature/amazing-feature
|
||
|
||
# 3. Внесите изменения и commit
|
||
git commit -m 'feat: add amazing feature'
|
||
|
||
# 4. Push и создайте PR
|
||
git push origin feature/amazing-feature
|
||
```
|
||
|
||
## 📝 Лицензия
|
||
|
||
Этот проект распространяется под лицензией **MIT License**.
|
||
|
||
Подробности см. в файле [LICENSE](LICENSE).
|
||
|
||
## 🆘 Поддержка и сообщество
|
||
|
||
### 📞 Получить помощь
|
||
|
||
- **GitHub Issues** - для багов и вопросов разработки
|
||
- **Discussions** - для общих вопросов и идей
|
||
- **Email** - support@example.com для приватных вопросов
|
||
|
||
### 🎯 Дорожная карта
|
||
|
||
#### 🔜 Ближайшие обновления
|
||
- [ ] 💬 **Чат между матчами** - полноценная система сообщений
|
||
- [ ] 🔍 **Расширенные фильтры** - по интересам, образованию, росту
|
||
- [ ] 📱 **Push-уведомления** - мгновенные оповещения о новых матчах
|
||
|
||
#### 🚀 Долгосрочные планы
|
||
- [ ] 🎥 **Видео-профили** - короткие видео-презентации
|
||
- [ ] 🤖 **AI-рекомендации** - умный подбор на основе поведения
|
||
- [ ] 📊 **Аналитика** - статистика успешности и активности
|
||
- [ ] 🌍 **Геолокация** - поиск по расстоянию
|
||
- [ ] 💎 **Premium функции** - бустеры, суперлайки, расширенные фильтры
|
||
|
||
---
|
||
|
||
<div align="center">
|
||
<h3>🤖 Telegram Tinder Bot</h3>
|
||
<p>Made with ❤️ for connecting people</p>
|
||
<p>
|
||
<a href="#-функционал">Функционал</a> •
|
||
<a href="#-быстрый-старт">Установка</a> •
|
||
<a href="#-использование">Использование</a> •
|
||
<a href="#-участие-в-разработке">Участие</a>
|
||
</p>
|
||
</div>
|
||
```
|
||
|
||
## Установка
|
||
|
||
1. Клонируйте репозиторий:
|
||
```
|
||
git clone <URL>
|
||
```
|
||
2. Перейдите в директорию проекта:
|
||
```
|
||
cd telegram-tinder-bot
|
||
```
|
||
3. Установите зависимости:
|
||
```
|
||
npm install
|
||
```
|
||
|
||
## Использование
|
||
|
||
1. Настройте файл конфигурации `config/default.json`, указав необходимые токены и параметры подключения к базе данных.
|
||
2. Запустите бота:
|
||
```
|
||
npm start
|
||
```
|
||
|
||
## Функциональность
|
||
|
||
- **Профили пользователей**: Пользователи могут создавать и обновлять свои профили.
|
||
- **Свайпы**: Пользователи могут свайпать влево или вправо для взаимодействия с другими пользователями.
|
||
- **Матчи**: Бот находит совпадения между пользователями на основе их свайпов.
|
||
- **Уведомления**: Пользователи получают уведомления о новых матчах и сообщениях.
|
||
|
||
## Вклад
|
||
|
||
Если вы хотите внести свой вклад в проект, пожалуйста, создайте форк репозитория и отправьте пулл-реквест с вашими изменениями.
|
||
|
||
## Лицензия
|
||
|
||
Этот проект лицензирован под MIT License. |