League of Legends Zuschauer-Stream-Format


12

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.


1
Die Art und Weise, wie ich darüber nachdachte, bestand darin, so viele Wiedergabedateien wie möglich von LOLReplay abzurufen und diese nur zu zerkleinern. Ich denke, es gibt ein offenes Archiv, in das die Leute ihre eigenen Spiele hochladen können, und ich denke, der neue Zuschauermodus ermöglicht es dem Replay-Client, mehr Informationen zu erhalten als zuvor.
Robert S.

Welche anderen APIs und Techniken gibt es? Warum gibt es Ihrer Meinung nach Verschlüsselung? Ich fand dies in den GetGameMetaData: "encryptionKey": "" und "decodedEncryptionKey": ""
Nathan Goings

Als Information für die Leute, die in verschiedenen LoL-Foren auf diese Frage stoßen, meinen Namen auf dem Post unter "Bearbeitet von" sehen und mich per E-Mail nach dem Thema fragen ... Ich weiß nichts über LoL oder das Format seiner Streams. Bitte schicken Sie mir keine E-Mail.

Antworten:


4

Ich habe dasselbe recherchiert und dieses Repo gefunden äußerst hilfreich. Die Datei decrypt.rb entschlüsselt sowohl Chunks als auch Keyframes.

Bearbeiten: Schauen Sie sich auch diesen reddit-Thread an .


Ausgezeichnet. Der erste Link beantwortet meine Frage genau. Der zweite Link ist auch sehr hilfreich. Danke vielmals!
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.