Интеграционная платформа SafeMarket для Discord представляет собой сложносоставную двухсерверную архитектуру, разработанную для обеспечения безопасного, масштабируемого и контекстно-зависимого управления приглашениями в Discord. Система разделяет свои функциональные обязанности между двумя взаимосвязанными серверами: Веб-сервер Discord (размещён, например, на discord.lamoukate.lol
) и Основной веб-сервер (доступен через safemarket.xyz/discord
). Платформа использует криптографические механизмы токенизации, геолокационную профилировку IP-адресов и асинхронную событийно-ориентированную оркестрацию бота Discord для реализации комплексного жизненного цикла управления приглашениями.
Основной веб-сервер, реализованный на базе Flask с усиленной системой управления сессиями, служит точкой входа для пользователей, инициирующих доступ к серверу Discord. Его основная функция заключается в оркестрации безопасной переадресации на веб-сервер Discord с использованием временно-чувствительного токена на основе HMAC для предотвращения несанкционированного доступа.
- Генерация токенов: Использует алгоритм HMAC с SHA-256 для создания токена, конкатенированного с временной меткой, обеспечивая целостность в пределах 300-секундного окна валидности. Токен передаётся как параметр запроса (
safemarket
) при переадресации наdiscord.lamoukate.lol
. - Безопасность сессий: Настройка сессий Flask с атрибутами
HttpOnly
,Secure
иSameSite=Lax
, подкреплённая хранилищем сессий на основе файловой системы и уникальным секретным ключом (SafeMarketZhodyve
). - Расширяемость: Интеграция дополнительных модулей для обработки мультимедиа (gTTS, PIL) и взаимодействия с VCS (GitHub API), хотя они не связаны напрямую с основным процессом управления приглашениями.
Веб-сервер Discord, также реализованный на Flask, выступает в роли специализированного фасада для аутентификации пользователей и генерации приглашений. Он интегрирует клиентский механизм CAPTCHA (Google reCAPTCHA) и взаимодействует с локально размещённым ботом Discord для создания эфемерных приглашений.
- Аутентификация клиента:
- Валидация CAPTCHA: Использует API Google SiteVerify для проверки CAPTCHA, сопоставляя IP-адреса клиентов, извлечённые из заголовков
CF-Connecting-IP
илиX-Forwarded-For
. - Противодействие ботам: Реализует эвристический анализ User-Agent для исключения автоматизированных агентов, классифицируя клиентов как веб, мобильные, настольные или боты.
- Валидация CAPTCHA: Использует API Google SiteVerify для проверки CAPTCHA, сопоставляя IP-адреса клиентов, извлечённые из заголовков
- Интеграция с вебхуком: Передаёт метаданные клиента (IP, User-Agent, часовой пояс, язык) на вебхук Discord (
DISCORD_WEBHOOK_URL_DISCORD
) для аудита. - Координация с ботом: Отправляет HTTP-запросы POST на конечную точку Quart бота (
http://127.0.0.1:7813/d
) для инициирования создания приглашений, передавая IP-адрес клиента для геолокационного профилирования.
Бот Discord представляет собой гибридную конструкцию, объединяющую API-сервер на базе Quart и событийно-ориентированный клиент discord.py
. Он выполняет центральную роль в управлении жизненным циклом приглашений, работая в едином асинхронном цикле событий asyncio для согласования обработки HTTP-запросов и взаимодействий с API Discord.
- Жизненный цикл приглашений:
- Создание: Генерирует временные приглашения (срок действия 60 секунд, лимит 2 использования) в указанном канале (
INVITE_CHANNEL_ID
) по запросу с IP-адресом от веб-сервера Discord. - Отслеживание: Поддерживает кэш приглашений в памяти (
invites
) и их метаданные (last_invite
), связывая каждое приглашение с исходным IP-адресом. - Удаление: Автоматически аннулирует приглашения после использования для обеспечения одноразовой семантики, используя событие
on_member_join
для корреляции входа участников с использованием приглашений.
- Создание: Генерирует временные приглашения (срок действия 60 секунд, лимит 2 использования) в указанном канале (
- Геолокационное обогащение: Запрашивает
ipapi.is
для аннотации приглашений детализированными метаданными IP (страна, город, статус VPN, принадлежность к дата-центру), внедряя эти атрибуты в embeds, отправляемые в каналыWELCOME_CHANNEL_ID
иHISTORY_CHANNEL_ID
. - Безопасность: Валидирует входящие запросы с помощью HMAC-токенов (в настоящее время отключено), обеспечивая целостность происхождения.
+---------------------------------------------+
| Пользовательский клиент |
| (Браузер/Мобильное устройство) |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Основной веб-сервер (safemarket.xyz/discord) |
| - Генерация токена HMAC |
| - Переадресация на discord.lamoukate.lol |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Веб-сервер Discord (discord.lamoukate.lol) |
| - Интерфейс с CAPTCHA |
| - Сбор метаданных клиента |
| - Вебхук Discord для аудита |
| - Запрос к боту (127.0.0.1:7813/d) |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Бот Discord (Quart + discord.py) |
| - Создание приглашений |
| - Геолокация через ipapi.is |
| - Embeds в каналы Discord |
| - Удаление использованных приглашений |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Сервер Discord |
| - Вход участников |
| - Уведомления в WELCOME_CHANNEL_ID |
| - Логи в HISTORY_CHANNEL_ID |
+---------------------------------------------+
Для развертывания требуется два независимых хостинга, предпочтительно платформы PaaS, такие как Heroku или Render, для размещения основного веб-сервера и веб-сервера Discord. Каждый сервер должен быть настроен для обеспечения HTTPS и изоляции сетевых взаимодействий.
- Выбор хостинга:
- Heroku: Используйте dynos для масштабируемости и автоматического управления зависимостями через
Procfile
. - Render: Настройте веб-сервисы с автоматическим масштабированием и поддержкой Docker для контейнеризации.
- Heroku: Используйте dynos для масштабируемости и автоматического управления зависимостями через
- Требования к серверам:
- Python 3.9+ с поддержкой асинхронного ввода-вывода.
- Доступ к внешним API (
ipapi.is
, Google reCAPTCHA, Discord). - Хранилище для сессий (файловая система или Redis для масштабируемости).
-
Клонирование репозитория
-
Установка зависимостей:
pip install -r requirements.txt
-
Конфигурация переменных окружения:
- Создайте файл
config.yaml
:APP_SECRET_KEY=SafeMarketZhodyve SESSION_TYPE=filesystem DISCORD_REDIRECT_URL=https://discord.lamoukate.lol
- Настройте
utils.config.Config
для загрузки переменных.
- Создайте файл
-
Обновление URL: Замените
safemarket.xyz/discord
в коде на URL, предоставленный хостингом (например,https://daazdsxccg-main.herokuapp.com/discord
).
- Клонирование репозитория:
git clone <repository-url> cd safemarket-discord
- Установка зависимостей:
pip install -r requirements.txt
- Конфигурация переменных окружения:
- Создайте файл
config.yaml
:DISCORD_BOT_TOKEN=Discord_Bot_Token DISCORD_WEBHOOK_URL_DISCORD=Webhook_URL INVITE_CHANNEL_ID=Invite Channel ID WELCOME_CHANNEL_ID=Welcome Channel ID HISTORY_CHANNEL_ID=History Channel ID API_KEY=API Key
- Создайте файл
- Обновление URL: Замените
discord.lamoukate.lol
в коде на URL хостинга (например,https://safemarket-discord.herokuapp.com
).
- Создание бота:
- Перейдите на Discord Developer Portal.
- Создайте новое приложение, добавьте бота и включите интенты (
Guilds
,Members
,Invites
). - Скопируйте токен бота и добавьте его в
config.yaml
.
- Приглашение бота на сервер:
- Сгенерируйте URL приглашения с правами
Manage Invites
иSend Messages
. - Добавьте бота на целевой сервер Discord.
- Сгенерируйте URL приглашения с правами
- Настройка каналов:
- Убедитесь, что каналы с ID
WELCOME_CHANNEL_ID
,INVITE_CHANNEL_ID
иHISTORY_CHANNEL_ID
существуют и бот имеет права на чтение/запись.
- Убедитесь, что каналы с ID
- Google reCAPTCHA:
- Зарегистрируйтесь на reCAPTCHA, получите
site_key
иsecret_key
. - Обновите
data-sitekey
в HTML-шаблоне иRECAPTCHA_SECRET
вconfig.yaml
.
- Зарегистрируйтесь на reCAPTCHA, получите
- ipapi.is:
- Получите API-ключ на ipapi.is и добавьте в
config.yaml
какAPI_KEY
.
- Получите API-ключ на ipapi.is и добавьте в
- Замените в коде:
safemarket.xyz/discord
на URL основного сервера.discord.lamoukate.lol
на URL сервера Discord.- Обновите
http://127.0.0.1:7813/d
на URL сервера Discord, если они не размещены на одной машине.
- Переразверните оба сервера после изменений.
+-------------------+
| 1. Подготовка |
| - Выбор хостинга |
| - Heroku/Render |
+-------------------+
|
v
+-------------------+
| 2. Развертывание |
| - Основной сервер |
| - Discord сервер |
| - Установка deps |
| - Конфигурация env|
+-------------------+
|
v
+-------------------+
| 3. Настройка бота |
| - Создание бота |
| - Интенты |
| - Каналы Discord |
+-------------------+
|
v
+-------------------+
| 4. Интеграция API |
| - reCAPTCHA |
| - ipapi.is |
+-------------------+
|
v
+-------------------+
| 5. Тестирование |
| - Локальный запуск|
| - Проверка URLs |
| - Мониторинг логов|
+-------------------+
|
v
+-------------------+
| 6. Обновление URL |
| - Замена ссылок |
| - Переразвертывание|
+-------------------+
Поддерживается SafeMarket, версия 7.9.2, 2023 года.