2009-06-10 12 views
22

मुझे ऐसी वेबसाइट से कुछ जानकारी चाहिए जो मेरा नहीं है, इस जानकारी को प्राप्त करने के लिए मुझे जानकारी एकत्र करने के लिए वेबसाइट पर लॉगिन करने की आवश्यकता है, यह एक HTML फॉर्म के माध्यम से होता है। मैं सी # में यह प्रमाणीकृत स्क्रीनस्केपिंग कैसे कर सकता हूं?स्क्रीनस्केप के लिए वेबसाइट पर प्रोग्रामेटिक रूप से लॉग इन कैसे करें?

अतिरिक्त जानकारी:

  • कुकी आधारित प्रमाणीकरण।
  • POST कार्रवाई की आवश्यकता है।

उत्तर

22

आप अनुरोध करेंगे कि आप फ़ॉर्म भर चुके हैं। उदाहरण के लिए इसे पोस्ट मानते हुए, आप सही डेटा के साथ एक POST अनुरोध करते हैं। अब यदि आप सीधे उसी पृष्ठ पर लॉगिन नहीं कर सकते हैं जिसे आप स्क्रैप करना चाहते हैं, तो आपको अपने लॉगिन अनुरोध के बाद जो भी कुकी सेट करनी है, उसे ट्रैक करना होगा, और उन्हें अपने स्क्रैपिंग अनुरोध में शामिल करना होगा ताकि आप लॉग इन रह सकें।

ऐसा लगता है:

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest; 
http.KeepAlive = true; 
http.Method = "POST"; 
http.ContentType = "application/x-www-form-urlencoded"; 
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword; 
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
http.ContentLength = dataBytes.Length; 
using (Stream postStream = http.GetRequestStream()) 
{ 
    postStream.Write(dataBytes, 0, dataBytes.Length); 
} 
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 
// Probably want to inspect the http.Headers here first 
http = WebRequest.Create(url2) as HttpWebRequest; 
http.CookieContainer = new CookieContainer(); 
http.CookieContainer.Add(httpResponse.Cookies); 
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 

शायद।

+0

धन्यवाद, यह कुछ मैं इस्तेमाल कर सकते हैं, मैं इस सवाल का जवाब स्वीकार करेंगे अगर यह काम करता है जब मैं वापस प्रोग्रामिंग करने के लिए मिल की तरह दिखता है। :-) –

+0

यह काम करता है यदि वेब पेज सादा HTML में है, लेकिन यदि फॉर्म जावास्क्रिप्ट के माध्यम से गतिशील रूप से जेनरेट किया गया है .... क्या यह काम करेगा? – Souper

+0

@ सॉपर शायद नहीं; आप यह जांचना चाहते हैं कि साइन-इन से जिस पृष्ठ पर आप स्क्रैप करना चाहते हैं, उसके अनुरोध क्या होंगे और फिर उन व्यवहारों का निर्माण करें जो उस व्यवहार की नकल करते हैं। – dlamblin

0

आपको HTTPWebRequest का उपयोग करने और पोस्ट करने की आवश्यकता है। इस लिंक को शुरू करने में आपकी मदद करनी चाहिए। कुंजी यह है कि, आपको उस पृष्ठ के HTML फॉर्म को देखने की आवश्यकता है जिसे आप पोस्ट सबमिट करने के लिए फ़ॉर्म के सभी पैरामीटर देखने के लिए पोस्ट करने का प्रयास कर रहे हैं।

http://www.netomatix.com/httppostdata.aspx

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

+0

यूप, सबसे कठिन हिस्सा जो मैं उल्लेख करना भूल गया था (क्योंकि यह ज्यादातर बार उपयोग किया जाता है) कुकी को अगले पृष्ठ के लिए मेरे साथ रखना है। –

5

आप एक WebBrowser नियंत्रण का उपयोग कर सकते हैं। बस इसे साइट के यूआरएल को खिलाएं, फिर उपयोगकर्ता नाम और पासवर्ड को सही फ़ील्ड में सेट करने के लिए डीओएम का उपयोग करें, और अंत में सबमिट बटन पर एक क्लिक भेजें। इस तरह आप दो इनपुट फ़ील्ड और सबमिट बटन के अलावा कुछ भी परवाह नहीं करते हैं। कोई कुकी हैंडलिंग नहीं, कोई कच्चा HTML पार्सिंग नहीं, कोई HTTP स्नीफिंग नहीं - ब्राउज़र नियंत्रण द्वारा किया जाता है।

आपको लगता है कि जिस तरह से जाना है, तो कुछ और सुझाव:

  1. आप लोड हो रहा है ऐड-इन्स जैसे फ़्लैश से नियंत्रण रोका जा सकता है - आप कुछ समय बचा सकता है।
  2. एक बार लॉगिन करने के बाद, आप डोम से जो भी जानकारी चाहते हैं उसे प्राप्त कर सकते हैं - कच्चे HTML को पार्स करने की आवश्यकता नहीं है।
  3. यदि आप भविष्य में साइट में बदलाव के मामले में टूल को और भी पोर्टेबल बनाना चाहते हैं, तो आप जावास्क्रिप्ट के इंजेक्शन के साथ अपने स्पष्ट डोम मैनिपुलेशन को प्रतिस्थापित कर सकते हैं। जेएस को बाहरी संसाधन से प्राप्त किया जा सकता है, और एक बार इसे कहा जाता है कि यह क्षेत्र आबादी और जमा कर सकता है।
+0

समस्या यह है कि मैं आवेदन के इस हिस्से में एक जीयूआई फॉर्म नहीं बना सकता। –

+0

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

+0

@eran +1। आपका समाधान और अधिक पूरा दिखता है। – Souper

0

एक अतिरिक्त के रूप में जवाब dlambin को यह

http.AllowAutoRedirect=false; 

के लिए अन्यथा

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

यह यूआरएल प्रारंभिक एक और अनुरोध कर देगा के लिए आवश्यक है और आप पुनः प्राप्त करने में सक्षम नहीं होगा url2।

2

कुछ मामलों के लिए, httpResponse.Cookies खाली हो जाएगा। इसके बजाय CookieContainer का उपयोग करें।

CookieContainer cc = new CookieContainer(); 

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest; 
http.KeepAlive = true; 
http.Method = "POST"; 
http.ContentType = "application/x-www-form-urlencoded"; 

http.CookieContainer = cc; 

string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword; 
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
http.ContentLength = dataBytes.Length; 
using (Stream postStream = http.GetRequestStream()) 
{ 
    postStream.Write(dataBytes, 0, dataBytes.Length); 
} 
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 
// Probably want to inspect the http.Headers here first 
http = WebRequest.Create(url2) as HttpWebRequest; 

http.CookieContainer = cc; 

HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 
+0

यह वास्तव में अच्छा काम करता है, धन्यवाद। –

संबंधित मुद्दे