एक aspx साइट पार्स करने की कहानी

प्रागितिहास



ग्राहक अनुरोधों के साथ काम करने के लिए एक ऑनलाइन प्रणाली है जिसके साथ मेरे युवा को काम करना है। सिस्टम संभवतः कार्यात्मक है, प्रशासकों के लिए अच्छा है, प्रबंधन और अन्य में कुशल है, लेकिन दैनिक उपयोग में यह कितना असुविधाजनक है!

  1. यह लॉगिन, पासवर्ड और शहर को याद नहीं करता है - नतीजतन, प्रवेश करने के बाद, आपको डिफ़ॉल्ट शहर से डाउनलोड किए जाने वाले सभी अनुप्रयोगों के लिए इंतजार करना होगा, और फिर अपने स्वयं के लिए स्विच करना होगा।
  2. आवेदनों की सामान्य सूची से सभी आवश्यक जानकारी उपलब्ध नहीं है। इसके भाग के लिए, आपको एप्लिकेशन के अंदर देखना होगा, और उनमें से प्रत्येक एक नई विंडो में खुलता है (एक जावास्क्रिप्ट है और एक सामान्य href विशेषता भी नहीं है, कल्पना करें?)।
  3. यह आकर्षण एस्प पर बनाया गया था, और इसलिए, प्रत्येक संक्रमण के साथ, नेटवर्क पर अपने दृष्टिकोण को चलाता है।
  4. खैर, कुछ हजार बिंदुओं के साथ डेढ़ में साइट की न्यूनतम चौड़ाई खुशी नहीं देती है।


काम की बारीकियां कभी-कभी आपको मोबाइल फोन और मोबाइल इंटरनेट से सिस्टम में लॉग इन करती हैं।

और अगर मैंने खुद उसके साथ काम किया, तो कुछ भी नहीं हुआ - मुझे इसकी आदत हो गई होगी, अनुकूलित, और वास्तव में, बॉस उत्सुक हैं ... लेकिन मुझे प्रियजन के लिए खेद है, और एक आवेदन पार्सर लिखने के लिए विचार आया।



कहानी



मैं वास्तव में एक टाइप्टर हूं। और एक वेब डेवलपर, लेकिन इस दिशा में कौशल इतना अधिक नहीं है, मैं सिर्फ वर्डप्रेस पर सभ्य वेबसाइट बनाता हूं। कठोर कर्ल अनुरोधों के सभी प्रकार के साथ, जिनका मैंने पहले सामना नहीं किया है। और aspx साइटों के साथ भी।

लेकिन यह दिलचस्प है!

(यह php के साथ रातों की एक महीने में हुई और कुछ रातों की नींद हराम कर दिया। और बहुत मज़ा, निश्चित रूप से)



पहले तो जावास्क्रिप्ट का उपयोग करके क्रॉस-डोमेन प्रश्नों पर प्रयास किया गया था, लेकिन इसका कुछ भी नहीं आया।

फिर, डरपोक खुदाई एक तरफ प्रेत और उपयोगकर्ता व्यवहार के अन्य अनुकरण। लेकिन यह पता चला कि मुझे अभी भी js कौशल की कमी है।

नतीजतन, सब कुछ पीएचपी पृष्ठ से आने वाले कर्ल अनुरोधों पर काम करता है।



जानकारी प्राप्त करना


प्राधिकरण काफी जल्दी था, और समस्याओं के बिना कम या ज्यादा अर्जित किया।

सबसे खराब समस्या गलत पासवर्ड प्रविष्टियों की संख्या पर प्रतिबंध थी: दो बार - और व्यवस्थापक को कॉल करें, पहुंच बहाल करें ...



लेकिन वांछित शहर में संक्रमण के साथ हठ विफल रहा। संक्रमण हुआ था, लेकिन कहीं गलत दिशा में, हालांकि सभी नियमों के अनुसार POST अनुरोध किया गया था।

यह पता चला कि प्रीग_मैच बहुत बड़ी संख्या में पात्रों के साथ सही ढंग से काम नहीं करता है।

निर्देशन आपको इससे बचाता है



ini_set("pcre.backtrack_limit", 10000000);
      
      





सबसे पहले, हम पृष्ठ की प्रारंभिक स्थिति प्राप्त करते हैं (क्योंकि हम अभी तक लॉगिन नहीं हुए हैं, हम लॉगिन पृष्ठ पर आते हैं), और वहां से व्यूस्टेट को चीर कर बाहर निकलते हैं:



  $url = 'http://***/Default.aspx'; $content = curlFunction($url); preg_match_all("/id=\"__VIEWSTATE\" value=\"(.*?)\"/", $content, $arr_viewstate); $viewstate = urlencode($arr_viewstate[1][0]);
      
      





अब, पहले से ही हाथ पर पृष्ठ की स्थिति का वास्तविक कलाकार होने पर, उपयोगकर्ता नाम और पासवर्ड दर्ज करें।

(पोस्टडेटा पृष्ठ के अनुरोध का POST पैरामीटर है, आप उसी फायरबग में झांक सकते हैं)।



  $url = 'http://***/Default.aspx?ReturnUrl=%2fHome%2fRoutes.aspx'; $postdataArr = array( '__LASTFOCUS=', '__EVENTTARGET=', '__EVENTARGUMENT=', '__VIEWSTATE='.$viewstate, 'ctl00$cphMainContent$loginBox$loginBox$UserName='.$login, 'ctl00$cphMainContent$loginBox$loginBox$Password='.$password, 'ctl00$cphMainContent$loginBox$loginBox$LoginButton=', ); $postdata = implode('&',$postdataArr); $content = curlFunction($url, $postdata); preg_match_all("/id=\"__VIEWSTATE\" value=\"(.*?)\"/iu", $content, $arr_viewstate); $viewstate = urlencode($arr_viewstate[1][0]);
      
      





इस तथ्य के कारण कि प्रारंभिक लिंक एक रीडायरेक्ट के साथ जारी किया गया है, और कर्ल की एक सेटिंग है



 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //   
      
      





हमें वह पृष्ठ मिलता है जिसके परिणामस्वरूप हमें वह पृष्ठ मिलता है जिसकी हमें आवश्यकता होती है।



यह इस बिंदु पर था कि एक समस्या एक अक्षम preg_replace के साथ उत्पन्न हुई, लेकिन एक समाधान - हैबर के लिए धन्यवाद - पाया गया।

वहाँ है! अब आप वांछित शहर के लिए अनुप्रयोगों पर स्विच कर सकते हैं और पार्सिंग कर सकते हैं।



  $url = 'http://***/Home/Routes.aspx'; $postdataArr = array( '__EVENTTARGET=ctl00$cphMainContent$ddlCityID', '__EVENTARGUMENT=', '__LASTFOCUS=', '__VIEWSTATE='.$viewstate, 'ctl00$cphMainContent$ddlCityID='.$city, 'ctl00$cphMainContent$tbConnectionDate='.$date, ); $postdata = implode('&',$postdataArr); $content = curlFunction($url, $postdata);
      
      





जब आप अंततः समझते हैं कि आप क्या कर रहे हैं, सब कुछ काफी सरल है: आपको उस लिंक पर क्लिक करने की आवश्यकता है जिसे आपने अंतिम चरण में व्यूस्टेट प्राप्त किया था।



सूचना प्रसंस्करण


मिल गया, पार्स करना शुरू करें।

पहला अनुभव नियमित अभिव्यक्ति के साथ था। दुर्भाग्य से, होस्टिंग पर php ने किसी भी तरह से बहु-रेखा अभिव्यक्तियों के साथ बहुत अजीब तरीके से काम किया, और पूरी तरह से (सभी विकल्प के साथ) का चयन नहीं किया, फिर चाहे मैंने इसे कैसे मनाने की कोशिश की (सब कुछ LAN पर काम किया)।



अगला कदम सिंपल एचटीएमएल डोम लाइब्रेरी था। सब कुछ ठीक है, हमने इसे प्राप्त किया, लिंक पर क्लिक करें और जानकारी को पार्स करें ... एक पृष्ठ प्राप्त करने में 0.9 सेकंड लगते हैं, पेज पर पांच इनपुटों से समान डेटा प्राप्त करने में 5 सेकंड लगते हैं। जब आपको नौ ऐसे लिंक पर जाने की आवश्यकता होती है, तो सब कुछ बहुत दुखी हो जाता है।



Google, हमें लगता है, हम पढ़ते हैं। हम नोकगिरी पाते हैं। तुम्हें पता है, आसान और सार्थक! वास्तव में तेजी से और सुखद बात के साथ काम करने के लिए:



  $html = new nokogiri($content); //  input' $RepairNumber = $html->get('#ctl00_cphMainContent_tbRepairNumber')->toArray(); $result['RepairNumber'] = $RepairNumber[0]['value']; //  select' $ConnectionTimeArr = $html->get('#ctl00_cphMainContent_ddlConnectionTime')->toArray(); foreach($ConnectionTimeArr as $e) { foreach($e['option'] as $el) { if(isset($el['selected'])) { $result['ConnectionTime'] = $el['#text'][0]; } } }
      
      







सौंदर्य और डिजाइन


अचानक एक बहुत ही अजीब समस्या दिखाई दी: ग्राहक, स्पष्ट असंतोष के साथ, सीएसएस, जेएस और अन्य घंटियाँ और सीटी के बिना डेवलपर संस्करण का उपयोग किया। अधिक सटीक रूप से, उन्हें समझ नहीं आया कि इसका उपयोग कैसे किया जाए



हम XHR अनुरोधों के बारे में जानकारी की तलाश कर रहे हैं।



 // ,   POST- var login = $('#login').val(); var password = $('#password').val(); var val = $('#datePicker').val(); //  var params = 'login=' + encodeURIComponent(login) + '&password=' + encodeURIComponent(password) + '&date=' + encodeURIComponent(date) + '&firstlogin=true'; //       ,  ,   ,    var req = getXmlHttp() req.open('POST', 'script.php', true) req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') req.send(params); //  -    ! $('.dark').fadeIn(); req.onreadystatechange = function() { if (req.readyState == 4) { if(req.status == 200) { // ,     $('.dark').fadeOut(); $('#worker').html(req.responseText); } } }
      
      







लाभ! उपयोगकर्ता आनन्दित होता है, उपयोगकर्ता के मोबाइल फोन को मोबाइल इंटरनेट पर कई टन व्यूस्टेट्स से आगे निकलने की आवश्यकता से छुटकारा मिलता है, और हाथ से लिखे पृष्ठ के डिजाइन का प्रबंधन करना किसी भी तरह सरल होता है।



PS बस उन्होंने मुझसे पूछा कि क्या इस क्लाइंट की मदद से एप्लिकेशन के साथ कार्य प्रणाली में डेटा को बदलना संभव है। ऐसा लगा कि खतरा ...



All Articles