英雄联盟观众流格式


12

介绍

我一直在摆弄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版对令牌进行解压缩。无论我从哪个文件偏移开始,我都无法让它们解压缩。

我的问题

有谁知道这些“令牌”的格式,或者我是否不知道某种压缩/加密类型?我怀疑它们是现场播放期间使用的某些压缩或打包形式的以太网数据包,这些数据包只是在客户端内部播放。

或者,任何人都可以想到无需运行实际游戏客户端即可通过其他方法抓取这些数据的方法吗?请记住,我想同时从许多流中获取数据。


1
我认为解决该问题的方法是从LOLReplay抓取尽可能多的重放文件,然后处理这些文件。我认为,这里有一个开放的档案库,人们可以上传自己的游戏,而且我认为新的旁观者模式使Replay客户端可以比以前获取更多信息。
罗伯特S.13年

还有哪些其他API和技术?您为什么认为存在加密?我在GetGameMetaData中找到了它:“ encryptionKey”:“”和“ decodedEncryptionKey”:“”
Nathan

作为供各种LoL论坛上继续关注此问题的人们的FYI,在帖子的“编辑者”下看到我的名字,并通过电子邮件向我询问有关该主题的信息...我对LoL或流的格式。请不要给我发电子邮件。

Answers:


4

我一直在研究相同的东西,我发现此仓库非常有用。文件crypto.rb解密块和关键帧。

编辑:也检查这个reddit线程


优秀的。第一个链接正好回答了我的问题。第二个链接也确实有帮助。万分感谢!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.