소개
결국 스트림에서 데이터를 스크랩하고 분석을 위해 데이터 세트를 구축하기 위해 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을 사용하는 것 같습니다. 내가 시작한 파일 오프셋에 관계없이 압축을 풀 수 없습니다.
내 질문
누구든지 이러한 '토큰'이 어떻게 형식화되는지 또는 내가 모르는 압축 / 암호화 유형이 있는지 알고 있습니까? 라이브 재생 중에 사용되는 압축되거나 압축 된 형태의 이더넷 패킷으로 클라이언트 내부에서 간단하게 재생된다는 의혹이 있습니다.
또는 실제 게임 클라이언트를 실행하지 않고이 데이터를 긁어내는 다른 방법을 생각할 수 있습니까? 많은 스트림에서 동시에 데이터를 가져오고 싶습니다.