पहचान
मैं एलओएल के लिए दर्शक प्रणाली के साथ-साथ अंत में धाराओं से डेटा खुरचने और विश्लेषण के लिए एक डेटासेट बनाने की उम्मीद कर रहा हूं। मैं समझता हूं कि पहले से ही कुछ अनौपचारिक एपीआई और तकनीकें हैं, लेकिन मैं वास्तव में विशिष्ट गेम ईवेंट (चैंपियन मारता, बुर्ज मारता हूं, आइटम puchases, जंगल भीड़ मारता है, विशेष घटनाओं के लिए चैंपियन सह-ऑर्ड, आदि) की तलाश कर रहा हूं।
मैंने अब तक क्या सोचा है
जब आप एक गेम (एनए में) देखना शुरू करते हैं, तो आपका क्लाइंट निम्न होस्ट से जुड़ता है:
spectator.na.lol.riotgames.com:8088
मुझे लगता है कि यह होस्ट अमेज़ॅन AWS या इसी तरह से समर्थित है। वैसे भी, अगली चीज़ जो होती है वह ग्राहक को स्पेक्टेट सर्वर के लिए एक संस्करण अनुरोध भेजता है:
GET / ऑब्जर्वर-मोड / रेस्ट / कंज्यूमर / वर्जन
यह जो भी वर्तमान दर्शक सर्वर संस्करण है, उसे लौटाता है। Ex: '1.80.54'
इसके बाद, ग्राहक खेल मेटाडाटा के लिए एक अनुरोध भेजता है:
GET / ऑब्जर्वर-मोड / रेस्ट / कंज्यूमर / getGameMetaData / NA1 / [gameid] / [कुछ रैंडम नॉन] / टोकन
यह खेल के बारे में मेटाडेटा देता है। इस डेटा का एक उदाहरण: http://pastebin.com/3N4qs0hx
क्लाइंट अब उन मापदंडों को जानता है जिनके द्वारा स्पेक्टेट सत्र प्रगति करना चाहिए। यह कॉल करके नवीनतम डेटा का पता लगाने की कोशिश करता है:
GET / ऑब्जर्वर-मोड / रेस्ट / कंज्यूमर / getLastChunkInfo / NA1 / [gameid] / 30000 / टोकन
इस डेटा का नमूना: http://pastebin.com/Cj7dEAr9
डेटा चंक्स की पहचान हो जाने के बाद, उनसे अनुरोध किया जाता है:
GET / ऑब्जर्वर-मोड / रेस्ट / कंज्यूमर / getGameDataChunk / NA1 / [gameid] / [token #] / token
टोकन डेटा का नमूना (बाइनरी को हेक्स में परिवर्तित किया गया): http: // pastebin.com / GyqPRP5J
कॉल के बीच खेल चक्र getLastChunkInfo और getGameDataChunk के रूप में डेटा फिर से खेलना धारा से उपलब्ध हो जाता है। एक कॉल भी है जो लगभग 5 चंक्स के बाद होती है जो निम्न में से पकड़ ली जाती है:
GET / ऑब्जर्वर-मोड / रेस्ट / कंज्यूमर / getKeyFrame / NA1 / [gameid] / [somechunkid] / टोकन
मेरा मानना है कि यह कॉल केवल रीप्ले स्टार्ट होने पर होता है और जब भी यूजर अलग समय के लिए चाहता है।
मुझे पता है कि खेल कुछ स्तर पर एन्क्रिप्शन का उपयोग करता है। मेरा मानना है कि यह कमांड लाइन पर निर्दिष्ट वास्तविक कुंजी के साथ ब्लोफिश ईसीबी है। मैंने सत्र की कुंजी का उपयोग करके इन टोकन को डिक्रिप्ट करने का प्रयास किया है, लेकिन वे अभी भी बहुत यादृच्छिक लगते हैं।
संपादित करें 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"); }
सब_7111120 की जांच के बाद मैंने एक कॉल की, जो अंततः एक बड़े समारोह में प्रवेश करती है। इस फ़ंक्शन में तार शामिल हैं:
- "गलत हेडर चेक"
- "अज्ञात संपीड़न विधि"
- "अमान्य विंडो आकार"
इन स्ट्रिंग्स की त्वरित Google खोज से पता चलता है: http://www.opensource.apple.com/source/zlib/zlib-22/zlib/inflate.c
मैं भी कॉल करने से पहले एक फ़ंक्शन कॉल में स्ट्रिंग संदर्भ "1.2.3" पाया है, कॉल करने के लिए फुलाया। विधि, साथ ही एक अन्य संदर्भ "इनफ्लो 1.2.3 कॉपीराइट 1995-2005 मार्क एडलर"। यह निश्चित रूप से लग रहा है कि वे टोकन के विघटन के लिए ज़ालिब संस्करण 1.2.3 का उपयोग कर रहे हैं। मैं अभी उन्हें इस बात की परवाह किए बिना नहीं कर सकता कि मैं किस फाइल की शुरुआत करूं।
मेरे सवाल)
क्या किसी को पता है कि इन 'टोकन' को कैसे स्वरूपित किया जा सकता है या यदि किसी प्रकार का संपीड़न / एन्क्रिप्शन है तो मैं अनजान हूँ? मुझे संदेह है कि वे लाइव गेम के दौरान उपयोग किए जाने वाले ईथरनेट पैकेट के कुछ संकुचित या पैक किए गए रूप हैं जो केवल क्लाइंट को आंतरिक रूप से वापस खेले जाते हैं।
वैकल्पिक रूप से, क्या कोई अन्य तरीका सोच सकता है जिसके द्वारा वास्तविक गेम क्लाइंट को चलाए बिना इस डेटा को परिमार्जन किया जा सके? ध्यान रखें कि मैं एक साथ कई धाराओं के डेटा हड़पना चाहूंगा।