イントロ
最終的にストリームからデータをスクレイピングし、分析用のデータセットを構築することを期待して、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を使用しているようです。開始するファイルオフセットに関係なく、それらを解凍することはできません。
私の質問
これらの「トークン」がどのようにフォーマットされるか、または私が知らない圧縮/暗号化のタイプがある場合、誰もが知っていますか?ライブプレイ中に使用されるイーサネットパケットの圧縮または圧縮された形式であり、クライアントに対して内部的に単純に再生されるのではないかと疑っています。
または、実際のゲームクライアントを実行せずにこのデータをスクレイピングする他の方法を考える人はいますか?多くのストリームから同時にデータを取得したいことを覚えておいてください。