Под «архивом 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 (старый формат) устарели и не работают․
- Регистрация приложения: Зайдите на Blizzard Developer Portal, создайте приложение (Client ID / Client Secret)․ Укажите Redirect URI (например,
http://localhost/callbackдля тестов)․ - Получение 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)
Напишите скрипт, который:
- Проверяет
https://wow․tools/api/export/или CDN Blizzard (http://cdn․blizzard․com/․․․/versions) на предмет новогоBuildConfig/CDNConfig․ - При изменении скачивает новый
build․xxxx․xxxx;xxxxчерез CASCExplorer CLI․ - Экспортирует нужные DB2 в CSV/Parquet/JSON․
- Загружает в вашу БД (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, это персональные данные․ Обеспечьте право на удаление․
Чек-лист перед запуском в продакшн
- [ ] Зарегистрировано приложение на
develop․battle․net, настроены Redirect URIs․ - [ ] Реализован Token Manager с кэшированием и автообновлением за 5 мин до истечения․
- [ ] Во всех запросах стоит
Battlenet-Namespace(dynamic/static) иAccept-Language․ - [ ] Используется параметр
fields=․․․для минимизации полезной нагрузки․ - [ ] Реализован Exponential Backoff на коды
429,500,503с учетом заголовкаRetry-After․ - [ ] Настроено кэширование статики (Redis/Memcached/Файлы) на 24ч+․
- [ ] Логируются все входящие/исходящие запросы (Request ID, Latency, Status Code) для аудита․
- [ ] Есть скрипт миграции БД на случай изменения схемы API (Blizzard иногда добавляет/удаляет поля)․
Работа с «архивом WoW» — это многослойная задача․ Для 90% задач (профили, аукцион, прогресс) достаточно грамотной работы с Официальным Game Data API․ Для аналитики боев и истории рынка подключайте Warcraft Logs и Raider․IO․ Для создания собственных баз предметов, визуализации моделей или оффлайн-инструментов — осваивайте CASC / wow․tools․
Главное правило: уважайте Rate Limits и кэшируйте агрессивно․ Blizzard и сторонние сервисы блокируют агрессивных парсеры без предупреждения․ Хорошо спроектированная архитектура с очередями и идемпотентностью сэкономит вам недели отладки в будущем․