League of Legends Spectatorストリーム形式


12

イントロ

最終的にストリームからデータをスクレイピングし、分析用のデータセットを構築することを期待して、LoLの観客システムをいじっていました。非公式のAPIとテクニックが既にいくつかあることは理解していますが、本当に特定のゲームイベント(チャンピオンキル、タレットキル、アイテムの購入、ジャングルモブキル、特定のイベントのチャンピオンの調整など)を探しています。

これまでにわかったこと

ゲームの観戦を開始すると(NAで)、クライアントは次のホストに接続します。

spectator.na.lol.riotgames.com:8088

このホストはAmazon AWSまたは同様のものによってサポートされていると思います。とにかく、次に起こることは、クライアントがバージョンリクエストをspectateサーバーに送信することです。

GET / observer-mode / rest / consumer / version

これは、現在の観客サーバーのバージョンが何であっても返します。例:「1.80.54」

次に、クライアントはゲームメタデータのリクエストを送信します。

GET / observer-mode / rest / consumer / getGameMetaData / NA1 / [gameid] / [some random nonce] / token

これは、ゲームに関するメタデータを返します。このデータの例:http : //pastebin.com/3N4qs0hx

これで、クライアントは、観戦セッションを進めるためのパラメーターを認識します。次を呼び出して、最新のデータチャンクを見つけようとします。

GET / observer-mode / rest / consumer / getLastChunkInfo / NA1 / [gameid] / 30000 / token

このデータのサンプル:http : //pastebin.com/Cj7dEAr9

データチャンクが識別されると、要求されます。

GET / observer-mode / rest / consumer / getGameDataChunk / NA1 / [gameid] / [token#] / token

トークンのデータのサンプル(バイナリを16進数に変換):http:// pastebin.com / GyqPRP5J

リプレイストリームからデータが利用可能になると、ゲームはgetLastChunkInfoとgetGameDataChunkの呼び出しを繰り返します。また、約5つのチャンクが次のものに取得された後に発生する呼び出しもあります。

GET / observer-mode / rest / consumer / getKeyFrame / NA1 / [gameid] / [somechunkid] / token

この呼び出しは、再生の開始時と、ユーザーが別の時間にシークするたびにのみ発生すると考えています。

私はゲームが何らかのレベルで暗号化を使用していることを知っています。コマンドラインで実際のキーが指定されたBlowfish ECBであると考えています。セッションのキーを使用してこれらのトークンを解読しようとしましたが、それでもかなりランダムに見えます。

編集3/23/2013

  • キーを含むコマンドライン引数を変更し、デバッガからゲームを再起動することで、トークンが暗号化されていない可能性が高いと判断しました(リプレイが正しく読み込まれました)。
  • トークンは圧縮されているようです。ゼロ以外の整数が返された場合、以下をトリガーするサブルーチンへの呼び出しがあります。

    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");
    }
  • sub_B71120の調査の結果、かなり大きな関数に入る呼び出しを見つけました。この関数には次のような文字列が含まれます。

    • 「誤ったヘッダーチェック」
    • 「不明な圧縮方法」
    • 「無効なウィンドウサイズ」
  • これらの文字列をGoogleですばやく検索すると、次のことがわかります。http//www.opensource.apple.com/source/zlib/zlib-22/zlib/inflate.c

  • また、inflate.cメソッドの呼び出しの直前に関数呼び出しで文字列参照「1.2.3」、および別の参照「inflate 1.2.3 Copyright 1995-2005 Mark Adler」を見つけました。トークンの解凍にZlibバージョン1.2.3を使用しているようです。開始するファイルオフセットに関係なく、それらを解凍することはできません。

私の質問

これらの「トークン」がどのようにフォーマットされるか、または私が知らない圧縮/暗号化のタイプがある場合、誰もが知っていますか?ライブプレイ中に使用されるイーサネットパケットの圧縮または圧縮された形式であり、クライアントに対して内部的に単純に再生されるのではないかと疑っています。

または、実際のゲームクライアントを実行せずにこのデータをスクレイピングする他の方法を考える人はいますか?多くのストリームから同時にデータを取得したいことを覚えておいてください。


1
私が考えたのは、LOLReplayからできるだけ多くのリプレイファイルを取得し、それらをクランチすることでした。人々が自分のゲームをアップロードできるオープンアーカイブがあり、新しい観客モードにより、リプレイクライアントは以前よりも多くの情報を取得できると思います。
ロバートS.

他にどんなAPIとテクニックがありますか?なぜ暗号化があると思いますか?GetGameMetaDataでこれを見つけました: "encryptionKey": ""および "decodedEncryptionKey": ""
ネイサンゴーイングス

さまざまなLoLフォーラムからこの質問を聞き続ける人々のFYIとして、「edited by」の下の投稿で私の名前を見て、トピックについて質問するために私に電子メールを送ります... LoLまたはストリームの形式。それについて私にメールしないでください。

回答:


4

私は同じことを研究してきましたが、このレポは非常に役立つことがわかりました。ファイルdecrypt.rbは、チャンクとキーフレームの両方を復号化します。

編集:チェックアウト このredditスレッドも。


優秀な。最初のリンクは私の質問に正確に答えます。2番目のリンクも非常に役立ちます。トンありがとう!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.