Skip to content

Поддержка тестового окружения Telegram (тестовые DC)#1087

Open
itzme1on wants to merge 5 commits into
Flowseal:mainfrom
itzme1on:test-dc
Open

Поддержка тестового окружения Telegram (тестовые DC)#1087
itzme1on wants to merge 5 commits into
Flowseal:mainfrom
itzme1on:test-dc

Conversation

@itzme1on

@itzme1on itzme1on commented Jul 3, 2026

Copy link
Copy Markdown

Проблема

Прокси не умеет работать с тестовой средой Telegram: все таблицы IP — продовые, а у тестовых DC нет вебсокет фронта (kws{dc}.web.telegram.org). Клиент в тестовом режиме уходил на продовый DC и не проходил авторизацию.

Решение

Два механизма:

  • Автоматический: Telegram Desktop помечает тестовые DC сдвигом +10000 (10001-10003). Прокси распознаёт такие DC и ведёт их сразу в fallback на IP тестовых DC (прямой TCP / свой Cloudflare worker), минуя вебсокет и релеи. Работает сценарий основной + тестовый аккаунт в одном клиенте: продовый трафик идёт обычным маршрутом, тестовый — на тестовые DC соответственно.

  • Принудительный: добавлена опция force_test_dc (CLI-флаг --force-test-dc). Некоторые клиенты на базе библиотек отправляют в хендшейк номер тестового DC как обычный 1-3, и на стороне прокси он неотличим от продового.
    Например, Telethon: тестовая среда у него настраивается через session.set_dc(2, '149.154.167.40', 443), и в байты 60-61 заголовка уходит session.dc_id как есть, без сдвига (MTProxyIO.init_header). Для таких клиентов опция будет принудительно направлять весь трафик прокси сразу на тестовые DC. По умолчанию выключена.
    * Продовые аккаунты через прокси с этой опцией работать не будут.

Изменения

  • proxy/utils.py — добавлена таблица DC_TEST_IPS
  • proxy/bridge.py, proxy/tg_ws_proxy.py — маршрутизация: автодетект dc >= 10000, выбор таблицы IP, отключение продовых CF релеев для тестового трафика
  • proxy/config.py, CLI-флаг --force-test-dc
  • чекбокс в настройках трея (Windows/Linux/macOS) + переводы
  • документация: docs/TestDc.md

Проверка

  • Telegram Desktop с продовым и тестовым аккаунтами одновременно через один прокси: тестовый аккаунт авторизуется (DC10001 test env -> direct fallback -> TCP fallback to 149.154.175.10:443), продовый работает как раньше
  • обычный продовый сценарий остался без изменений в поведении

@itzme1on itzme1on requested a review from Flowseal as a code owner July 3, 2026 16:53
@Flowseal

Flowseal commented Jul 3, 2026

Copy link
Copy Markdown
Owner

А вы не проверяли?
image

@itzme1on

itzme1on commented Jul 3, 2026

Copy link
Copy Markdown
Author

Ёмаё, не проверял. Извиняюсь, был неправ. /apiws_test действительно работает и возвращает 101. Переделаю чуть позже PR

Учтены замечания @Flowseal: тестовый трафик идёт обычным вебсокет-пайплайном и CF-релеями с путём `/apiws_test` вместо прямого TCP; IP тестовых DC остались только для фоллбэков
@itzme1on

itzme1on commented Jul 3, 2026

Copy link
Copy Markdown
Author

@Flowseal сделал нормальную реализацию

@Flowseal Flowseal left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В GUI настройка force_test_dc точно не нужна
Оставить его нужно только через CLI и через конфиг-файл
TestDc.md без воды, просто зачем нужен и как/где включается
И написать, что работает только в случае с прямым DC->IP и воркерами
Из cfproxy убрать, сам я это поддерживать не буду, а кому надо - сами мозгами пораскинут. Или просто воркера сделают.

Comment thread proxy/bridge.py Outdated
Comment thread proxy/bridge.py Outdated
Comment thread proxy/tg_ws_proxy.py Outdated
@Flowseal

Flowseal commented Jul 3, 2026

Copy link
Copy Markdown
Owner

И хотелось бы результаты тестов увидеть после с verbose логами

@itzme1on

itzme1on commented Jul 4, 2026

Copy link
Copy Markdown
Author

@Flowseal из дебаг лога взял основное, но если тебе нужен весь - скину весь

Config: {... 'dc_ip': ['2:149.154.167.220','4:149.154.167.220'],
         'verbose': True, 'cfproxy': True,
         'cfproxy_worker_domain': ['x.workers.dev'],
         'force_test_dc': False ...}

# --- Test DC2  (auto-detected +10000)  ->  direct DC -> IP, test WS path ---
DEBUG  [c1] handshake ok: DC10002 proto=0xDDDDDDDD
INFO   [c1] DC10002 -> wss://kws2.web.telegram.org/apiws_test via 149.154.167.220
INFO   [c1] DC10002 WS session closed (normal): ^7.2KB (21 pkts) v20.0KB (35 pkts) in 100.8s

# --- Test DC1  (auto-detected +10000, not in dc_ip)  ->  CF worker ---
DEBUG  [c2] handshake ok: DC10001 proto=0xDDDDDDDD
INFO   [c2] DC10001 not in config -> fallback
INFO   [c2] DC10001 -> trying CF worker x.workers.dev for 149.154.175.10
INFO   [c2] DC10001 WS session closed (normal): ^5.3KB (15 pkts) v225.0KB (97 pkts) in 20.5s

@itzme1on itzme1on requested a review from Flowseal July 4, 2026 20:16

@Flowseal Flowseal left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Когда я говорил про raw_dc, это не подразумевало, что нужно везде заменять dc на raw_dc. Замените обратно где поменяли dc на raw_dc. Достаточно просто log.info сделать, что DC заменен с 10000+ в начале.

Comment thread proxy/bridge.py
Comment on lines +135 to +136
test_env = proxy_config.force_test_dc or raw_dc >= 10000
dc = raw_dc - 10000 if raw_dc >= 10000 else raw_dc

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вы это уже делали в tg_ws_proxy.py, просто передайте переменную какую-нибудь is_test_dc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants