reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,661 @@
"""
DarkTelegram.pro — полный реверс
SaaS-облачный комбайн для автоматизации Telegram.
Python/FastAPI backend, React SPA фронт, Cloudflare Turnstile, облачное 24/7 исполнение.
Auth: email+password, Google OAuth, Telegram OAuth
Тарифы: Start $49/20 акк, Pro $70/100 акк, Ultra $130/1000 акк
Модули à la carte: $15-50/мес
"""
from dataclasses import dataclass, field
from typing import Optional
from enum import StrEnum
# === API ENDPOINTS (извлечены из App-DL7CzC9q.js, 663KB) ===
API_BASE = "https://darktelegram.pro/api"
ENDPOINTS = {
# Auth
"login": "POST /api/auth/login",
"register": "POST /api/auth/register",
"register_verify": "POST /api/auth/register/verify",
"register_resend": "POST /api/auth/register/resend",
"refresh": "POST /api/auth/refresh",
"forgot_password": "POST /api/auth/forgot-password",
"reset_password": "POST /api/auth/reset-password",
"google_oauth": "GET /api/auth/google",
"telegram_oauth_init": "POST /api/auth/telegram/init",
"auth_config": "GET /api/auth/config",
"me": "GET /api/auth/me",
# Аккаунты
"accounts_add": "POST /api/accounts/add",
"accounts_add_tdata": "POST /api/accounts/add-tdata",
"accounts_summary": "GET /api/accounts/summary",
"accounts_trust": "GET /api/accounts/trust",
"accounts_batch_task": "POST /api/accounts/batch-task",
"accounts_batch_purpose": "POST /api/accounts/batch-purpose",
"accounts_batch_move": "POST /api/accounts/batch-move-folder",
"accounts_bulk_edit": "POST /api/accounts/bulk-edit",
"accounts_bulk_delete": "POST /api/accounts/bulk-delete",
"accounts_bulk_assign_proxy":"POST /api/accounts/bulk-assign-proxy",
"accounts_bulk_force_reset":"POST /api/accounts/bulk-force-reset",
"accounts_confirm": "POST /api/accounts/confirm/:id",
"accounts_counts": "GET /api/accounts/counts/sparkline",
# phone-auth flow
"phone_send_code": "POST /api/accounts/phone-auth/send-code",
"phone_resend_code": "POST /api/accounts/phone-auth/resend-code",
"phone_sign_in": "POST /api/accounts/phone-auth/sign-in",
"phone_submit_captcha": "POST /api/accounts/phone-auth/submit-captcha",
# Прокси
"proxies": "GET /api/proxies",
"proxies_by_country": "GET /api/proxies/by-country",
"proxies_batch_check": "POST /api/proxies/batch-check",
"proxies_batch_folder": "POST /api/proxies/batch-folder",
"proxy_folders": "GET /api/proxy-folders",
"proxy_health": "GET /api/proxy-health",
# Магазин прокси
"proxy_shop_buy": "POST /api/proxy-shop/buy",
"proxy_shop_prolong": "POST /api/proxy-shop/prolong-local",
"proxy_shop_prolong_price": "GET /api/proxy-shop/prolong-price",
"proxy_shop_price": "GET /api/proxy-shop/price",
"proxy_shop_balance": "GET /api/proxy-shop/balance",
"proxy_shop_countries": "GET /api/proxy-shop/countries",
"proxy_shop_count": "GET /api/proxy-shop/count",
"proxy_shop_disclaimer": "GET /api/proxy-shop/disclaimer",
# Подписка / биллинг
"subscribe_active": "GET /api/subscribe/active",
"subscribe_start": "POST /api/subscribe/start",
"subscribe_status": "GET /api/subscribe/status/:id",
"subscribe_cancel": "POST /api/subscribe/cancel/:id",
# AI / Задачи
"ai_submit": "POST /api/ai/:task_type",
"auto_warmup": "POST /api/auto-warmup/:id",
"task_history": "GET /api/task-history/accounts/:id",
# AI пресеты
"ai_presets_prompts": "GET /api/ai-presets/prompts",
"ai_presets_photos": "GET /api/ai-presets/photos",
# Каналы
"channel_create_copy": "POST /api/channel-create/copy-post",
"channel_create_acc": "GET /api/channel-create/account/:id",
"channel_templates": "GET /api/channel-create/templates",
"channel_views_check": "POST /api/channel-views/check-unchecked",
# Истории
"story_repost_preview": "GET /api/story-repost/preview",
"story_repost_viewers": "GET /api/story-repost/viewers",
# Профили / посты
"profile_presets_list": "GET /api/profile-presets/list",
"profile_presets_random":"GET /api/profile-presets/random",
"profile_templates": "GET /api/profile-templates",
"profile_templates_bios":"GET /api/profile-templates/bios",
"profile_templates_names":"GET /api/profile-templates/names",
"profile_photos_upload": "POST /api/profile-templates/photos/upload",
"profile_photos_b64": "GET /api/profile-templates/photos/b64",
"post_templates": "GET /api/post-templates",
# Сессионный дубликатор
"session_duplicate": "POST /api/session-duplicator/:id",
"session_download": "GET /api/session-duplicator/download/:id",
"session_sessions": "GET /api/session-duplicator/sessions/:id",
"session_switch": "POST /api/session-duplicator/switch/:id",
# Остальное
"workspaces": "GET /api/workspaces",
"workspaces_active": "POST /api/workspaces/active",
"workspaces_move": "POST /api/workspaces/move",
"account_folders": "GET /api/account-folders",
"all_status": "GET /api/all-status",
"currency_rate": "GET /api/currency/rate",
"links_channels": "GET /api/links/channels",
"notifications": "GET /api/notifications",
"notifications_read": "POST /api/notifications/read-all",
"emoji_file": "GET /api/emoji/file/:id",
"team_context": "GET /api/team/context",
}
# === ТАРИФЫ ===
class Tariff(StrEnum):
START = "start" # $49/мес, 20 акков
PRO = "pro" # $70/мес, 100 акков
ULTRA = "ultra" # $130/мес, 1000 акков
TARIFFS = {
"start": {"price": 49, "accounts": 20, "ai_tokens": 0},
"pro": {"price": 70, "accounts": 100, "ai_tokens": 75}, # +$7.5
"ultra": {"price": 130, "accounts": 1000, "ai_tokens": 200}, # +$20
}
MODULES = {
"neuro_commenting": {"price": 30, "tariff": None},
"parser": {"price": 20, "tariff": None},
"neuro_dialogs": {"price": 30, "tariff": "pro"},
"ai_salesman": {"price": 50, "tariff": "pro"},
"mass_reactions": {"price": 18, "tariff": None},
"mass_looking": {"price": 23, "tariff": None},
"grabber": {"price": 25, "tariff": None},
"story_mentions": {"price": 40, "tariff": "ultra"},
"inviter": {"price": 25, "tariff": "pro"},
"ai_broadcast_chats": {"price": 20, "tariff": "start"},
"ai_broadcast_dm": {"price": 20, "tariff": "pro"},
"ai_autoresponder": {"price": 30, "tariff": "pro"},
"telegram_web": {"price": 20, "tariff": "start"},
"own_api_keys": {"price": 15, "tariff": None},
}
# === ФУНКЦИИ (реконструированы из JS-бандлов и лендинга) ===
@dataclass
class Account:
"""Модель аккаунта в системе"""
id: int
phone: str = ""
username: str = ""
status: str = "active" # active | spamblock | banned | frozen
trust_score: int = 0
proxy_id: Optional[int] = None
folder_id: Optional[int] = None
purpose: str = "" # mailing | commenting | warming | etc
last_warmup: Optional[str] = None
session_file: Optional[str] = None # .session path
tdata_path: Optional[str] = None # tdata path
@dataclass
class ProxyConfig:
"""Прокси для аккаунта"""
id: int
type: str = "socks5" # socks5 | http
host: str = ""
port: int = 1080
username: str = ""
password: str = ""
country: str = ""
ip_version: str = "ipv4"
# --- Аккаунты ---
def account_add_session(session_file: str, proxy_id: Optional[int] = None) -> Account:
"""Добавить аккаунт из .session файла"""
# POST /api/accounts/add multipart: file=session_file, proxy_id=proxy_id
...
def account_add_tdata(tdata_zip: str) -> Account:
"""Добавить аккаунт из tdata.zip"""
# POST /api/accounts/add-tdata multipart: file=tdata_zip
...
def account_phone_auth(phone: str, proxy_id: Optional[int] = None) -> dict:
"""
Авторизация по номеру телефона (3-шаговый flow):
1. POST /api/accounts/phone-auth/send-code {phone, proxy_id} → phone_code_hash
2. POST /api/accounts/phone-auth/sign-in {phone, phone_code_hash, code}
3. Если капча: POST /api/accounts/phone-auth/submit-captcha {password}
"""
...
def account_confirm(account_id: int) -> bool:
"""Подтвердить аккаунт (после добавления)"""
# POST /api/accounts/confirm/:id
...
def account_bulk_edit(account_ids: list[int], fields: dict) -> bool:
"""Массовое редактирование полей аккаунтов"""
# POST /api/accounts/bulk-edit {ids, ...fields}
...
def account_bulk_assign_proxy(account_ids: list[int], proxy_id: int) -> bool:
"""Привязать прокси к группе аккаунтов"""
# POST /api/accounts/bulk-assign-proxy
...
def account_batch_purpose(account_ids: list[int], purpose: str) -> bool:
"""Назначить purpose аккаунтам (mailing/commenting/etc)"""
# POST /api/accounts/batch-purpose
...
def account_get_trust(account_id: int) -> dict:
"""Trust Score аккаунта (0-100)"""
# GET /api/accounts/trust
...
def account_get_summary() -> dict:
"""Сводка по аккаунтам: общее кол-во, по статусам"""
# GET /api/accounts/summary
...
def account_get_counts_sparkline() -> list:
"""График изменения количества аккаунтов"""
# GET /api/accounts/counts/sparkline
...
# --- Прокси ---
def proxy_list() -> list[ProxyConfig]:
"""Список своих прокси"""
# GET /api/proxies
...
def proxy_add(host: str, port: int, type_: str = "socks5",
username: str = "", password: str = "") -> ProxyConfig:
"""Добавить прокси"""
# POST /api/proxies
...
def proxy_batch_check(proxy_ids: list[int]) -> dict:
"""Массовая проверка прокси"""
# POST /api/proxies/batch-check
...
def proxy_health() -> dict:
"""Статус прокси-пула"""
# GET /api/proxy-health
...
def proxy_shop_buy(country: str, count: int, period_days: int = 30) -> list[ProxyConfig]:
"""Купить прокси из встроенного магазина"""
# POST /api/proxy-shop/buy
...
def proxy_shop_countries() -> list[str]:
"""Доступные страны для покупки прокси"""
# GET /api/proxy-shop/countries
...
# --- AI Tasks (единый механизм для всех модулей) ---
@dataclass
class AITask:
"""AI задача: рассылка, комментинг, диалог, продажник, автоответ"""
task_type: str # broadcast_chats | broadcast_dm | neuro_commenting |
# neuro_dialogs | ai_salesman | ai_autoresponder
accounts: list[int] # ID аккаунтов
targets: list[str] # @username / ссылки на чаты / номера
ai_preset_id: Optional[int] = None
custom_prompt: str = ""
delay_min: int = 30
delay_max: int = 120
daily_limit: int = 50
# для диалогов
max_messages: int = 5
# для продажника
qualification_criteria: dict = field(default_factory=dict)
notify_telegram: bool = True
def ai_submit_task(task: AITask) -> str:
"""Отправить AI задачу. Возвращает task_id"""
# POST /api/ai/:task_type body: {...}
...
def ai_get_task_status(task_id: str) -> dict:
"""Статус AI задачи"""
# GET /api/task-history/accounts/:task_id
...
def ai_get_presets(preset_type: str = "prompt") -> list[dict]:
"""Получить AI пресеты (промпты или фото)"""
# GET /api/ai-presets/prompts | /api/ai-presets/photos
...
# --- Автопрогрев ---
def auto_warmup_start(account_id: int, config: dict) -> bool:
"""
Запустить автопрогрев аккаунта:
- подписки на каналы
- чтение постов
- реакции
- просмотр историй
- поведенческие паттерны
"""
# POST /api/auto-warmup/:id
...
def auto_warmup_status(account_id: int) -> dict:
"""Статус прогрева: прогресс, trust_score, дата последнего"""
# GET /api/auto-warmup/:id
...
# --- Парсинг ---
@dataclass
class ParseTask:
source_type: str # channel | chat | audience | tgstat
source: str # @username или ссылка
parse_type: str = "members" # members | active | admins
filters: dict = field(default_factory=dict) # country, premium, etc
output_format: str = "csv"
def parse_start(task: ParseTask) -> str:
"""Запустить парсинг. Возвращает task_id"""
# POST /api/ai/parse body: {...}
...
def parse_report(task_id: str) -> list[dict]:
"""Результаты парсинга"""
# GET /api/task-history/accounts/:task_id
...
# --- Нейрокомментинг ---
def neuro_commenting_start(accounts: list[int], channels: list[str],
ai_preset_id: int, delay: tuple[int, int] = (30, 120)) -> str:
"""
ИИ-комментирование:
- Анализирует пост в канале
- Генерирует релевантный комментарий от лица аккаунта
- Постит с задержкой
"""
# POST /api/ai/neuro_commenting
...
# --- Нейродиалоги ---
def neuro_dialogs_start(accounts: list[int], targets: list[str],
ai_preset_id: int, scenario: str = "promote",
max_dialog_msgs: int = 5) -> str:
"""
ИИ находит чаты и рассказывает о продукте в подходящий момент.
Или: заходит в ЛС, ведёт диалог по сценарию.
"""
# POST /api/ai/neuro_dialogs
...
# --- ИИ Продажник ---
def ai_salesman_start(accounts: list[int], targets: list[str],
criteria: dict, notify_telegram_id: str = "") -> str:
"""
3-фазный продажник:
1. Пишет первым каждому из базы
2. Квалифицирует: задаёт вопросы, сверяет с критериями
3. При совпадении — уведомление в Telegram с контактом и историей
"""
# POST /api/ai/ai_salesman
...
# --- ИИ Рассылка ---
def ai_broadcast_chats(accounts: list[int], chats: list[str],
ai_preset_id: int, mode: str = "basic") -> str:
"""
Рассылка по чатам.
mode: basic | multi_phase | postbot
"""
# POST /api/ai/broadcast_chats
...
def ai_broadcast_dm(accounts: list[int], targets: list[str],
ai_preset_id: int) -> str:
"""Рассылка в личные сообщения"""
# POST /api/ai/broadcast_dm
...
# --- Автоответчик ---
def ai_autoresponder_start(account_id: int, ai_preset_id: int,
scenario: str = "support") -> str:
"""ИИ автоответчик на входящие сообщения"""
# POST /api/ai/ai_autoresponder
...
# --- Накрутка ---
def nakrutka_reactions(accounts: list[int], post_link: str,
reaction_type: str = "👍", count: int = 100) -> str:
"""Массовые реакции на пост"""
# POST /api/ai/reactions (только Ultra)
...
def nakrutka_views(accounts: list[int], post_link: str, count: int = 1000) -> str:
"""Накрутка просмотров на пост"""
# POST /api/ai/views (только Ultra)
...
def mass_looking(accounts: list[int], targets: list[str]) -> str:
"""Массовый просмотр профилей (Mass Looking)"""
# POST /api/ai/mass_looking
...
# --- Отметки в сторис ---
def story_mentions(accounts: list[int], story_media: str,
targets: list[str]) -> str:
"""
Отметки пользователей в сторис.
Упомянутый получает уведомление → смотрит историю → переходит в канал.
"""
# POST /api/ai/story_mentions (только Ultra)
...
def story_repost_preview(story_link: str) -> dict:
"""Предпросмотр истории перед репостом"""
# GET /api/story-repost/preview
...
def story_repost_viewers(story_link: str) -> list[str]:
"""Список зрителей истории"""
# GET /api/story-repost/viewers
...
# --- Инвайтер ---
def inviter_start(accounts: list[int], invite_link: str, count: int = 100) -> str:
"""Массовое приглашение в канал/чат"""
# POST /api/ai/inviter
...
# --- Каналы ---
def channel_create_copy_post(source_channel: str, target_channel: str,
accounts: list[int]) -> str:
"""Копирование постов между каналами"""
# POST /api/channel-create/copy-post
...
def channel_get_templates() -> list[dict]:
"""Шаблоны для каналов"""
# GET /api/channel-create/templates
...
# --- Граббер ---
def grabber_start(source_channels: list[str], accounts: list[int]) -> str:
"""Сбор контента из каналов (текст, медиа, ссылки)"""
# POST /api/ai/grabber
...
# --- Сессионный дубликатор ---
def session_duplicate(account_id: int) -> str:
"""Клонировать сессию аккаунта (для параллельного использования)"""
# POST /api/session-duplicator/:id
...
def session_download(account_id: int) -> bytes:
"""Скачать .session файл"""
# GET /api/session-duplicator/download/:id
...
def session_switch(account_id: int, new_session_id: int) -> bool:
"""Переключить аккаунт на другую сессию"""
# POST /api/session-duplicator/switch/:id
...
# --- Профили ---
def profile_presets_list() -> list[dict]:
"""Список пресетов профилей (имя + био + фото)"""
# GET /api/profile-presets/list
...
def profile_random() -> dict:
"""Случайный пресет профиля"""
# GET /api/profile-presets/random
...
def profile_templates() -> list[dict]:
"""Шаблоны профилей"""
# GET /api/profile-templates
...
def profile_upload_photo(photo_file: str) -> str:
"""Загрузить фото для профиля"""
# POST /api/profile-templates/photos/upload
...
# --- Воркспейсы / Команда ---
def workspace_list() -> list[dict]:
"""Список воркспейсов"""
# GET /api/workspaces
...
def workspace_set_active(workspace_id: int) -> bool:
"""Сменить активный воркспейс"""
# POST /api/workspaces/active
...
def team_context() -> dict:
"""Контекст команды (права, роли)"""
# GET /api/team/context
...
# --- Биллинг ---
def subscribe_start(tariff: str, payment_method: str = "crypto") -> dict:
"""Оформить подписку. payment_method: crypto | card | sbp"""
# POST /api/subscribe/start
...
def subscribe_status() -> dict:
"""Статус подписки: active/inactive, тариф, дата окончания"""
# GET /api/subscribe/active
...
def currency_rate() -> dict:
"""Курс валют для крипто-оплаты"""
# GET /api/currency/rate
...
# === АНТИ-ДЕТЕКТ И ЗАЩИТА ===
ANTI_DETECT_LAYERS = {
"captcha_solver": "85% капч авто-решаются (боты проверки Telegram)",
"trust_score": "Рейтинг надёжности каждого аккаунта (0-100)",
"auto_limits": "Безопасные лимиты по умолчанию для всех действий",
"intervals": "Паузы между действиями с рандомизацией",
"proxy_per_account": "Отдельный резидентский прокси на каждый аккаунт",
"warmup_before_use": "Обязательный прогрев перед рассылкой/комментингом",
"spamblock_check": "Авто-проверка @SpamBot при подозрении на спамблок",
"session_isolation": "Изолированные сессии через встроенный Telegram Web",
"cloud_execution": "24/7 облачное исполнение, IP ротация на стороне сервера",
}
# === СРАВНЕНИЕ С DESKGRAM ===
COMPARISON = {
"architecture": {
"darktelegram": "SaaS Cloud (FastAPI + React SPA). Нет десктоп-клиента. 24/7 сервера.",
"deskgram": "Desktop (PE32+ C++ dropper → Python/Telethon workers). Локальный сервер 127.0.0.1:5000.",
},
"auth": {
"darktelegram": "email+password, Google OAuth, Telegram OAuth, Cloudflare Turnstile",
"deskgram": "activation_key (Prodamus), JWT refresh",
},
"accounts": {
"darktelegram": ".session + tdata import, встроенный LZT Market, phone auth flow",
"deskgram": ".session import, ручная авторизация через код",
},
"modules": {
"darktelegram": "~15 модулей (AI-центричные)",
"deskgram": "82 модуля (всё что можно автоматизировать)",
},
"ai": {
"darktelegram": "Своя AI-инфраструктура (OpenRouter?), пресеты промптов и фото",
"deskgram": "io.net, OpenRouter (14 моделей), Mistral API",
},
"unique": {
"darktelegram": "ИИ Продажник (3-фазный), Session Duplicator, Story Mentions, Telegram Web в дашборде",
"deskgram": "Инвайт по гео, Remove SpamBlock, 12 категорий модулей",
},
"pricing": {
"darktelegram": "$49-130/мес + модули à la carte + AI токены",
"deskgram": "16,990₽/год (~$15/мес) единый тариф",
},
}
# === УЯЗВИМОСТИ И ВЕКТОРЫ ===
VULNERABILITIES = {
"turnstile_bypass": {
"target": "/api/auth/register",
"vector": "Отсутствует серверная валидация Turnstile? Нужно проверить через реплей запроса без токена",
"status": "НЕ ПРОВЕРЕНО — нужен реплей без cf-turnstile-response",
},
"rate_limiting": {
"target": "/api/auth/login",
"vector": "Нет видимого rate-limit в ответах. 429 не тестировался",
"status": "НЕ ПРОВЕРЕНО",
},
"id_enumeration": {
"target": "/api/accounts/summary, /api/accounts/trust",
"vector": "ID аккаунтов последовательные? Можно перебирать чужие аккаунты",
"status": "НЕ ПРОВЕРЕНО — нужна сессия",
},
"ai_preset_injection": {
"target": "ai_presets",
"vector": "Можно ли инжектить промпт в AI задачу через кастомный preset?",
"status": "Требует анализа формата пресетов",
},
"session_leak": {
"target": "/api/session-duplicator/download/:id",
"vector": "Можно ли скачать чужую сессию при IDOR?",
"status": "КРИТИЧЕСКИЙ ВЕКТОР — нужна авторизованная сессия для теста",
},
}
if __name__ == "__main__":
print(f"DarkTelegram.pro reverse — {len(ENDPOINTS)} API endpoint'ов")
print(f"Модулей: {len(MODULES)}, Тарифов: {len(TARIFFS)}")
print(f"Векторов для проверки: {len(VULNERABILITIES)}")
print("\n=== УНИКАЛЬНЫЕ ФИЧИ ===")
for k, v in COMPARISON["unique"].items():
print(f" {k}: {v}")