Пользователь
0,0
рейтинг
3 июня 2015 в 19:12

Разработка → Вычисляем персонажей гейммастеров в World of Warcraft с помощью Python из песочницы

Python*, API*
Был у меня как-то сайт по поиску твинков в World of Warcraft. Любой мог ввести ник и получить список персонажей, находящихся на той же записи (если данные имелись в базе сайта, конечно).

И вот однажды ко мне зашел посетитель из Blizzard:

image

99% людей во время первого посещения ищут себя и своих друзей. Посетитель из Франции не стал исключением и оставил в логе просмотров несколько персонажей, скорее всего принадлежащих работникам близзард (что было видно по активности на форуме и другим признакам). Конечно, мне стало интересно, чем же отличаются персонажи гейммастеров от персонажей обычных смертных и отличаются ли вообще.

После просмотра ачивок этих персонажей стало ясно, что при поступлении на службу новоиспеченному ГМу выдают набор коллекционных изданий всех игр близзард. После более пристального изучения вскрылась одна деталь: все коллекционки получены в один день (видимо, примерная дата поступления на работу).

image

Используем API Battle.net


Гмы получают все существующие (на дату получения) коллекционки — а значит, и самую первую, «ванильную». Она была выпущена больше 10 лет назад и сегодня достать ее можно разве что на ebay за 2-3 тысячи евро. Её-то и будем использовать для поиска других персонажей.

Искать будем персонажей, у которых есть такой пет (его дают бонусом за активацию ванильной коллекционки):

image

Так как прямого доступа к спискам персонажей API не предоставляет, будем искать персонажей через аукцион.

realm = "гордунни"  # реалм, на котором будем искать персонажей

# Получаем ссылку на дамп аукциона
r = requests.get("http://eu.battle.net/api/wow/auction/data/%s" % realm)
auction_dump_url = json.loads(r.text)["files"][0]["url"]

# Загружаем данные по лотам на аукционе
auc_data = json.loads(requests.get(auction_dump_url).text)

# Составляем список имен/реалмов персонажей
chars = {(lot["owner"], lot["ownerRealm"]) for lot in auc_data["auctions"]["auctions"]}

В этой функции определяем, является ли персонаж потенциальным гмом:

def is_gm(name, realm):
    r = requests.get(CHAR_API_URL.format(name=name, realm=realm))
    if r.text.find("Panda Cub") != -1:
        return True

Запускаем проверку:

for name, realm in chars:
    if is_gm(name, realm):
        print("Возможно ГМ: %s %s" % (name, realm))
    time.sleep(1)

Код скрипта целиком
import json
import requests
import time


CHAR_API_URL = "http://eu.battle.net/api/wow/character/{realm}/{name}?fields=pets,guild"

# В этой функции определяем, является ли персонаж потенциальным гмом
def is_gm(name, realm):
    r = requests.get(CHAR_API_URL.format(name=name, realm=realm))
    if r.text.find("Panda Cub") != -1:
        return True


realm = "гордунни"  # реалм, на котором будем искать персонажей

# Получаем ссылку на дамп аукциона
r = requests.get("http://eu.battle.net/api/wow/auction/data/%s" % realm)
auction_dump_url = json.loads(r.text)["files"][0]["url"]

# Загружаем данные по лотам на аукционе
auc_data = json.loads(requests.get(auction_dump_url).text)

# Составляем список имен/реалмов персонажей
chars = {(lot["owner"], lot["ownerRealm"]) for lot in auc_data["auctions"]["auctions"]}

# Запускаем проверку
for name, realm in chars:
    if is_gm(name, realm):
        print("Возможно ГМ: %s %s" % (name, realm))
    time.sleep(1)


Примечание: скрипт ищет только персонажей, выставляющих лоты на аукционе. Для более широкого охвата можно также сканировать согильдийцев каждого владельца лота.

Дальше нужно смотреть другие признаки — сколько получено коллекционок за один день, их общее кол-во и так далее.
Конечно, не каждый персонаж, который соответствует критериям, принадлежит ГМу. Это может быть и просто коллекционер, например.

Для отображения результатов скрипта создал простенький сайт: http://wow-gm-track.website

Из интересностей: в процессе сканирования выявились целые гнезда — гильдии, в которых сразу несколько разных аккаунтов, принадлежащих (предположительно) ГМам. Например: Зов древних (6 штук, в том числе глава гильдии).

И немного статистики: на сегодняшний день просканировано 1,7 миллиона персонажей на русскоязычных реалмах, ванильную коллекционку имеют 1306 персонажей (0,07%), из них только 380 персонажей получили хотя бы 4 коллекционки в один день (0,02% от общего числа).
@bmkn
карма
4,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (15)

  • 0
    А как вы твинков вычисляете? По ачивкам?
    • +1
      По хешу списка питомцев. Отображение ачивок можно отключить в настройках игры, а питомцев уже никак не скроешь.
  • 0
    Я только одного не понял — зачем им всё это выдают? В моем представлении персонаж ГМу нужен только для присутствия в игре и общения, и тусуется он обычно в какой-то специальной локации, либо просто невидим. Если под ГМом в статье подразумевается просто сотрудник Blizzard, то другой разговор.
    • 0
      В статье по персонажем ГМа, скорее всего имелись в виду личные персонажи, а не рабочие.
    • 0
      Да, имеются в виду личные игровые персонажи сотрудников. Назвал их ГМами для краткости, должность, я думаю, может быть любая.
    • 0
      > Я только одного не понял — зачем им всё это выдают?

      Премия за усердную работу :)
      • 0
        Чтобы снизить производительность и чтобы остальным не приходилось так усердно работать стараясь поспеть за звездами :).
      • 0
        Я подозреваю, выдают их абсолютно всем в качестве бонуса. Как печеньки в офисе. Только компании это еще и ничего не стоит. :)
        • +2
          Совершенно верно. Более того, частенько выдают еще и с запасом для друзей (не сотрудников), есть бонусы типа вечной подписки (на самом деле, пока сотрудник работает).
  • 0
    Глава гильдии «Зов древних» как то совсем не одет. Интересно по какой причине, зашел в дренор, но не стал играть?
    • +1
      Не понравилось.
      • 0
        Вы предполагаете или вы это он и есть?
  • 0
    Какое-то неуютное чувство после прочтения…
    Получается вы использовали статистику своего сайта для вычисления информации о пользователях и воспользовались этим? Или любой пользователь может у вас посмотреть с какого адреса и что делал другой пользователь?
    Если первый вариант, то это как-то не честно — пользователь (в данном случае работник blizzard) доверяет вам свои личные (ip, привычку вводить себя и друзей и т.д.) данные, основываясь на том, что приличные админы приличных сайтов не будут с помощью этих данных на него охотиться…
    Я понимаю, что есть люди, которые для такого только сайты и создают, но считаю, что это не профессионально.
    И мало того, что выследили, так ещё и в открытый доступ выложили…
    • +4
      Вы не поверите, ваши личные данные, интересы, поисковые запросы, фотографии и списки друзей, которые вы доверили Фейсбуку, ВК и прочим империям добра открыто продают рекламодателям. Да, прикрываясь словами об обезличивании и пр. А уж интересующимся товарищам из спецслужб просто так, бесплатно выдают, и без всякого обезличивания — некто Сноуден про это писал. Там-то, безусловно, работают добрые высокоморальные люди, которые эти данные если используют, то только во благо всего человечества. Ну или хотя бы его лучшей части.
    • +1
      Вы вероятно никогда не сталкивались с аналитикой посетителей с Digital Marketing и т.п.
      О вас давно уже известно все владельцам сайтов где вы проводите время.
      Вас уже давно посчитали и используют эту информацию в своих целях.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.