Как работать с официальным Game Data API Blizzard

Раскрываем тайны Архива WoW: от Blizzard API до CASC-дампов. Учим парсить данные как профи, обходя лимиты и автоматизируя рутину для аддонов.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Под «архивом WoW» игроки и разработчики обычно понимают несколько разных сущностей: официальное API Blizzard (Game Data API), базы данных сообщества (Wowhead, Warcraft Logs, Raider․IO), а также локальные архивы аддонов (SavedVariables) или инструменты для дампа игровых данных (CASC)․ В этой статье мы подробно разберем, как правильно формировать запросы к основным источникам данных, какие существуют ограничения и как автоматизировать сбор информации․

Официальное Game Data API Blizzard (Battle․net API)

Это первичный источник достоверных данных о персонажах, гильдиях, аукционе, PvP-рейтингах и прохождении подземелий․

Аутентификация (OAuth 2․0)

Все запросы к современному API требуют токена доступа (Bearer Token)․ Прямые запросы с API-ключом в URL (старый формат) устарели и не работают․

  1. Регистрация приложения: Зайдите на Blizzard Developer Portal, создайте приложение (Client ID / Client Secret)․ Укажите Redirect URI (например, http://localhost/callback для тестов)․
  2. Получение Access Token (Client Credentials Flow): Подходит для доступа к публичным данным (профиль персонажа, аукцион, медиа)․
POST https://oauth․battle․net/token
Headers: Content-Type: application/x-www-form-urlencoded
Auth: Basic Auth (Client ID : Client Secret)
Body: grant_type=client_credentials

Ответ: JSON с полями access_token, token_type (Bearer), expires_in (обычно 3600 сек)․

Структура эндпоинтов и пространства имен (Namespaces)

Критически важный параметр — HTTP- Battlenet-Namespace․ Он определяет версию данных и регион․

  • dynamic-{region}, динамические данные (профили персонажей, аукцион, Mythic+ рейтинги)․ Пример: dynamic-eu, dynamic-us․
  • static-{region} — статические данные (информация об предметах, заклинаниях, расах, классах, зонах)․ Пример: static-eu․ Кэшируются надолго․
  • profile-{region} — профильные данные пользователя (требует User Access Token через Authorization Code Flow)․

Основные эндпоинты для запросов

Категория Эндпоинт (Пример для EU) Описание
Профиль персонажа /profile/wow/character/{realmSlug}/{characterName} Базовая инфа: уровень, раса, класс, итем уровень, гильдия․
Экипировка /profile/wow/character/{realmSlug}/{characterName}/equipment Слоты предметов, зачарования, камни, ремкомплекты․
Mythic+ Профиль /profile/wow/character/{realmSlug}/{characterName}/mythic-keystone-profile Рейтинг IO, лучшие прохождения, цветные ключи․
PvP Резюме /profile/wow/character/{realmSlug}/{characterName}/pvp-summary Рейтинги 2v2, 3v3, RBG, почетные звания․
Аукцион (Commodities) /data/wow/connected-realm/{connectedRealmId}/auctions/commodities Товары (реагенты, расходники), нет владельца, только цена/кол-во․
Аукцион (Items) /data/wow/connected-realm/{connectedRealmId}/auctions/items Предметы с уникальными бонусами (снаряжение) — есть владелец․
Статика: Предмет /data/wow/item/{itemId} Название, качество, уровень, статы, иконка, источник․

Пример запроса на Python (requests)

import requests
import time

CLIENT_ID = 'ваш_client_id'
CLIENT_SECRET = 'ваш_client_secret'
REGION = 'eu'
NAMESPACE_DYNAMIC = f'dynamic-{REGION}'
TOKEN_URL = f'https://{REGION}․battle․net/oauth/token'
API_BASE = f'https://{REGION}․api․blizzard․com'

_token_cache = {'token': None, 'expires': 0}

def get_access_token:
 global _token_cache
 if _token_cache['token'] and time․time < _token_cache['expires'] ⎯ 60:
 return _token_cache['token']
 
 resp = requests․post(TOKEN_URL, 
 data={'grant_type': 'client_credentials'},
 auth=(CLIENT_ID, CLIENT_SECRET))
 resp․raise_for_status
 data = resp․json
 _token_cache['token'] = data['access_token']
 _token_cache['expires'] = time․time + data['expires_in']
 return _token_cache['token']
def get_character_profile(realm_slug, char_name):
 token = get_access_token
 url = f"{API_BASE}/profile/wow/character/{realm_slug․lower}/{char_name․lower}"
 headers = {
 'Authorization': f'Bearer {token}',
 'Battlenet-Namespace': NAMESPACE_DYNAMIC,
 'Accept-Language': 'ru_RU' # Локализация ответов
 } params = {'fields': 'equipment,mythic_keystone_profile,pvp_summary'} # Экономия запросов
 resp = requests․get(url, headers=headers, params=params)
 
 if resp․status_code == 404:
 return None # Персонаж не найден
 resp․raise_for_status
 return resp․json

data = get_character_profile('гордунни', 'ИмяПерсонажа')
if data:
 print(f"{data['name']} ⏤ {data['level']} лвл, ilvl: {data['average_item_level']}")

Ограничения (Rate Limits) и лучшие практики

  • Лимит: Обычно 100 запросов в секунду на Client ID (может варьироваться)․ Превышение возвращает 429 Too Many Requests с заголовком Retry-After․
  • Кэширование: Статические данные (static-*) кэшируйте на сутки/недели․ Динамические, на 5-15 минут (профиль), 1 час (аукцион)․
  • Поля (fields): Всегда используйте параметр fields=․․․, чтобы не тянуть лишние данные (экономит трафик и время)․
  • Realm Slug: Используйте слаг сервера (например, гордунни, пиратская-бухта), а не русское название․ Список можно получить через /data/wow/realm/index․

Работа с архивами сообщества (Third-party APIs)

Часто официального API недостаточно (нет истории логов, нет детальной аналитики боссов, нет удобного поиска по аукциону за все время)․

Warcraft Logs (Аналитика рейдов/М+)

  • API: GraphQL (Endpoint: https://www․warcraftlogs․com/api/v2/client)․
  • Аутентификация: Personal Access Token (создается в настройках профиля на сайте)․
  • Ключевые запросы: reportData (поиск логов по гильдии/персонажу), reportFights (фазы босса, урон, хил, механики), rankings (парсинг по классам/спекам)․
  • Ограничения: Строгие лимиты по сложности запроса (Cost) и по времени (Throttling)․ Обязательно используйте Retry-After․

Raider․IO (Mythic+ и Рейдинг)

  • API: REST (https://raider․io/api/v1/)․
  • Публичный доступ: Не требует ключа для базовых запросов (но с низким лимитом)․ Для продакшена нужен API Key․
  • Главные эндпоинты: /characters/profile (профиль + скор), /mythic-plus/runs (история прогонов), /guilds/profile (прогресс гильдии)․

The Undermine Journal / TUJ / Wowhead (Аукцион и цены)

  • Предоставляют исторические данные цен (CSV/JSON дампы или API)․
  • Идеальны для анализа трендов рынка, чего нет в официальном API (там только снимок «прямо сейчас»)․

Локальные архивы: SavedVariables и аддоны

Если вам нужно собрать данные, которых нет в API (например, точные тайминги кастов, внутренние кэши аддонов, настройки UI), работайте с файлами SavedVariables․

Структура файлов

Путь: WTF/Account/{AccountName}/{RealmName}/{CharacterName}/SavedVariables/{AddonName}․lua

Файл, это валидный Lua-скрипт, объявляющий глобальную таблицу (обычно с именем аддона)․

Парсинг на Python (luaparser / slpp)

# pip install slpp
from slpp import slpp as lua

def parse_saved_variables(filepath):
 with open(filepath, 'r', encoding='utf-8') as f:
 content = f․read
 # Удаляем BOM если есть
 if content․startswith(''):
 content = content[1:]
 # slpp парсит Lua таблицы в Python dict
 data = lua․decode(content)
 return data

Экспорт данных через аддон (In-game -> Out-of-game)

Напишите мини-аддон, который сериализует нужные таблицы в JSON (библиотека LibDeflate + LibSerialize) и выводит в окно редактирования (EditBox) или сохраняет в SavedVariables с известной структурой для последующего парсинга внешним скриптом․


Глубокий архив: CASC и дата-майтинг (Data Mining)

Для доступа к всем файлам игры (модели, текстуры, звуки, Lua-скрипты интерфейса, БД DBC/DB2) используется формат контейнеров CASC (Content Addressable Storage Container)․

Инструменты

  • CASCExplorer (C# / GUI): Стандарт де-факто для просмотра и экспорта․
  • wow․tools (Веб-сайт): Онлайн-просмотр последних билдов, поиск по FileDataID, экспорт CSV/JSON для DB2 таблиц․
  • CascLib (C/C++): Библиотека для встраивания в свои приложения․
  • python-casc / pycasc: Python-обертки (часто устаревают, лучше вызывать CASCExplorer CLI)․

Что можно извлечь (DB2 таблицы)

  • ItemSparse․db2 — база всех предметов (ID, название, статы, иконка, класс/подкласс)․
  • Spell․db2 / SpellEffect․db2 — полная механика заклинаний․
  • Map․db2 / AreaTable․db2 — геометрия зон․
  • CreatureDisplayInfo․db2 — модели мобов․
  • Quest․db2 — квесты․

Автоматизация обновления (Build Watch)

Напишите скрипт, который:

  1. Проверяет https://wow․tools/api/export/ или CDN Blizzard (http://cdn․blizzard․com/․․․/versions) на предмет нового BuildConfig / CDNConfig․
  2. При изменении скачивает новый build․xxxx․xxxx;xxxx через CASCExplorer CLI․
  3. Экспортирует нужные DB2 в CSV/Parquet/JSON․
  4. Загружает в вашу БД (ClickHouse, PostgreSQL, SQLite) для аналитики․

Архитектура надежной системы сбора данных (Best Practices)

Если вы строите сервис (бот, аддон-сайт, анализатор аукциона), вынесите работу с архивами в отдельный микросервис («Data Ingestion Layer»)․

Рекомендуемый стек:

  • Очередь задач: Redis + Celery (Python) или BullMQ (Node․js) — для управления ретраями и rate limits․
  • Хранилище «сырых» ответов: S3 / MinIO / PostgreSQL (jsonb) — сохраняйте все ответы API (включая заголовки ETag/Last-Modified) для отладки и репарсинга․
  • Нормализация: ETL-процесс (dbt, SQLMesh или простые SQL-скрипты), превращающий JSON в плоские таблицы․
  • Идемпотентность: Ключи БД должны позволять безопасно перезаписывать данные (UPSERT по character_guid + snapshot_time)․
  • Мониторинг: Grafana/Prometheus, метрики: api_latency, rate_limit_remaining, errors_429_total, staleness_seconds․

Юридические и этические аспекты (ToS)

  • Blizzard API: Регулируется Developer Policies․ Запрещено: продажа данных, создание конкурирующих игровых серверов, обход лимитов, скрапинг сайтов (Armory) вместо API․
  • Warcraft Logs / Raider․IO: Имеют свои ToS․ Обычно требуют атрибуции (ссылку на источник) и запрещают полный зеркалинг БД․
  • CASC / Data Mining: Допустимо для фанатских проектов, аддонов, теории․ Публикация зашифрованных ассетов (модели, звуки) в открытом виде может нарушать авторские права․ Будьте осторожны с дата-майнингом незарелизенного контента (PTR/Alpha) — NDA может распространяться на дата-майнеров․
  • GDPR / 152-ФЗ: Если храните имена персонажей/BattleTag, это персональные данные․ Обеспечьте право на удаление․

Чек-лист перед запуском в продакшн

  1. [ ] Зарегистрировано приложение на develop․battle․net, настроены Redirect URIs․
  2. [ ] Реализован Token Manager с кэшированием и автообновлением за 5 мин до истечения․
  3. [ ] Во всех запросах стоит Battlenet-Namespace (dynamic/static) и Accept-Language․
  4. [ ] Используется параметр fields=․․․ для минимизации полезной нагрузки․
  5. [ ] Реализован Exponential Backoff на коды 429, 500, 503 с учетом заголовка Retry-After․
  6. [ ] Настроено кэширование статики (Redis/Memcached/Файлы) на 24ч+․
  7. [ ] Логируются все входящие/исходящие запросы (Request ID, Latency, Status Code) для аудита․
  8. [ ] Есть скрипт миграции БД на случай изменения схемы API (Blizzard иногда добавляет/удаляет поля)․

Работа с «архивом WoW» — это многослойная задача․ Для 90% задач (профили, аукцион, прогресс) достаточно грамотной работы с Официальным Game Data API․ Для аналитики боев и истории рынка подключайте Warcraft Logs и Raider․IO․ Для создания собственных баз предметов, визуализации моделей или оффлайн-инструментов — осваивайте CASC / wow․tools․

Главное правило: уважайте Rate Limits и кэшируйте агрессивно․ Blizzard и сторонние сервисы блокируют агрессивных парсеры без предупреждения․ Хорошо спроектированная архитектура с очередями и идемпотентностью сэкономит вам недели отладки в будущем․