Frage

Ich bin relativ neu C # zu verwenden, und haben eine Anwendung, die Teile des Quellcodes auf einer Website liest. Das alles funktioniert; aber das Problem ist, dass die betreffende Seite muss der Benutzer diesen Quellcode eingeloggt sein zuzugreifen. Was mein Programm einen Weg muss zunächst die Benutzer in die Website- anmelden, nachdem das erledigt ist, ich werde in der Lage sein, um den Quellcode zugreifen und lesen.

Die Website, die in angemeldet sein muss, ist: mmoinn.com/index.do?PageModule=UsersLogin

Ich habe den ganzen Tag über durchsucht, wie dies zu tun und versucht, Beispiele, aber haben kein Glück gehabt.

Vielen Dank im Voraus

Keine korrekte Lösung

Andere Tipps

Sie können mit WebClient POST (anstelle von GET, fortzusetzen, die die HTTP-Verb ist derzeit mit DownloadString), aber ich denke, es einfacher finden mit den (leicht) untergeordneten Klassen arbeiten webRequest und WebResponse.

Es gibt zwei Teile dazu - das erste ist, das Login-Formular zu schreiben, wird die zweite Rückgewinnung des „Set-Cookie“ Header und senden diese zurück an den Server als „Cookie“ zusammen mit Ihrer GET-Anfrage. Der Server wird dieses Cookies, um Sie identifizieren von nun an (vorausgesetzt, es Cookie-basierte Authentifizierung ist mit dem ich ziemlich sicher bin ist es, wie die Seite eine Set-Cookie-Header zurückgibt, die „PHPSESSID“ enthält).


Buchung auf das Login-Formular

Formular Beiträge einfach zu simulieren sind, es ist nur ein Fall von Formatierung der Post-Daten wie folgt:

field1=value1&field2=value2

Mit WebRequest und Code, den ich von Scott Hanselman angepasst, hier, wie Sie POST würde Formulardaten an Ihrem Login-Formular:

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"];

Hier ist ein Beispiel dafür, was man in den Set-Cookie-Header für Ihr Login-Formular sehen soll:

PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=-

gibt es die Seite hinter dem Anmeldeformular

Jetzt können Sie Ihre GET-Anforderung an einer Seite durchführen, die Sie angemeldet werden müssen.

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

EDIT:

Wenn Sie die Ergebnisse der ersten POST anzeigen müssen, können Sie den HTML-Code wiederherstellen es zurück mit:

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

Dieses direkt unter cookieHeader = resp.Headers["Set-cookie"]; und dann die Zeichenfolge im Quelltext gehalten überprüfen.

Sie können die Dinge vereinfachen ziemlich viel durch Erstellen einer Klasse, die von WebClient ableitet, überschreibt seine GetWebRequest Verfahren und ein Cookie Objekt darauf einstellen. Wenn Sie immer die gleiche Cookie Instanz festgelegt, dann wird die Cookie-Verwaltung für Sie automatisch behandelt werden.

Aber der einzige Weg, auf dem HttpWebRequest zu erhalten, bevor es gesendet wird, ist von WebClient zu erben und diese Methode außer Kraft setzen.

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");

Matthew Brindley arbeitete Ihr Code sehr gut für einige Website, die ich brauchte (mit Anmeldung), aber ich brauchte ein 404 Bad Request von dem Remote-Server zu ändern, sonst HttpWebRequest und HttpWebResponse ich. Auch möchte ich meine Abhilfe mit Ihrem Code teilen, und ist, dass ich es versucht, ein um sich einzuloggen Website basiert auf moodle , aber es hat bei Ihrem Schritt nicht „ gibt es die Seite hinter dem Anmeldeformular “, weil, wenn erfolgreich POSTen die Anmeldung hat der Kopf 'Set-Cookie' nichts trotz anderer Websites zurückgibt.

Also ich denke, das, wo wir Cookies speichern, für die nächsten Anfragen benötigen, so fügte ich diese.
Zur " Buchung auf das Login-Formular " Codeblock:

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


Und auf dem " gibt es die Seite hinter dem Anmeldeformular ":

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


Dadurch, lässt mich Melden Sie sich mich in und den Quellcode der „Seite hinter Login“ erhalten (Website basiert moodle) Ich weiß, dass dies eine vage Verwendung des CookieContainer ist und HTTPCookies, weil wir zuerst fragen kann, ist ein zuvor vor dem Senden der Anfrage an den Server gespeichert von Cookies. Dies funktioniert ohne Problem sowieso, aber hier ist eine gute Informationen über WebRequest und WebResponse mit Beispielprojekten und Anleitung zu lesen:
HTTP-Content-Abrufen in .NET
So verwenden HttpWebRequest und HttpWebResponse in .NET

Manchmal kann es helfen, AllowAutoRedirect Ausschalten und zum Festlegen der Login POST und Seite GET fordert den gleichen User-Agent.

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top