Intro
Ich habe mit dem Zuschauersystem für LoL herumgespielt, in der Hoffnung, irgendwann Daten aus den Streams zu kratzen und daraus einen Datensatz für die Analyse zu erstellen. Ich verstehe, dass es bereits einige inoffizielle APIs und Techniken gibt, aber ich suche nach wirklich spezifischen Spielereignissen (Championkills, Revolverkills, Gegenstandskäufe, Dschungelmobkills, Championkoordinaten für bestimmte Ereignisse usw.).
Was ich bisher herausgefunden habe
Wenn Sie mit dem Zuschauen eines Spiels beginnen (in NA), stellt Ihr Client eine Verbindung mit dem folgenden Host her:
spectator.na.lol.riotgames.com:8088
Ich gehe davon aus, dass dieser Host von Amazon AWS oder ähnlichem unterstützt wird. Als Nächstes sendet der Client eine Versionsanforderung an den Spectate-Server:
GET / Beobachter-Modus / Ruhe / Verbraucher / Version
Dies gibt die aktuelle Version des Zuschauerservers zurück. Beispiel: "1.80.54"
Als Nächstes sendet der Client eine Anforderung für die Spielmetadaten:
GET / observer-mode / rest / consumer / getGameMetaData / NA1 / [gameid] / [etwas zufälliges nonce] / token
Dies gibt Metadaten über das Spiel zurück. Ein Beispiel für diese Daten: http://pastebin.com/3N4qs0hx
Der Client kennt jetzt die Parameter, mit denen die Zuschauersitzung fortschreiten soll. Es wird versucht, den neuesten Datenblock zu finden, indem Folgendes aufgerufen wird:
GET / observer-mode / rest / consumer / getLastChunkInfo / NA1 / [gameid] / 30000 / token
Beispiel dieser Daten: http://pastebin.com/Cj7dEAr9
Sobald die Datenblöcke identifiziert wurden, werden sie angefordert:
GET / observer-mode / rest / consumer / getGameDataChunk / NA1 / [gameid] / [token #] / token
Beispiel für die Daten eines Tokens (binär in hexadezimal konvertiert): http: // pastebin.com / GyqPRP5J
Das Spiel wechselt zwischen dem Aufrufen von getLastChunkInfo und getGameDataChunk, wenn Daten aus dem Wiedergabestream verfügbar werden. Es gibt auch einen Aufruf, der erfolgt, nachdem ungefähr 5 Chunks wie folgt abgegriffen wurden:
GET / observer-mode / rest / consumer / getKeyFrame / NA1 / [gameid] / [somechunkid] / token
Ich glaube, dieser Aufruf erfolgt nur beim Start der Wiedergabe und immer dann, wenn der Benutzer nach einer anderen Zeit sucht.
Ich weiß, dass das Spiel auf einer bestimmten Ebene Verschlüsselung verwendet. Ich glaube, es ist Blowfish ECB, mit dem eigentlichen Schlüssel in der Befehlszeile angegeben. Ich habe versucht, diese Token mit dem Sitzungsschlüssel zu entschlüsseln, aber sie sehen immer noch ziemlich zufällig aus.
Bearbeiten 23.03.2013
- Ich habe festgestellt, dass die Token höchstwahrscheinlich nicht verschlüsselt sind, indem ich das Befehlszeilenargument, das den Schlüssel enthält, geändert und das Spiel vom Debugger aus neu gestartet habe (die Wiedergabe wurde korrekt geladen).
Die Token scheinen komprimiert zu sein. Es wird eine Unterroutine aufgerufen, die bei Rückgabe einer Ganzzahl ungleich Null Folgendes auslöst:
if ( sub_B71120(v21, v15, (int *)&Size, *(_DWORD *)(v6 + 108)) ) { sub_BAD700( (int)"!\"Error Decompressing data chunk.\"", (int)"D:\\jenkins\\workspace\\Code-CI-Releases-Public\\code\\HeroWars_clientServer\\Sources\\ReplaySystem\\ReplayServerConnection.cpp", 6, (int)"Riot::Replay::ReplayServerConnection::GetChunk", (int)"Assert occurred, game may crash."); sub_9BB750("ReplayServerConnection GetChunk error. Error decompressing chunk data. Error: %d\n"); }
Bei der Untersuchung von sub_B71120 habe ich einen Aufruf gefunden, der schließlich eine ziemlich große Funktion eingibt. Diese Funktion enthält Zeichenfolgen wie:
- "falsche Headerprüfung"
- "unbekannte Komprimierungsmethode"
- "ungültige Fenstergröße"
Bei einer schnellen Google-Suche nach diesen Zeichenfolgen wird Folgendes angezeigt : http://www.opensource.apple.com/source/zlib/zlib-22/zlib/inflate.c
Ich habe auch die Zeichenfolgenreferenz "1.2.3" in einem Funktionsaufruf direkt vor dem Aufruf der inflate.c-Methode sowie eine andere Referenz "inflate 1.2.3 Copyright 1995-2005 Mark Adler" gefunden. Es sieht definitiv so aus, als würden sie Zlib Version 1.2.3 für die Dekomprimierung der Token verwenden. Ich kann sie einfach nicht zum Dekomprimieren bringen, unabhängig davon, bei welchem Dateiversatz ich beginne.
Meine Fragen)
Weiß jemand, wie diese "Token" formatiert werden könnten oder ob es eine Art von Komprimierung / Verschlüsselung gibt, die mir unbekannt ist? Ich habe den Verdacht, dass es sich um eine komprimierte oder gepackte Form der während des Live-Spiels verwendeten Ethernet-Pakete handelt, die einfach intern für den Client wiedergegeben werden.
Kann sich jemand eine andere Methode vorstellen, mit der diese Daten gescrappt werden können, ohne den eigentlichen Spieleclient auszuführen? Denken Sie daran, ich möchte Daten aus vielen Streams gleichzeitig abrufen.