리그 오브 레전드 관중 스트림 형식


12

소개

결국 스트림에서 데이터를 스크랩하고 분석을 위해 데이터 세트를 구축하기 위해 LoL 관중 시스템을 둘러보고 있습니다. 나는 이미 비공식 API와 기술이 있음을 이해하지만 실제로 특정 게임 이벤트 (챔피언 킬, 터렛 킬, 아이템 구매, 정글 몹 킬, 특정 이벤트의 챔피언 코디 등)를 찾고 있습니다.

내가 지금까지 알아 낸 것

게임 관중을 시작하면 (NA에서) 클라이언트가 다음 호스트에 연결합니다.

spectator.na.lol.riotgames.com:8088

이 호스트는 Amazon AWS 또는 이와 유사한 것으로 지원됩니다. 어쨌든, 다음에 일어날 일은 클라이언트가 버전 요청을 관중 서버에 보낸다는 것입니다.

GET / 관찰자 모드 / 휴식 / 소비자 / 버전

현재 관중 서버 버전이 무엇이든 반환합니다. 예 : '1.80.54'

다음으로 클라이언트는 게임 메타 데이터에 대한 요청을 보냅니다.

GET / 관찰자 모드 / 휴식 / 소비자 / getGameMetaData / NA1 / [gameid] / [일부 랜덤 논스] / 토큰

게임에 대한 메타 데이터를 반환합니다. 이 데이터의 예 : http://pastebin.com/3N4qs0hx

클라이언트는 이제 spectate 세션이 진행될 매개 변수를 알고 있습니다. 다음을 호출하여 최신 데이터 청크를 찾습니다.

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

이 데이터의 샘플 : http://pastebin.com/Cj7dEAr9

데이터 청크가 식별되면 다음을 요청합니다.

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

토큰 데이터 샘플 (이진수는 16 진수로 변환 됨) : http : // pastebin.com / GyqPRP5J

재생 스트림에서 데이터를 사용할 수있게되면 게임에서 getLastChunkInfo와 getGameDataChunk를 호출하는주기가 반복됩니다. 약 5 개의 청크가 다음에 잡힌 후에도 호출이 발생합니다.

GET / 관찰자 모드 / 휴식 / 소비자 / getKeyFrame / NA1 / [gameid] / [somechunkid] / 토큰

이 호출은 재생 시작시와 사용자가 다른 시간을 원할 때마다 발생한다고 생각합니다.

게임이 암호화를 어느 정도 사용한다는 것을 알고 있습니다. 명령 행에 실제 키가 지정된 Blowfish ECB라고 생각합니다. 세션 키를 사용하여 이러한 토큰을 해독하려고 시도했지만 여전히 무작위로 보입니다.

2013 년 3 월 23 일 수정

  • 키가 포함 된 명령 줄 인수를 수정하고 디버거에서 게임을 다시 시작하여 토큰이 암호화되지 않았을 가능성이 가장 높은 것으로 확인되었습니다 (리플레이가 올바르게로드 됨).
  • 토큰이 압축 된 것 같습니다. 0이 아닌 정수를 리턴하면 다음을 트리거하는 서브 루틴에 대한 호출이 있습니다.

    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 클라이언트가 이전보다 더 많은 정보를 얻을 수 있다고 생각합니다.
Robert S.

어떤 다른 API와 기술이 있습니까? 암호화가 있다고 생각하는 이유는 무엇입니까? GetGameMetaData에서 이것을 발견했습니다 : "encryptionKey": ""및 "decodedEncryptionKey": ""
Nathan Goings

다양한 LoL 포럼에서이 질문에 계속 방문하는 사람들을위한 참고 자료로, "편집자"아래의 게시물에서 내 이름을보고 주제에 대해 물어 보도록 이메일을 보냅니다 ... LoL 또는 스트림 형식. 이메일을 보내지 마십시오.

답변:


4

나는 똑같은 것을 연구 해 왔으며이 레포 가 매우 도움 된다는 것을 알았습니다 . decrypt.rb 파일은 청크와 키 프레임을 모두 해독합니다.

편집 : 이 레딧 스레드 도 확인하십시오 .


우수한. 첫 번째 링크는 내 질문에 정확하게 답변합니다. 두 번째 링크도 도움이됩니다. 엄청 고마워!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.