MVP сервиса для автоматизации закупки аккаунтов на FunPay: поиск лотов, создание покупки, получение платежных реквизитов в Telegram, переписка с продавцом и сохранение полученных реквизитов аккаунта.
Проект собран как self-hosted система из web-панели, FastAPI-адаптера к FunPay, Telegram-бота и Postgres.
- Поиск лотов в категории FunPay с фильтрами по запросу, цене, отзывам и запрещенным словам.
- Просмотр гарантии по лоту.
- Выбор способа оплаты и создание заказа через FunPay.
- Передача платежной ссылки или crypto-реквизитов администраторам в Telegram.
- Telegram-бот для рабочих сценариев менеджера:
- получение уведомлений по платежу;
- отправка сообщений продавцу;
- просмотр назначенных чатов;
- подтверждение найденных реквизитов аккаунта.
- Админ-панель:
- bootstrap первого администратора;
- управление пользователями и Telegram ID;
- управление запрещенными словами;
- системные настройки.
- База аккаунтов с изменением статуса и сценарием обращения к продавцу по проблемному аккаунту.
- Аудит ключевых действий в Postgres.
apps/web- Next.js web-панель для администратора и менеджеров.services/funpay-api- FastAPI-сервис для работы с FunPay: поиск, чаты, заказы, возвраты.services/telegram-bot- Telegram worker для уведомлений, переписки и подтверждения реквизитов.packages/db- SQL-миграции Postgres.
- Docker и Docker Compose.
- Telegram bot token.
- FunPay
golden_keyот аккаунта, с которого выполняются действия.
- Скопируйте пример окружения:
Copy-Item .env.example .env- Заполните
.env:
NEXTAUTH_SECRET=replace-with-random-secret
BOOTSTRAP_ADMIN_EMAIL=admin@example.com
BOOTSTRAP_ADMIN_PASSWORD=change-me
FUNPAY_GOLDEN_KEY=...
FUNPAY_USER_AGENT=...
TELEGRAM_BOT_TOKEN=...
ADMIN_TELEGRAM_IDS=123456789
# Общий секрет для запросов web/telegram-bot -> funpay-api
INTERNAL_API_TOKEN=replace-with-random-tokenСгенерировать надежный секрет (32 байта в hex):
-join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Maximum 256) })или через openssl rand -hex 32 (Linux/macOS).
- Запустите сервисы:
docker compose up --build- Откройте web-панель:
http://localhost:3000
- Войдите через
BOOTSTRAP_ADMIN_EMAILиBOOTSTRAP_ADMIN_PASSWORD. Первый администратор создается автоматически при первом входе.
Полный список находится в .env.example.
Основные переменные:
DATABASE_URL- подключение к Postgres.NEXTAUTH_SECRET- секрет для подписи session cookie.BOOTSTRAP_ADMIN_EMAIL/BOOTSTRAP_ADMIN_PASSWORD- учетные данные первого администратора.FUNPAY_GOLDEN_KEY- FunPay session key.FUNPAY_USER_AGENT- User-Agent браузера, связанный с FunPay-сессией.FUNPAY_BASE_URL- базовый URL FunPay, по умолчаниюhttps://funpay.com.FUNPAY_CATEGORY_PATH- категория поиска, по умолчаниюlots/1355/.FUNPAY_MAX_ACTIONS_PER_MINUTE- лимит действий к FunPay.TELEGRAM_BOT_TOKEN- токен Telegram-бота.ADMIN_TELEGRAM_IDS- список Telegram ID администраторов через запятую.FUNPAY_POLL_INTERVAL_SECONDS- интервал опроса сообщений FunPay.FUNPAY_API_URL- внутренний URL FastAPI-сервиса.INTERNAL_API_TOKEN- общий секрет для запросовweb/telegram-botкfunpay-api. Если не задан,funpay-apiработает без аутентификации (в логах при старте выводится предупреждение). Сгенерируйте надежное значение, напримерopenssl rand -hex 32.
Не коммитьте реальный .env: в нем находятся токены, cookie/session keys и другие секреты.
В production обязательно задайте надежные NEXTAUTH_SECRET и INTERNAL_API_TOKEN: при NODE_ENV=production web-панель откажется запускаться с плейсхолдером NEXTAUTH_SECRET (например replace-me), чтобы исключить подделку сессий. Postgres и funpay-api публикуются только на 127.0.0.1; наружу смотрит лишь web на порту 3000 (разместите его за reverse-proxy с TLS).
- Администратор заходит в web-панель.
- Ищет подходящий лот FunPay.
- Открывает покупку и выбирает доступный способ оплаты.
- Система создает заказ через FunPay и отправляет платежную ссылку или реквизиты в Telegram.
- Менеджер оплачивает заказ и общается с продавцом через Telegram-бота.
- Когда продавец присылает данные аккаунта, бот распознает формат
login:passwordи предлагает подтвердить сохранение. - Подтвержденные реквизиты появляются в базе аккаунтов web-панели.
Этот сценарий был проверен вручную end-to-end: покупка создается, платежные реквизиты приходят в Telegram, сообщение продавцу отправляется.
/start- список доступных команд./send <chat_id> <message>- отправить сообщение продавцу в FunPay./chats- показать назначенные менеджеру чаты./assign <chat_id> <telegram_user_id>- назначить чат менеджеру, доступно администратору.
Также бот обрабатывает сообщения с реквизитами аккаунта и предлагает сохранить их через inline-подтверждение.
Основные endpoints:
GET /healthGET /sessionPOST /session/refreshPOST /lots/searchGET /lots/search/streamGET /lots/warrantyGET /chatsGET /chats/messagesGET /chats/{chat_id}GET /chats/{chat_id}/historyPOST /chats/sendPOST /orders/payment-methodsPOST /ordersGET /orders/{order_id}POST /orders/{order_id}/refund
services/funpay-api использует vendored FunPayAPI из sidor0912/FunPayCardinal на commit 8b52a855f242da854806ef09ab1691b53d5d20a9.
Python-сервисы:
cd services/funpay-api
python -m ruff check .
python -m pytest tests/ -v
cd ../telegram-bot
python -m ruff check .
python -m pytest tests/ -vWeb:
cd apps/web
npm install
npm run typecheck
npm test- Это MVP тестового задания, а не полностью отполированный production-продукт.
- Основной happy path проверен вручную, но покрытие edge cases FunPay и платежных провайдеров нужно расширять.
- UX/UI web-панели требует дальнейшей полировки.
- Сценарии ошибок оплаты, изменения HTML FunPay и нестабильности внешних сервисов требуют дополнительного hardening.
- Раздел «Системные настройки» админ-панели сохраняет значения в БД, но
funpay-apiиtelegram-botчитают конфигурацию из переменных окружения при старте; из БД сейчас потребляются только Telegram-настройки (telegram_bot_token,admin_telegram_ids). Сменуgolden_key/лимитов выполняйте через.envи перезапуск. - Реквизиты аккаунтов хранятся в БД в открытом виде; для production добавьте шифрование на уровне приложения и ограничьте доступ к БД.
- Для production-эксплуатации нужны более строгая observability, алерты, backup/restore и полноценный секрет-менеджмент.