Lazy 0 Posted December 14, 2017 (edited) Привет. Я хочу сохранять результат боя в google sheets. Саму технологию сохранения знаю, и в данный момент это сделано на java. Но результаты боя беру из json который делает pmod. Не охото сильно углублятся в phyton, хочется сделать даже не мод а скрипт, который будет сохранять результат в гугл таблицу. Сама идея такая, запускаю скрипт который проверяет папку с результатами раз в 1 минуту нет ли новых файлов. Если появился то отправляю на google table. Теперь вопросы. Как распарсить результат боя?(вроде находил что результат боя это обычная сериализация через cPickel(или как он там называется) и достаточно просто получить результаты, но хотелось бы уточнить у того кто это делал) Можно ли сделать скрипт Phyton который будет работать отдельно от Wot и если да то как получить BattleResult из библиотеки wot. Edited December 14, 2017 by Lazy Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415021 Posted December 14, 2017 2 часа назад, Lazy сказал: Сама идея такая, запускаю скрипт который проверяет папку с результатами раз в 1 минуту нет ли новых файлов. Если появился то отправляю на google table. Тут есть несколько нюансов: - туда сохраняются далеко не все результаты (только если ты дождался окончания боя) - туда сохраняются результаты со всех акк-ов 1 Quote Share this post Link to post Short link Share on other sites
Lazy 0 #415047 Posted December 14, 2017 (edited) 1 час назад, ShuraBB сказал: Тут есть несколько нюансов: - туда сохраняются далеко не все результаты (только если ты дождался окончания боя) - туда сохраняются результаты со всех акк-ов - А где сохраняются все результаты? - Там же должен быть ник игрока? Если да то это не проблема. Насчет сериализации я правильно понял? http://wiki.vbaddict.net/pages/BattleResults Что результат боя это объект : batteresultversion, battleResults = cPickle.load(cachefile) Только я не совсем понимаю как работают два объекта(в java такого нет) arenaUniqueID = battleResults[0] data = battleResults[1] and battleResults[2] Дальше извлекаем нужную инфу и отправляем в таблицу. Или я не правильно понимаю? Edited December 14, 2017 by Lazy Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415060 Posted December 14, 2017 (edited) 4 часа назад, Lazy сказал: А где сохраняются все результаты? Нигде 4 часа назад, Lazy сказал: Там же должен быть ник игрока? Если да то это не проблема Не ник, а цифровой ID 4 часа назад, Lazy сказал: Насчет сериализации я правильно понял Да, только там далеко не все ;-) Вот полные результаты: Результаты боя 0.9.20.0.log 4 часа назад, Lazy сказал: batteresultversion, battleResults = cPickle.load(cachefile) Только я не совсем понимаю как работают два объекта(в java такого нет) Результат cPickle.load имеет два значения, первое присваивается batteresultversion, второе: battleResults Edited December 14, 2017 by ShuraBB 1 Quote Share this post Link to post Short link Share on other sites
Lazy 0 #415065 Posted December 14, 2017 (edited) 13 минут назад, ShuraBB сказал: Да, только там далеко не все ;-) Вот полные результаты: Результаты боя 0.9.20.0.log Это из результата боя? т.е. из C:\~\AppData\Roaming\Wargaming.net\WorldOfTanks\battle_results\ или как-то по другому получено? Я в phyton не очень, но вроде как я понял там все как массив сохранено. Т.е. чтобы получить данные x мне нужно взять battleResults[x]? Мне не нужно сохранять прям подробно, а скорее общую инфу о бое. Кредиты, опыт дамаг время. Edited December 14, 2017 by Lazy Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415072 Posted December 14, 2017 (edited) 17 минут назад, Lazy сказал: Это из результата боя? т.е. из C:\~\AppData\Roaming\Wargaming.net\WorldOfTanks\battle_results\ или как-то по другому получено? Если результат сохранен, то да он будет такой. Результаты я получаю по другому. 17 минут назад, Lazy сказал: Я в phyton не очень, но вроде как я понял там все как массив сохранено. Это называется "словарь" - неупорядоченные коллекции произвольных объектов с доступом по ключу. 17 минут назад, Lazy сказал: Т.е. чтобы получить данные x мне нужно взять battleResults[x] Не совсем. Результаты боя это словарь словарей: { arenaUniqueID: 3044776834671755, personal: {10529: {}}, vehicles: {}, avatars: {}, players: {}, common: {} } К примеру: battleResults['common']['arenaCreateTime'] Edited December 14, 2017 by ShuraBB 1 Quote Share this post Link to post Short link Share on other sites
Lazy 0 #415079 Posted December 14, 2017 4 минуты назад, ShuraBB сказал: Это называется "словарь" - неупорядоченные коллекции произвольных объектов с доступом по ключу. Не совсем. Результаты боя это словарь словарей: Спасибо! Кажется понял. Я думал что battleResults что это объект/класс wot библиотеки, а получается это просто название переменной которая является словарем словарей. Обязателен доступ по ключу или можно получить по 1,2,3? (battleResults[2]) В общем стало понятнее! Спасибо! Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415083 Posted December 14, 2017 3 минуты назад, Lazy сказал: Обязателен доступ по ключу или можно получить по 1,2,3? (battleResults[2]) Только по ключу 1 Quote Share this post Link to post Short link Share on other sites
Lazy 0 #415100 Posted December 14, 2017 import cPickle import codecs cachefile = "F:\\12421317515158843.dat" with open(cachefile, 'rb') as pickle_file: content = cPickle.load(pickle_file) print (content) Получаю результат: (1, (12421317515158843L, 'x\x9ck`\x8a-d\xd4\xf0\xf2\xdb4\xff\xa8\x9f\x9f_r||RifNIf^|<Wqj\tW!P\x9aY\xc3K\xf6\xaa\x1e\x83\xaf\xa1H[!\x8b\x97\x18\x88\xd9x\xb2\xad\x90\xd5K\x10\xcc\xe4o+dKm\r*d\xf7\xf3f\x06\x1a\xe1\xb5.... Как мне получить не двоичные данные, а норм текст? Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415132 Posted December 14, 2017 (edited) Я рекомендую вообще с этими файлами не парится: from PlayerEvents import g_playerEvents g_playerEvents.onBattleResultsReceived += onReceiveBattleResult def onReceiveBattleResult(isActiveVehicle, results): print results Edited December 14, 2017 by ShuraBB Quote Share this post Link to post Short link Share on other sites
Lazy 0 #415133 Posted December 14, 2017 2 минуты назад, ShuraBB сказал: Я рекомендую вообще с этими файлами не парится: from PlayerEvents import g_playerEvents g_playerEvents.onBattleResultsReceived += onReceiveBattleResult def onReceiveBattleResult(isActiveVehicle, results): print results Это же нужно как мод устанавливать? Или он отдельно будет работать? Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415134 Posted December 14, 2017 (edited) 3 минуты назад, Lazy сказал: Это же нужно как мод устанавливать? Или он отдельно будет работать? А, ну да, я все забываю что ты хочешь без клиента это сделать... Но может это все таки не правильный вариант? Можешь посмотреть как клиент работает с файлами кеша тут: scripts/client_common/shared_utils/account_helpers/BattleResultsCache.py Edited December 14, 2017 by ShuraBB 1 Quote Share this post Link to post Short link Share on other sites
Lazy 0 #415136 Posted December 14, 2017 (edited) 8 минут назад, ShuraBB сказал: А, ну да, я все забываю что ты хочешь без клиента это сделать... Можешь посмотреть как клиент работает с файлами кеша тут: scripts/client_common/shared_utils/account_helpers/BattleResultsCache.py Спасибо. Еще нашли такую штуку тоже завтра посмотрю https://github.com/raszpl/wotdecoder/blob/master/wotdecoder.py#L516-L524, надеюсь разберусь, хотя думал будет попроще ) 8 минут назад, ShuraBB сказал: Можешь посмотреть как клиент работает с файлами кеша тут: scripts/client_common/shared_utils/account_helpers/BattleResultsCache.py Что-то не могу найти такую папку, она где находится? Edited December 14, 2017 by Lazy Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415141 Posted December 14, 2017 2 часа назад, Lazy сказал: Как мне получить не двоичные данные, а норм текст? Там в BattleResultsCache.py есть функция convertToFullForm которая как раз и "приводит" к читаемому виду. Quote Share this post Link to post Short link Share on other sites
ShuraBB 1,151 #415227 Posted December 15, 2017 12 часов назад, Lazy сказал: Что-то не могу найти такую папку, она где находится? Все скрипты лежат в res\packages\scripts.pkg - это обычный zip-архив. После распаковки и получишь всю структуру. Только скрипты еще нужно декомпилировать (можно Орионом) BattleResultsCache.py Quote Share this post Link to post Short link Share on other sites
Lazy 0 #415301 Posted December 15, 2017 5 часов назад, ShuraBB сказал: Все скрипты лежат в res\packages\scripts.pkg - это обычный zip-архив. После распаковки и получишь всю структуру. Только скрипты еще нужно декомпилировать (можно Орионом) BattleResultsCache.py Спасибо! Quote Share this post Link to post Short link Share on other sites