2014-09-10 5 views
5

तो, मैं वेब कैसे वेबसाइटों प्रोग्राम के रूप में उपयोग करते हुए सी # में प्रवेश करने के बारे में अधिक जानने की कोशिश कर रहा परिशोध किया गया है। मैं एक वेब क्लाइंट का उपयोग नहीं करना चाहता। मुझे लगता है मैं HttpWebRequest और HttpWebResponse की तरह कुछ का उपयोग करना चाहते हैं, लेकिन मुझे नहीं पता कि कैसे इन कक्षाओं में काम किया है।एक वेबसाइट पर लॉग इन करके सी # का उपयोग कर प्रोग्राम

मुझे लगता है मैं समझाने के लिए कि वे कैसे काम करते हैं और आवश्यक कदम सफलतापूर्वक में लॉग इन करने के लिए किसी को तलाश कर रहा हूँ कहते हैं, वर्डप्रेस, एक ईमेल खाते, या किसी भी साइट की आवश्यकता है कि है कि आप एक उपयोगकर्ता नाम के साथ एक के रूप में भरने और पारण शब्द।

// Declare variables 
     string url = textBoxGetSource.Text; 
     string username = textBoxUsername.Text; 
     string password = PasswordBoxPassword.Password; 

     // Values for site login fields - username and password html ID's 
     string loginUsernameID = textBoxUsernameID.Text; 
     string loginPasswordID = textBoxPasswordID.Text; 
     string loginSubmitID = textBoxSubmitID.Text; 

     // Connection parameters 
     string method = "POST"; 
     string contentType = @"application/x-www-form-urlencoded"; 
     string loginString = loginUsernameID + "=" + username + "&" + loginPasswordID + "=" + password + "&" + loginSubmitID; 
     CookieContainer cookieJar = new CookieContainer(); 
     HttpWebRequest request; 

     request = (HttpWebRequest)WebRequest.Create(url); 
     request.CookieContainer = cookieJar; 
     request.Method = method; 
     request.ContentType = contentType; 
     request.KeepAlive = true; 
     using (Stream requestStream = request.GetRequestStream()) 
     using (StreamWriter writer = new StreamWriter(requestStream)) 
     { 
      writer.Write(loginString, username, password); 
     } 

     using (var responseStream = request.GetResponse().GetResponseStream()) 
     using (var reader = new StreamReader(responseStream)) 
     { 
      var result = reader.ReadToEnd(); 
      Console.WriteLine(result); 
      richTextBoxSource.AppendText(result); 
     } 

     MessageBox.Show("Successfully logged in."); 

मैं नहीं जानता कि अगर मैं सही रास्ते या नहीं पर हूँ:

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

+0

[सी # कार्यक्रम के माध्यम से वेबसाइट पर लॉग इन] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/930807/c-sharp-login-to-website-via-program) – RyBolt

उत्तर

17

वेबसाइटों में लॉग प्रोग्राम के कठिन और कसकर कैसे साइट अपनी लॉगिन प्रक्रिया को लागू करता है के साथ युग्मित है। कारण अपने कोड काम नहीं कर रहा है, क्योंकि आप अपने अनुरोध/प्रतिक्रिया में इस में से किसी के साथ काम नहीं कर रहे हैं।

के उदाहरण के लिए fif.com लेते हैं। जब आप एक उपयोगकर्ता नाम और पासवर्ड में टाइप करें, निम्नलिखित पोस्ट अनुरोध भेजा जाता है:

POST https://fif.com/login?task=user.login HTTP/1.1 
Host: fif.com 
Connection: keep-alive 
Content-Length: 114 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Origin: https://fif.com 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Referer: https://fif.com/login?return=...== 
Accept-Encoding: gzip,deflate 
Accept-Language: en-US,en;q=0.8 
Cookie: 34f8f7f621b2b411508c0fd39b2adbb2=gnsbq7hcm3c02aa4sb11h5c87f171mh3; __utma=175527093.69718440.1410315941.1410315941.1410315941.1; __utmb=175527093.12.10.1410315941; __utmc=175527093; __utmz=175527093.1410315941.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=175527093.|1=RegisteredUsers=Yes=1 

username=...&password=...&return=aHR0cHM6Ly9maWYuY29tLw%3D%3D&9a9bd5b68a7a9e5c3b06ccd9b946ebf9=1 

सूचना कुकीज़ (विशेष रूप से पहली, आपका सत्र टोकन)। क्रिप्टिक यूआरएल-एन्कोडेड रिटर्न वैल्यू भेजा जा रहा है। यदि सर्वर नोटिस ये गायब हैं, तो यह आपको लॉगिन करने नहीं देगा।

HTTP/1.1 400 Bad Request 

या इससे भी बदतर, एक लॉगिन संदेश की 200 प्रतिक्रिया कहीं अंदर दफन किए गए त्रुटि संदेश के साथ।

लेकिन चलो बस दिखाएं कि आप उन सभी जादू मूल्यों को इकट्ठा करने में सक्षम थे और उन्हें एक HttpWebRequest ऑब्जेक्ट में पास कर पाए। साइट अंतर नहीं जान पाएगी। और यह इस तरह कुछ के साथ प्रतिक्रिया दे सकता है।

HTTP/1.1 303 See other 
Server: nginx 
Date: Wed, 10 Sep 2014 02:29:09 GMT 
Content-Type: text/html; charset=utf-8 
Transfer-Encoding: chunked 
Connection: keep-alive 
Location: https://fif.com/ 

आशा है कि आप इसकी अपेक्षा कर रहे थे। लेकिन अगर आपने इसे अभी तक बनाया है, तो अब आप अपने अब मान्य सत्र टोकन के साथ सर्वर पर अनुरोधों को प्रोग्राम कर सकते हैं और अपेक्षित HTML वापस प्राप्त कर सकते हैं।

GET https://fif.com/ HTTP/1.1 
Host: fif.com 
Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36 
Referer: https://fif.com/login?return=aHR0cHM6Ly9maWYuY29tLw== 
Accept-Encoding: gzip,deflate 
Accept-Language: en-US,en;q=0.8 
Cookie: 34f8f7f621b2b411508c0fd39b2adbb2=gnsbq7hcm3c02aa4sb11h5c87f171mh3; __utma=175527093.69718440.1410315941.1410315941.1410315941.1; __utmb=175527093.12.10.1410315941; __utmc=175527093; __utmz=175527093.1410315941.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=175527093.|1=RegisteredUsers=Yes=1 

और यह सब fif.com के लिए है - कुकी और टोकन और पुन: निर्देशों के इस करतब दिखाने एक और साइट के लिए पूरी तरह से अलग हो जाएगा। मेरे अनुभव में (विशेष रूप से उस साइट के साथ), आपके पास लॉगिन दीवार से गुजरने के लिए तीन विकल्प हैं।

  1. साइट की प्रक्रियाओं चारों ओर नृत्य करने
  2. मैन्युअल अपने ब्राउज़र के साथ साइट में लॉग इन, जादू मूल्यों हड़पने, और उन्हें अपने अनुरोध वस्तुओं में प्लग या
  3. एक स्क्रिप्ट बनाएं एक अविश्वसनीय रूप से जटिल और नाजुक स्क्रिप्ट लिखें आपके लिए यह करने के लिए selenium स्वचालित करने के लिए।

सेलेनियम सभी जुगलिंग को संभाल सकता है, और अंत में आप कुकीज़ को खींच सकते हैं और सामान्य रूप से आपके अनुरोधों को बंद कर सकते हैं।यहां फीफा के लिए एक उदाहरण दिया गया है:

//Run selenium 
ChromeDriver cd = new ChromeDriver(@"chromedriver_win32"); 
cd.Url = @"https://fif.com/login"; 
cd.Navigate(); 
IWebElement e = cd.FindElementById("username"); 
e.SendKeys("..."); 
e = cd.FindElementById("password"); 
e.SendKeys("..."); 
e = cd.FindElementByXPath(@"//*[@id=""main""]/div/div/div[2]/table/tbody/tr/td[1]/div/form/fieldset/table/tbody/tr[6]/td/button"); 
e.Click(); 

//Get the cookies 
foreach(OpenQA.Selenium.Cookie c in cd.Manage().Cookies.AllCookies) 
{ 
    string name = c.Name; 
    string value = c.Value; 
    cc.Add(new System.Net.Cookie(name,value,c.Path,c.Domain)); 
} 

//Fire off the request 
HttpWebRequest hwr = (HttpWebRequest) HttpWebRequest.Create("https://fif.com/components/com_fif/tools/capacity/values/"); 
hwr.CookieContainer = cc; 
hwr.Method = "POST"; 
hwr.ContentType = "application/x-www-form-urlencoded"; 
StreamWriter swr = new StreamWriter(hwr.GetRequestStream()); 
swr.Write("feeds=35"); 
swr.Close(); 

WebResponse wr = hwr.GetResponse(); 
string s = new System.IO.StreamReader(wr.GetResponseStream()).ReadToEnd(); 
+0

ठीक है। मुझे पता है तुम्हारा क्या मतलब है। यह अभ्यास वेब प्रोग्रामिंग में मेरा पहला प्रयास है। मैं डेटाबेस से कनेक्ट करने के लिए ज्यादातर परिचित हूं, और ऐसा कुछ भी नहीं है। ऐसा लगता है कि यह इसके लायक है इससे ज्यादा परेशानी है। – DGarrett01

+1

सेलेनियम मुझे बस इतना चाहिए। यह मेरी समस्या का अविश्वसनीय रूप से छोटा काम करता है। – minnow

+3

क्रेडिट प्राप्त करने के लिए एज़ूर में लॉग इन करने के लिए मेरे लिए बहुत अच्छा काम किया। यह कुकी कोंटेनर सीसी = नया कुकी कोंटेनर(); हालांकि – MrBeanzy

1

चेकआउट this पोस्ट। यह यह कर का एक और तरीका है और आप हालांकि यह सेलेनियम के साथ आसान हो सकता है किसी भी पैकेज स्थापित करने की आवश्यकता नहीं है।

"आप पोस्ट (जीईटी के बजाय, जो HTTP verb आप वर्तमान में DownloadString साथ प्रयोग कर रहे है) करने के लिए WebClient उपयोग जारी रख सकते हैं, लेकिन मुझे लगता है कि आप इसे आसान के साथ काम करने मिल जाएगा (थोड़ा) निचले स्तर कक्षाएं WebRequest और WebResponse

इस के दो भाग हैं -। पहला, लॉगिन प्रपत्र पोस्ट करने के लिए है दूसरा "सेट-कुकी" शीर्षक उबरने और सर्वर के रूप में करने के लिए कि वापस भेज रहा है अपने GET अनुरोध के साथ "कुकी"। सर्वर आप इधर-उधर की पहचान के लिए इस कुकी का उपयोग करेगा मीटर अब पर (यह कुकी-आधारित प्रमाणीकरण जो मैं काफी आश्वस्त यह है कि पेज एक सेट कुकी शीर्ष लेख जो "PHPSESSID" भी शामिल है रिटर्न के रूप में है हूँ उपयोग कर रहा है यह सोचते हैं)।

field1=value1&field2=value2 

WebRequest और कोड मैं का उपयोग करना:


लॉगिन प्रपत्र

फार्म पदों अनुकरण करने के लिए आसान कर रहे हैं करने के लिए पोस्ट, यह सिर्फ इस प्रकार अपने पद डेटा स्वरूपण का मामला है Scott Hanselman से अनुकूलित, यहाँ है आप अपनी प्रवेश फार्म के लिए प्रपत्र डेटा पोस्ट चाहते हैं कैसे:

string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; 

नोट: इस यूआरएल के लिए, नहीं प्रपत्र का URL फ़ॉर्म पोस्ट है (यदि आप यह "कार्रवाई" एचटीएमएल के रूप टैग की विशेषता

string formParams = string.Format("email_address={0}&password={1}", "your email", "your password"); 
string cookieHeader; 
WebRequest req = WebRequest.Create(formUrl); 
req.ContentType = "application/x-www-form-urlencoded"; 
req.Method = "POST"; 
byte[] bytes = Encoding.ASCII.GetBytes(formParams); 
req.ContentLength = bytes.Length; 
using (Stream os = req.GetRequestStream()) 
{ 
    os.Write(bytes, 0, bytes.Length); 
} 
WebResponse resp = req.GetResponse(); 
cookieHeader = resp.Headers["Set-cookie"]; 

यहाँ एक है में पा सकते हैं क्या आप अपनी प्रवेश फार्म के लिए सेट कुकी शीर्ष लेख में देखना चाहिए की मिसाल:

PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; 

डोमेन = .mmoinn.com, लैंग = hi; पथ = /; डोमेन = .mmoinn.com, adt_usertype = अन्य, adt_host = -


लॉगिन प्रपत्र के पीछे पेज हो रही

अब आप एक पृष्ठ पर अपने GET अनुरोध प्रदर्शन कर सकते हैं कि आप के लिए में लॉग इन होना चाहिए।

string pageSource; 
string getUrl = "the url of the page behind the login"; 
WebRequest getRequest = WebRequest.Create(getUrl); 
getRequest.Headers.Add("Cookie", cookieHeader); 
WebResponse getResponse = getRequest.GetResponse(); 
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
{ 
    pageSource = sr.ReadToEnd(); 
} 

संपादित करें: सीधे cookieHeader = resp.Headers["Set-cookie"]; नीचे

using (StreamReader sr = new StreamReader(resp.GetResponseStream())) 
{ 
    pageSource = sr.ReadToEnd(); 
} 

प्लेस इस:

आप पहली पोस्ट के परिणाम देखें करने की जरूरत है, तो आप एचटीएमएल इसके साथ लौट आए ठीक हो सकता है और उसके बाद पेजसोर्स में आयोजित स्ट्रिंग का निरीक्षण करें। "

+1

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। –

+0

@ReenHashemi हाँ मुझे यह करना चाहिए, धन्यवाद! अभी भी एक नौसिखिया .. – DFSFOT

+1

बस किसी और के जवाब की पूरी तरह से प्रतिलिपि बनाना या तो उचित व्यवहार नहीं है (भले ही आप उससे लिंक करें)। – nkjt

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