介绍
我一直在摆弄LoL的旁观者系统,希望最终从流中抓取数据并建立一个数据集进行分析。我知道已经有一些非官方的API和技术,但是我正在寻找真正特定的游戏事件(冠军杀死,炮塔杀死,物品讨价还价,丛林暴民杀死,特定事件的冠军配合等等)。
到目前为止我已经弄清楚了
当您开始观看游戏时(不适用),您的客户端将连接到以下主机:
spectator.na.lol.riotgames.com:8088
我假设此主机由Amazon AWS或类似机构支持。无论如何,接下来发生的事情是客户端向版本服务器发送版本请求:
GET / observer-mode / rest / consumer / version
这将返回当前观众服务器的版本。例如:“ 1.80.54”
接下来,客户端发送对游戏元数据的请求:
GET / observer-mode / rest / consumer / getGameMetaData / NA1 / [gameid] / [一些随机随机数] /令牌
这将返回有关游戏的元数据。此数据的示例: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
令牌数据样本(二进制转换为十六进制):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版对令牌进行解压缩。无论我从哪个文件偏移开始,我都无法让它们解压缩。
我的问题
有谁知道这些“令牌”的格式,或者我是否不知道某种压缩/加密类型?我怀疑它们是现场播放期间使用的某些压缩或打包形式的以太网数据包,这些数据包只是在客户端内部播放。
或者,任何人都可以想到无需运行实际游戏客户端即可通过其他方法抓取这些数据的方法吗?请记住,我想同时从许多流中获取数据。