Создание стороннего чат клиента для WorldOfTanks с использованием XMPP протокола. Часть 1
Posted January 7, 2022 by ‐ 4 min read
Всем привет!
У меня уже есть опыт погружения во взаимодействие с танковым чатом, но базировалось оно на высокоуровневом взаимодействии через перехват рендера сообщений в интерфейсе (в основе был xvm мод mod_chat_color.py). До самой начинки, которая принимает или отправляет сообщения я так и не добрался.
Я со скуки решил попробовать посмотреть какими пакетами обменивается танковый клиент с бекендом через Wireshark. Особо я там ничего не увидел, ввиду малого опыта в снифинге, но заметил DNS запросы которые делал клиент (один из последних видов нешифрованных сообщений)
Запрос на резолв
wotru.xmpp.wargaming.net
Я вспомнил, что уже видел упоминание xmpp протокола в исходниках клиента. И тут все сложилось для меня в единую картину понимания! Танковый чат работает на основе xmpp протокола! И похоже все события от сервера тоже приходят по этому протоколу.
Я прогуглил “wot xmpp” и все что смог найти - это обсуждение на форуме где кто-то пытался, как и я, зареверсить танковый чат и баг репорт в github либы Mixaill/galaxy-integration-wargaming
Пост с форума
Автор поста на форуме делился своими находками и даже какими-то скриптами, но сильно это не помогло. Я попытался на основе этих данных подключится к чат серверу, но я сделал очень много допущений, которые были очень далеки от реальности
Первый вариант скрипта для подключения к xmpp серверу
Параллельно пробовал подключиться обычными xmpp клиентами. Попробовал GUI Adium и коносольный profanity клиенты - все так же безрезультатно. Не зная точно всех настроек наверняка невозможно отдебажить процесс подключения.
После четного перебора всевозможных настроек я решил перейти к изучению репозитория galaxy-integration-wargaming. Сильно уж он был красиво и профессионально оформлен (и это внушало надежду). Оказалось, что это плагин интеграции танков в лаунчер (что-то вроде агрегатора игровых лаунчеров) GOG Galaxy 2.0 и судя по описанию он мог синхронизировать список друзей и показывать кто из них сейчас играет. Я решил, что стоит посмотреть как этот лаунчер вообще работает и мне очень повезло, так как он имеет версию под MacOS (у меня пока нет доступа к Windows машине) После регистрации и запуска я смог привязать аккаунт WG в лаунчере (лаунчер также поддерживал танковую 2FA) Все эти действия не дали мне новых данных, но внушили надежду на то, что код в репозитории действительно работает и стоит дальнейшего анализа.
В репозитории нашлись хостнеймы танковых серверов и даже какие-то ключи (предположительно client_id)
В документации плагина указан путь установки и папки с логами.
В логах при работе приложения GOG я увидел дебаг сообщения от библиотеки slixmpp
tail -f /Users/Shared/GOG.com/Galaxy/Logs/plugin-wargaming-91728e8a-33c3-4b6d-8382-4dd31043dec1.log
Логи плагина содержат дебаг сообщения о получении событий смены статуса онлайна друзей
Это означало, что код плагина успешно подключался к танковым серверам и принимал сообщения.
Теперь осталось разобраться как работает код плагина. Сам плагин размещен по пути, указанном в документации ~/Library/Application\ Support/GOG.com/Galaxy/plugins/installed/wargaming_91728e8a-33c3-4b6d-8382-4dd31043dec1
.
Код в plugin.py предполагает запуск плагина прямо из консоли. При запуске скрипта, он ругается на отсутствие аргументов token
и port
и завершает выполнение.
Ошибка при запуске plugin.py
Если честно, я так и не смог разобраться, что именно за токен и порт он от меня хочет. Пробовал разное - не помогло.
После загрузки приложения GOG и начала логина аккаунта WG появился доступ к логин странице через адрес в браузере http://127.0.0.1:13337/?view=login. Это страница авторизации, которая по умолчанию открывается внутри приложения и проводит нас через все шаги логина в аккаунт.
Я решил, что нужно сконцентрироваться на изучении класса XMPP клиента WgcXMPP. Выяснил, что для его инициализации необходим некий токен token1
. Его, на скорую руку, получил через log.error
в файле логов. Уже позже я понял, что все данные залогированые таким образом полетели в Sentry 😅 плагина.
Из неочевидного - token1
при каждом новом запуске генерируется заново и является паролем для логина на xmpp сервер.
Механизм получения токена реализован в классе WgcWgni метод create_token1
Я залогировал всю цепочку запросов, которую делает плагин при запуске GOG и смог воспроизвести их в Postman (ну почти… один из запросов сработал только через curl в консоли). Из Postman я экспортировал python код запроса и добавил их в функцию get_token()
которую вызываю при каждой инициализации xmpp клиента. Сами запросы уже содержат в себе hardcode токен, который был получен после логина с 2FA и этот способ не годится для долгосрочного использования, но пока это good enough решение.
Запуская клиент со своего скрипта, я вижу те же дебаг сообщения, что и при работе GOG.
Xmpp клиент обрабатывает только те сообщения, для которых у него зарегистрированы хендлеры. Т.е. теперь надо выяснить как называется ивент сообщения и зарегистрировать для него хендлер.
Когда искал документацию по регистрации хендлера, попал на сайт с примерами использования библиотеки slixmpp
. Возможно пригодится в будущем. Еще pdf документация библиотеки v1.7 и readthedocs версия
Пока ближе всего к тому, что мне надо это эти два файла:
Но пока не ясно как именно называется ивент от сервера, который будет нести в себе сообщение. Вот бы была возможность логировать все-все ивенты от сервера…
Думаю, стоит еще сделать по красоте сам репозиторий с моими наработками (подключить через сабмодуль репозиторий с galaxy-integration-wargaming). Пока открывать доступ в мир рано ибо там много хардкода запросов с моими ключами 😄.
И так, что делать дальше?
- Переделать репозиторий (подключить плагин как сабмодуль)
- Найти название ивента с сообщениями из чата
- Добавить возможность логиниться со своего аккаунта через веб страничку (чтобы убрать хардкод access токена)