zGorikzz 0 Posted January 18, 2015 Приветствую всех! Всё началось с того когда я увидел бойца с ником djalil у которого просто сумасшедшее количество боёв на ис-7. Сам я очень люблю объект 140 и без малого откатал на этом замечательном танке 5к+ боёв. И тогда я задался вопросом, а есть ли ещё игроки у которых на аккаунте на объекте 140 больше боёв чем у меня. Думаю множество из Вас подумали, что конечно есть ведь для многотысячной аудитории worldoftanks это пустяк ( какие то 5к на определённом танке). Но я решил не останавливаться на каких то догадках и проверить на практике мои предположения. Сервисы типо kttc.ru, wot-new.com инфы о количестве боёв на танке по всем игрокам ру-кластера не предоставляют( если это не так то очень буду благодарен если дадите ссылочку). Тогда я решил отправиться на офф. сайт танков далее кабинет разработчика и изучил API. Затем написал небольшой код на javascript'e. Алгоритм работы такой: берем URL ссылку по которой обращаемся к серверу он даёт ответ такого вида: {"status":"ok","count":1,"data":{"10776079":[{"all":{"battles":5137}}]}}. Нам интересно поле battles с его значением. В строке URL фигурирует такой параметр как account_id собственно его нам и нужно менять от 0 грубо говоря до какого то конечного числа. В итоге всё заработало т.е в цикле пробегали значения account_id=0 к примеру до account_id=1000. И через alert ( выводилось значение max кол-ва боёв на объекте 140 в заданном диапазоне). НО сразу хочу заметить, что данная операция занимало ~ 2 минуты. После того как я увеличил диапазон до 10000 и прождал примерно минут 11 всё завершилось ошибкой javascript execution exceeded timeout. Даже если избавиться от данной ошибки и заставить скрипт и далее обрабатывать строки и делать запросы к серверу данная операции при количестве acсount_ id в несколько сотен тысяч займёт очень, очень, очень длительно время. Прошу помощи, если у кого то есть идеи.Заранее спасибо!!! Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #244760 Posted January 18, 2015 Прошу помощи, если у кого то есть идеи. WG API умеет отдавать информацию о сотне игроков за один запрос - account_id нужно указывать через запятую. Браузер замените на Chrome/Opera, а ещё лучше воспользоваться Node JS. P.S. Обрабатывать большой объём данных на JS - не очень хорошая идея. Quote Share this post Link to post Short link Share on other sites
zGorikzz 0 #244774 Posted January 18, 2015 (edited) WG API умеет отдавать информацию о сотне игроков за один запрос - account_id нужно указывать через запятую. Браузер замените на Chrome/Opera, а ещё лучше воспользоваться Node JS. P.S. Обрабатывать большой объём данных на JS - не очень хорошая идея. Ну мне получается через запятую нужно будеть прописать несколько тысяч account_id. В качестве среды разрабокти я использовал NetBeans, который в свою очередь запускал Chrome Edited January 18, 2015 by zGorikzz Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #244777 Posted January 18, 2015 Имхо, js - не совсем тот ЯП, который пригоден для Ваших целей. Может, Шарп или с++? Опять же, это мое мнение. Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #244781 Posted January 18, 2015 Ну мне получается через запятую нужны будеть прописать несколько тысяч account_id. Нет. Через запятую нельзя указать больше сотни ID - это ограничение API. Вам нужно в цикле с увеличением счётчика на 100 создавать массив ID ([1,2,3 ...], [101,102,103 ...] и так далее), после чего добавлять в строку обычным Array.join(','). var i = 0 while(i <= 1000) { var id = new Array(); for(var n = i; n <= i + 100; n++) id.push(n); i = i + 100; //Тут формируем запрос с помощью id.join(','); и производим различные действия 'http://wgapi.com/bla/bla/bla/?someparam=1&account_id=' + id.join(','); } js - не совсем тот ЯП Согласен, странный выбор языка... Шарп или с++? Я бы посоветовал Perl, так как он создавался специально для таких целей (обработки списков\данных и невероятных извращений). Судя по всему ТС занимается web-программированием и переход на C#\C++ будет очень тяжёлым. Тут будет лучше Lua - быстрая, маленькая и лёгкая. В качестве среды разрабокти я использовал NetBeans Ух ты! Я и не думал, что для JS есть среда разработки. Quote Share this post Link to post Short link Share on other sites
Pavel3333 1,148 #244788 Posted January 18, 2015 Согласен, странный выбор языка... Я бы посоветовал Perl, так как он создавался специально для таких целей (обработки списков\данных и невероятных извращений). Судя по всему ТС занимается web-программированием и переход на C#\C++ будет очень тяжёлым. Точно, про перл забыл. Про переход н c# - не сказал бы,языки схожи по синтаксису, ну запомнить названия библиотек, их описания, поользоваться удобным мсдн, никакого дискомфорта здесь не вижу. Плюсы легко учить после шарпа, с жс - да, сложно. Но это по переход, а так, лучше уж перл, про него, честно, подзабыл. Quote Share this post Link to post Short link Share on other sites
seriych 2,178 #244791 Posted January 18, 2015 Сам я очень люблю объект 140 и без малого откатал на этом замечательном танке 5к+ боёв. И тогда я задался вопросом, а есть ли ещё игроки у которых на аккаунте на объекте 140 больше боёв чем у меня. "Это возможно не все:" vbattles vdmg battles xwn8 winrate account 11437 1676 40370 49 49.0% http://worldoftanks.ru/community/accounts/7663786- 9563 2119 35067 60 50.3% http://worldoftanks.ru/community/accounts/7893824- 7514 1775 30543 39 47.4% http://worldoftanks.ru/community/accounts/18078325- 7065 1855 23743 52 50.0% http://worldoftanks.ru/community/accounts/5144526- 6435 1636 16742 44 49.1% http://worldoftanks.ru/community/accounts/8531715- 6402 3198 56194 88 58.3% http://worldoftanks.ru/community/accounts/53655- 6393 1877 70086 57 49.9% http://worldoftanks.ru/community/accounts/488609- 6303 2261 44022 79 55.1% http://worldoftanks.ru/community/accounts/8533551- 6294 1543 35325 40 47.9% http://worldoftanks.ru/community/accounts/13694410- 6193 2120 10354 66 53.3% http://worldoftanks.ru/community/accounts/18298912- 6162 2563 34752 88 56.1% http://worldoftanks.ru/community/accounts/7361644- 6097 2184 15835 67 50.8% http://worldoftanks.ru/community/accounts/541996- 5788 2505 35842 83 54.6% http://worldoftanks.ru/community/accounts/708266- 5654 3001 26286 99 67.7% http://worldoftanks.ru/community/accounts/15239062- 5610 1765 25930 45 50.3% http://worldoftanks.ru/community/accounts/16065597- 5596 2017 26427 55 48.7% http://worldoftanks.ru/community/accounts/10667387- 5585 2067 12450 63 52.9% http://worldoftanks.ru/community/accounts/18197279- 5519 1834 56856 39 47.5% http://worldoftanks.ru/community/accounts/15031022- 5302 1690 36195 46 48.4% http://worldoftanks.ru/community/accounts/15108520- 5249 1662 24120 44 47.3% http://worldoftanks.ru/community/accounts/3589995- 5105 1403 19154 39 47.9% http://worldoftanks.ru/community/accounts/15871446- 5045 2522 36917 75 55.3% http://worldoftanks.ru/community/accounts/2113867- 5030 1588 17044 38 46.3% http://worldoftanks.ru/community/accounts/12494670- 5028 2029 43170 60 52.6% http://worldoftanks.ru/community/accounts/11277977- 5016 1898 20672 47 48.0% http://worldoftanks.ru/community/accounts/13214777- Через запятую нельзя указать больше сотни ID20 Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #244808 Posted January 18, 2015 20 Quote Share this post Link to post Short link Share on other sites
seriych 2,178 #244816 Posted January 18, 2015 , нежданчик. 20 вроде было Quote Share this post Link to post Short link Share on other sites
zGorikzz 0 #244929 Posted January 18, 2015 Нет. Через запятую нельзя указать больше сотни ID - это ограничение API. Вам нужно в цикле с увеличением счётчика на 100 создавать массив ID ([1,2,3 ...], [101,102,103 ...] и так далее), после чего добавлять в строку обычным Array.join(','). var i = 0 while(i <= 1000) { var id = new Array(); for(var n = i; n <= i + 100; n++) id.push(n); i = i + 100; //Тут формируем запрос с помощью id.join(','); и производим различные действия 'http://wgapi.com/bla/bla/bla/?someparam=1&account_id=' + id.join(','); } Согласен, странный выбор языка... Я бы посоветовал Perl, так как он создавался специально для таких целей (обработки списков\данных и невероятных извращений). Судя по всему ТС занимается web-программированием и переход на C#\C++ будет очень тяжёлым. Тут будет лучше Lua - быстрая, маленькая и лёгкая. Ух ты! Я и не думал, что для JS есть среда разработки. хочу попробовать твоим способом сделать через join, если что дельного получится сообщу Нет. Через запятую нельзя указать больше сотни ID - это ограничение API. Вам нужно в цикле с увеличением счётчика на 100 создавать массив ID ([1,2,3 ...], [101,102,103 ...] и так далее), после чего добавлять в строку обычным Array.join(','). var i = 0 while(i <= 1000) { var id = new Array(); for(var n = i; n <= i + 100; n++) id.push(n); i = i + 100; //Тут формируем запрос с помощью id.join(','); и производим различные действия 'http://wgapi.com/bla/bla/bla/?someparam=1&account_id=' + id.join(','); } Согласен, странный выбор языка... Я бы посоветовал Perl, так как он создавался специально для таких целей (обработки списков\данных и невероятных извращений). Судя по всему ТС занимается web-программированием и переход на C#\C++ будет очень тяжёлым. Тут будет лучше Lua - быстрая, маленькая и лёгкая. Ух ты! Я и не думал, что для JS есть среда разработки. В запросе нельзя указывать массив id, только одно значение, так что способ такой не работает Quote Share this post Link to post Short link Share on other sites
seriych 2,178 #244941 Posted January 18, 2015 В запросе нельзя указывать массив id, только одно значение http://ru.wargaming.net/developers/api_explorer/wot/account/tanks/?application_id=demo&fields=statistics.battles&account_id=7663786,7893824,18078325&tank_id=16897&http_method=GET&run=1 Quote Share this post Link to post Short link Share on other sites
zGorikzz 0 #244943 Posted January 18, 2015 http://ru.wargaming.net/developers/api_explorer/wot/account/tanks/?application_id=demo&fields=statistics.battles&account_id=7663786,7893824,18078325&tank_id=16897&http_method=GET&run=1 спасибо большое, от души, немного в другой вкладке смотрел, там тип numeric был тольк, а не list Quote Share this post Link to post Short link Share on other sites
zGorikzz 0 #245020 Posted January 19, 2015 Честно говоря так ничего и не получилось с учётом того, что account_id предложенным способом не более 100 запросов можно выполнять. То очень много времени понадобится чтобы обработать несколько миллионов(( Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #245034 Posted January 19, 2015 account_id предложенным способом не более 100 запросов можно выполнять Нет. За один запрос вы получаете информацию о 100 игроках. Это в 100 раз быстрее изначального метода. То очень много времени понадобится чтобы обработать несколько миллионов(( Ничего с этим не поделать. Хотя, можно узнать приблизительное время. Если за 2 минуты изначально обрабатывалось 1000 игроков, то по-новому вы обработаете это количество игроков за 1.2 секунды. Один миллион - 1200 секунд или 20 минут. 75 миллионов (Последнее зафиксированное кол-во аккаунтов на RU,EU,NA кластерах) - 25 часов. ----------------------- Но на практике это время скорее всего увеличится на 20-40% Quote Share this post Link to post Short link Share on other sites
zGorikzz 0 #245036 Posted January 19, 2015 ну да в этом то всё и дело поэтому наверное и нет такого сервиса по боям на отдельном танке, так бы сделали давно Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #245078 Posted January 19, 2015 сервиса по боям на отдельном танке Тут, например. Статистика танка -> Лучшие игроки по количеству игр. Quote Share this post Link to post Short link Share on other sites
zGorikzz 0 #245094 Posted January 19, 2015 Тут, например. Статистика танка -> Лучшие игроки по количеству игр. офигеть как они это сделали?) они же исходники не покажут Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #245127 Posted January 19, 2015 как они это сделали Отдельный сервер собирает и анализирует данные из API, после чего складывает их в базу данных. А основной сервер лишь читает эту БД, выбирая лучших. И это явно не на JS - сборкой данных занимается Perl/Python, а отображением - PHP. Хотя это только догадки, ведь ничто не мешает и на BF написать. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #247313 Posted February 2, 2015 (edited) на GET - запросы ограничение - 256 символов в URL, отсюда следует что 100 игроков в GET не поместится, поэтому надо использовать POST запросы ничто не мешает и на BF написать. Сразу на Assembler'е тогда уж) Многие используют в back-end'е нативные языки: Java EE или ASP.NET. Знаю, что XVM сейчас работает на Java, а БД держит на Mongo DB Edited February 2, 2015 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #247323 Posted February 2, 2015 Сразу на Assembler'е тогда уж) Написать на ассемблере будет гораздо легче, чем на BF. В Windows есть куча функций в WinAPI, в *nix - системные вызовы (Можно использовать libc, но это не труЪ метод). Проблемы могут возникнуть только с JSON'ом. Нужно будет писать свой парсер, или воспользоваться какой-нибудь библиотекой. Я никогда не понимал тех, кто считает, что ассемблер - очень сложный язык. Он прост, проще чем современные "комбайны". Вот только он навязывает иной способ мышления, понять который может не каждый. Quote Share this post Link to post Short link Share on other sites