C # के माध्यम से वेबसाइट पर लॉगिन करें


81

मैं C # का उपयोग करने के लिए अपेक्षाकृत नया हूं, और एक ऐसा एप्लिकेशन है जो एक वेबसाइट पर स्रोत कोड के कुछ हिस्सों को पढ़ता है। वह सब काम करता है; लेकिन समस्या यह है कि प्रश्न में पृष्ठ को उपयोगकर्ता को इस स्रोत कोड तक पहुंचने के लिए लॉग इन करना पड़ता है। मेरे कार्यक्रम को शुरू में वेबसाइट में उपयोगकर्ता को लॉग-इन करने के लिए एक तरीके की आवश्यकता है- उसके पूरा होने के बाद, मैं सोर्स कोड को एक्सेस और पढ़ सकूंगा।

जिस वेबसाइट को लॉग इन करना है, वह है: mmoinn.com/index.do?PageModule=UsersLogin

मैंने पूरे दिन इस बारे में खोज की है कि यह कैसे करना है और उदाहरणों की कोशिश की है, लेकिन कोई भाग्य नहीं है।

अग्रिम में धन्यवाद


इसलिए, मैं ऐसा करने के तरीकों के बारे में सोच सकता हूं ... क्या C # प्रोग्राम सर्वर से सीधे HTTP के माध्यम से 'कोड' का अनुरोध करता है या क्या आप ब्राउज़र एप्लिकेशन पर वापस पिग्गी करते हैं या क्या? थोड़ी और जानकारी चाहिए।
मिच बेकर

कार्यक्रम WebClient.DownloadString ("URL") का उपयोग करता है

जवाबों:


113

आप WebClient को POST (GET के बजाय, जो HTTP वर्ब है जिसे आप वर्तमान में DownloadString के साथ उपयोग कर रहे हैं) जारी रख सकते हैं, लेकिन मुझे लगता है कि आपको (थोड़ी) निम्न-स्तरीय कक्षाओं WebRequest और WebRonse के साथ काम करना आसान लगेगा।

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


लॉगिन फॉर्म के लिए पोस्टिंग

फॉर्म पोस्टों को अनुकरण करना आसान है, यह आपके पोस्ट डेटा को इस प्रकार प्रारूपित करने का एक मामला है:

field1=value1&field2=value2

WebRequest और code का उपयोग करके मैंने Scott Hanselman से अनुकूलित किया , यहां बताया गया है कि आप अपने लॉगिन फ़ॉर्म में POST फ़ॉर्म डेटा कैसे लेते हैं:

string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
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=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,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();
}

संपादित करें:

यदि आपको पहले POST के परिणाम देखने की आवश्यकता है, तो आप उस HTML को पुनर्प्राप्त कर सकते हैं जिसे इसके साथ लौटाया गया है:

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

इसे सीधे नीचे रखें cookieHeader = resp.Headers["Set-cookie"];और फिर PageSource में आयोजित स्ट्रिंग का निरीक्षण करें।


विस्तृत प्रतिक्रिया के लिए बहुत बहुत धन्यवाद; लेकिन अभी भी एक हिस्सा है कि मैं अनिश्चित हूँ। क्या मैं "सेट-क्यूकी", "कुकी", या आपके द्वारा पोस्ट किए गए "PHPSESSID" के संबंध में कुछ बदल रहा हूँ? मैंने अपनी जानकारी को इनपुट करने के साथ एक कार्यक्रम में बस उस कोड का उपयोग करने की कोशिश की, लेकिन यह मुझे लॉग इन नहीं कर रहा है (मुझे लगता है कि मैं कुकीज़ के साथ कुछ पंगा ले रहा हूं)।

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

मुझे यकीन नहीं है कि मैं पहली बार क्या गलत कर रहा था, लेकिन यह अब काम करता है! सहायता के लिए बहुत - बहुत धन्यवाद।

1
यदि उपयोगकर्ता सफलतापूर्वक प्रमाणित हो तो मैं कैसे निर्धारित कर सकता हूं?
साइरेल

2
मुझे पता है कि हम यहाँ धन्यवाद नहीं देने वाले हैं लेकिन आपने मेरी गांड बचाई है! +1
ओवेन जेम्स

39

आप WebClient से प्राप्त होने वाली एक क्लास बनाकर, उसके गेटवेबिरेस्टेस्ट मेथड को ओवरराइड करके और उस पर कुकीऑनटेनर ऑब्जेक्ट सेट करके चीजों को काफी सरल बना सकते हैं। यदि आप हमेशा एक ही कुकी धारक उदाहरण सेट करते हैं, तो कुकी प्रबंधन आपके लिए स्वचालित रूप से नियंत्रित हो जाएगा।

लेकिन भेजने से पहले HttpWebRequest पर जाने का एकमात्र तरीका WebClient से इनहेरिट करना और इस विधि को ओवरराइड करना है।

public class CookieAwareWebClient : WebClient
{
    private CookieContainer cookie = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = cookie;
        }
        return request;
    }
}

var client = new CookieAwareWebClient();
client.BaseAddress = @"https://www.site.com/any/base/url/";
var loginData = new NameValueCollection();
loginData.Add("login", "YourLogin");
loginData.Add("password", "YourPassword");
client.UploadValues("login.php", "POST", loginData);

//Now you are logged in and can request pages    
string htmlSource = client.DownloadString("index.php");

डिबगिंग करते समय, (इसे सार्वजनिक किया गया) कुकी हमेशा खाली होती है। वेबसाइट सुनिश्चित करने के लिए है कि Im डाउनलोड करने वाले पृष्ठों पर कुकीज दे दी जाए।
C4d

धन्यवाद, समाधान खोजने के सर्वरल घंटों के बाद, यह काम करता है!
एसेज

9

मैथ्यू ब्रिंडली , आपके कोड को मेरी ज़रूरत की कुछ वेबसाइट (लॉगिन के साथ) के लिए बहुत अच्छा काम किया, लेकिन मुझे बदलने की ज़रूरत थी HttpWebRequestऔर HttpWebResponseअन्यथा मुझे रिमोट सर्वर से 404 बैड रिक्वेस्ट मिलती है । इसके अलावा, मैं आपके कोड का उपयोग करके अपने वर्कअराउंड को साझा करना चाहूंगा, और यह है कि मैंने इसे मूडल के आधार पर एक वेबसाइट पर लॉगिन करने की कोशिश की है , लेकिन यह आपके कदम " लॉगिन फॉर्म के पीछे पृष्ठ प्राप्त करना " पर काम नहीं किया क्योंकि जब सफलतापूर्वक पोस्टिंग हो रही है लॉगिन, 'Set-Cookie'अन्य वेबसाइटों के बावजूद हैडर ने कुछ भी वापस नहीं किया।

इसलिए मुझे लगता है कि जहां हमें अगले अनुरोधों के लिए कुकीज़ संग्रहीत करने की आवश्यकता है, इसलिए मैंने इसे जोड़ा।


" लॉगिन फ़ॉर्म में पोस्टिंग " कोड ब्लॉक करने के लिए:

var cookies = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookies;


और " लॉगिन फ़ॉर्म के पीछे पृष्ठ प्राप्त करना ":

HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(resp.Cookies);
getRequest.Headers.Add("Cookie", cookieHeader);


ऐसा करने से, मुझे लॉग इन करें और "लॉगिन के पीछे पृष्ठ" का स्रोत कोड प्राप्त करें (वेबसाइट आधारित मूडल) मुझे पता है कि यह CookieContainerऔर HTTPCookies का एक अस्पष्ट उपयोग है क्योंकि हम पहले पूछ सकते हैं कि क्या पहले कुकीज़ का एक सेट पहले बचा है। सर्वर को अनुरोध भेजना। समस्या के बिना यह काम करता है वैसे भी, लेकिन यहाँ के बारे में पढ़ने के लिए एक अच्छा जानकारी है WebRequestऔर WebResponse: नमूना परियोजनाओं और साथ ट्यूटोरियल
पुन: प्राप्त HTTP में सामग्री नेट
.NET में कैसे उपयोग करने के लिए HttpWebRequest और HttpWebResponse


2

कभी-कभी, यह एक ही उपयोगकर्ता एजेंट से AllowAutoRedirectलॉगिन POSTऔर पेज GETअनुरोध दोनों को स्विच करने और सेट करने में मदद कर सकता है ।

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.