سؤال

أنا جديد نسبيا لاستخدام C #، والحصول على تطبيق يقرأ أجزاء من التعليمات البرمجية المصدر على موقع ويب. أن جميع الأعمال؛ ولكن المشكلة هي أن الصفحة المعنية تتطلب تسجيل الدخول للمستخدم للوصول إلى هذا الرمز المصدري. ما يحتاج برنامجي إلى طريقة لتسجيل المستخدم في البداية في موقع الويب - بعد ذلك، سأكون قادرا على الوصول إلى التعليمات البرمجية المصدر وقراءةها.

الموقع الإلكتروني الذي يحتاج إلى تسجيل الدخول هو: mmoinn.com/index.do؟ pagemodule=userslogin

لقد بحثت عن يوم كامل حول كيفية القيام بذلك وحاولت الأمثلة، لكن لم يكن لديك حظ.

شكرا مقدما

لا يوجد حل صحيح

نصائح أخرى

يمكنك متابعة استخدام WebClient لنشر (بدلا من الحصول عليها، وهو الفعل http. أنت تستخدم حاليا مع DownloadString)، لكنني أعتقد أنك ستجد أنه من الأسهل العمل مع الطبقات ذات المستوى الأدنى (قليلا) WebRequest و Webresponse.

هناك جزأين لهذه - الأول هو نشر نموذج تسجيل الدخول، والثاني يتعافى رأس "Set-Cookie" وإرسال ذلك مرة أخرى إلى الخادم ك "ملف تعريف الارتباط" مع طلب الحصول على طلبك. سيستخدم الخادم ملف تعريف الارتباط هذا لتحديدك من الآن فصاعدا (على افتراض أنه يستخدم المصادقة المستندة إلى ملف تعريف الارتباط الذي واثق من ذلك، فهذا الصفحة إرجاع رأس ملف تعريف الارتباط الذي يتضمن "ppsessed").


النشر إلى نموذج تسجيل الدخول

من السهل تحديد المشاركات النموذجية، إنها مجرد حالة تنسيق بيانات النشر الخاصة بك على النحو التالي:

field1=value1&field2=value2

باستخدام webrequest ورمز أنا تكييفها من سكوت هانسلان, ، إليك كيفية نشر بيانات النموذج إلى نموذج تسجيل الدخول الخاص بك:

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=-

الحصول على الصفحة خلف نموذج تسجيل الدخول

الآن يمكنك إجراء طلب الحصول على صفحة تحتاج إلى تسجيل الدخول إليه.

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();
}

تعديل:

إذا كنت بحاجة إلى عرض نتائج المشاركة الأولى، يمكنك استعادة HTML التي تم إرجاعها مع:

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

ضع هذا أدناه مباشرة cookieHeader = resp.Headers["Set-cookie"]; ثم تفقد السلسلة التي عقدت في pagesource.

يمكنك تبسيط الأمور قليلا من خلال إنشاء فئة تستمد من WebClient، مما يطالب بأسلوب GetWebRequest وإعداد كائن Cookiecontainer عليه. إذا قمت دائما بتعيين نفس مثيل Cookiecontainer، فسيتم التعامل مع إدارة ملفات تعريف الارتباط تلقائيا لك.

ولكن الطريقة الوحيدة للحصول على 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");

ماثيو بريندي, ، عمل الكود الخاص بك جيدا جدا بالنسبة لبعض موقع الويب الذي كنت بحاجة إليه (مع تسجيل الدخول)، لكنني بحاجة إلى التغيير إلى HttpWebRequest و HttpWebResponse خلاف ذلك أحصل على 404 طلب سيء من الخادم البعيد. وأود أيضا أن أشارك الحل الحل الخاص بي باستخدام التعليمات البرمجية الخاصة بك، وهو أنني جربتها لتسجيل الدخول إلى موقع بناء على Moodle, ، لكنها لم تنجح في خطوتك "الحصول على الصفحة خلف نموذج تسجيل الدخول"لأنه عند النجاح نشر تسجيل الدخول، رأس '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);


القيام بذلك، يتيح لي تسجيل لي في والحصول على شفرة المصدر في "الصفحة خلف تسجيل الدخول" (موقع Moodle على الإنترنت) أعرف أن هذا هو استخدام غامض لل CookieContainer و httpcookies لأننا قد نسأل أولا هل هناك مجموعة من ملفات تعريف الارتباط سابقا محفوظة قبل إرسال الطلب إلى الخادم. هذا يعمل دون مشكلة على أي حال، ولكن إليك معلومات جيدة لقراءة WebRequest و WebResponse مع عينة المشاريع والبرنامج التعليمي:
استرجاع محتوى HTTP في .NET
كيفية استخدام httpwebrequest و httpwebresponse في .NET

في بعض الأحيان، قد يساعد في إيقاف تشغيل AllowAutoRedirect وإعداد كلا تسجيل الدخول POST و صفحة GET يطلب من وكيل المستخدم نفسه.

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top