किंवदंतियों के लीग लीग स्ट्रीम प्रारूप


12

पहचान

मैं एलओएल के लिए दर्शक प्रणाली के साथ-साथ अंत में धाराओं से डेटा खुरचने और विश्लेषण के लिए एक डेटासेट बनाने की उम्मीद कर रहा हूं। मैं समझता हूं कि पहले से ही कुछ अनौपचारिक एपीआई और तकनीकें हैं, लेकिन मैं वास्तव में विशिष्ट गेम ईवेंट (चैंपियन मारता, बुर्ज मारता हूं, आइटम 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 का उपयोग कर रहे हैं। मैं अभी उन्हें इस बात की परवाह किए बिना नहीं कर सकता कि मैं किस फाइल की शुरुआत करूं।

मेरे सवाल)

क्या किसी को पता है कि इन 'टोकन' को कैसे स्वरूपित किया जा सकता है या यदि किसी प्रकार का संपीड़न / एन्क्रिप्शन है तो मैं अनजान हूँ? मुझे संदेह है कि वे लाइव गेम के दौरान उपयोग किए जाने वाले ईथरनेट पैकेट के कुछ संकुचित या पैक किए गए रूप हैं जो केवल क्लाइंट को आंतरिक रूप से वापस खेले जाते हैं।

वैकल्पिक रूप से, क्या कोई अन्य तरीका सोच सकता है जिसके द्वारा वास्तविक गेम क्लाइंट को चलाए बिना इस डेटा को परिमार्जन किया जा सके? ध्यान रखें कि मैं एक साथ कई धाराओं के डेटा हड़पना चाहूंगा।


1
जिस तरह से मैंने इसके बारे में जाने के लिए सोचा था वह LOLReplay से जितनी संभव हो उतने रीप्ले फ़ाइलों को हथियाने के लिए था और बस उन लोगों को क्रंच करना था। मुझे लगता है कि, एक खुला संग्रह जहां लोग अपने खुद के गेम अपलोड कर सकते हैं, और मुझे लगता है कि नया दर्शक मोड रिप्ले क्लाइंट को पहले की तुलना में अधिक जानकारी हड़पने देता है।
रॉबर्ट एस।

अन्य एपीआई और तकनीकें क्या हैं? आपको क्या लगता है कि एन्क्रिप्शन क्या है? मुझे यह GetGameMetaData में मिला: "एन्क्रिप्शनकी": "" और "डिकोड किए गए एन्क्रिप्शन एन्क्रिप्शन": ""
नाथन गोइंग

विभिन्न LoL मंचों से इस सवाल पर उतरने वाले लोगों के लिए एक FYI के रूप में, "एडिट बाय", के तहत पोस्ट पर मेरा नाम देखकर और विषय के बारे में पूछने के लिए मुझे ईमेल करना ... मुझे LoL या इसके बारे में कुछ नहीं पता है इसकी धाराओं का प्रारूप। कृपया मुझे इसके बारे में ईमेल न करें।

जवाबों:


4

मैं एक ही चीज पर शोध कर रहा हूं और मुझे यह रेपो बेहद मददगार लगा। फ़ाइल decrypt.rb दोनों विखंडू और कीफ़्रेम को डिक्रिप्ट करती है।

संपादित करें: इस लाल धागे को भी देखें।


अति उत्कृष्ट। पहली कड़ी मेरे प्रश्न का सटीक उत्तर देती है। दूसरी कड़ी भी वास्तव में मददगार है। अनेक अनेक धन्यवाद!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.