Seiten
Zuletzt im Ohr
Zuletzt im Sinn
Archiv
- August 2010 (6)
- Juni 2010 (11)
- Mai 2010 (4)
- März 2010 (6)
- Februar 2010 (3)
- Dezember 2009 (2)
- November 2009 (3)
- Oktober 2009 (17)
- September 2009 (7)
- August 2009 (7)
- Juli 2009 (3)
- Juni 2009 (2)
- Mai 2009 (4)
- April 2009 (1)
- März 2009 (3)
- Februar 2009 (11)
- Januar 2009 (14)
- Dezember 2008 (6)
- November 2008 (9)
- Oktober 2008 (6)
- September 2008 (3)
Tagcloud
Partner/Links
- C# Tipps und Tricks - C# Tipps und Tricks
- gb-pix.de - Gästebuchbilder, Jappy, MySpace…
- Kostenlose Browsergames - Kostenlose Browsergames
- MySpace Downloader - MySpace Loader – der kostenlose MySpace.com Downloader
- Servervoice Blog - Servervoice Blog
- Wordpress Theme
- Youtube Mediaplayer - Webmusix – der kostenlose Youtube Mediaplayer
Network
C# – Login auf Webseiten per HttpWebRequest und HttpWebResponse
…Http-Requests mitschneiden, analysieren und reproduzieren
Heute folgt endlich der langersehnte zweite Teil der Miniserie, die sich damit beschäftigt, wie man sich mittels C# auf Webseiten einloggen kann beziehungsweise an durch einen Login geschützten Quelltext kommt. Nachdem im ersten Teil Arcor.de als Testseite diente, nehmen wir dieses mal StudiVZ.net zum testen unseres Programms. Im Gegenteil zum ersten Mal bedienen wir uns heute jedoch der Klassen HttpWebRequest und HttpWebResponse aus dem System.Net Namespace, statt des WebbrowserControls.
Am Anfang steht die Überlegung, wie die Oberfläche unseres Testprogramms aussehen müsste, damit sie unsere Zwecke zwar ausreichend erfüllt, dabei aber nicht übermäßig mit Controls belegt wird. Denn in diesem Artikel wollen wir uns nur auf das nötigste beschränken.
Meiner Meinung nach reicht ein Form mit zwei Buttons und einem WebbrowserControl vollkommen aus.
Ein Klick auf den linken Button, soll den Quelltext der geschützten Seite (mein StudiVZ Profil) in einen String schreiben und diesen dann im WebbrowserControl anzeigen.
Ein Klick auf den rechten Button soll uns im StudiVZ einloggen.
Das WebbrowserControl dient uns heute nur passiv zur schnellen Kontrolle unserer Funktionen. Denn klicken wir auf den linken Button, ohne das wir uns vorher eingeloggt haben, so sehen wir im WebbrowserControl nur die Aufforderung uns einzuloggen. Klicken wir zuerst auf den rechten und dann auf den linken Button, so sehen wir mein VZ-Profil. Auf diese Weise können wir schnell und einfach nachvollziehen, ob der Loginvorgang erfolgreich war.
Solltet ihr euch noch kein neues Projekt angelegt haben, legt dieses bitte nun an und klickt euch die Oberfläche im Visual Studio (oder der IDE eure Vertrauens) zusammen. (Denkt bitte daran die Eigenschaft ScriptErrorsSuppressed des WebbrowserControls auf true zu stellen, damit wir nicht mit unschönen Errors im Script der angezeigten Seite konfrontiert werden.)
Als nächstes schreiben wir die Funktionalität für unseren linken Button. Hierzu macht ihr bitte einfach einen Doppelklick auf das ButtonControl, oder erstellt euch den Click-Eventhandler samt Event von Hand. Ebenso ist es sinnvoll die Namespaces System.Net und System.IO einzubinden.
Da beim Klick auf den linken Button ja mein StudiVZ Profil geladen werden soll, benötigen wir also eine “Funktion”, die den Quelltext zur Verfügung stellt, damit wir ihn im WebbrowserControl anzeigen können.
Hierfür erstellen wir eine neue Klasse, damit wir z.B. die HttpWebRequest Klasse im späteren Verlauf nicht mehrmals deklarieren müssen.
Bevor jetzt eventuell die ersten schon nicht mehr folgen können, hier noch mal schnell die Codeansicht zum jetzigen Zeitpunkt.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
namespace LoginTutorial
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonProfilAufrufen_Click(object sender, EventArgs e)
{
webBrowser1.DocumentText = httpHelper.GetHtml("http://www.studivz.net/Profile/300ee964aa102c6d");
}
}
class HttpHelper
{
}
}
Nun basteln wir uns innerhalb der neulangelegten Klasse unsere Funktion, die den Quelltext meiner Profilseite anfordern soll. Zuerst deklarieren wir noch einen CookieContainer, einen HttpWebRequest, einen HttpWebResponse, sowie einen Streamreader in der HttpHelper Klasse. Nun legen wir unsere Funktion zum holen des Quelltext an, nennen diese GetHtml und legen fest, dass diese einen String namens Url annehmen soll, damit wir der Funktion beim Aufruf die Adresse meines Profils übergeben können.
Jetzt initialisieren wir den eben deklarierten HttpWebRequest in unserer Funktion und weisem ihm über seine Create Methode die Url zu. Daraufhin legen wir weitere Parameter fest, die ihr in der nächsten Codeansicht nachschauen könnt.
Schlussendlich initialisieren wir den HttpWebResponse, wobei wir den Request als HttpWebResponse casten und forden daraufhin den Quelltext an, den wir per Return nach dem Erhalt zurückgeben. Nichts verstanden? Dann einfach mal den entsprechenden Code anschauen…
class HttpHelper
{
//Zuerst deklarieren wir die vier obengenannten nötigen Klassen/Objekte
private CookieContainer cookieContainer = new CookieContainer();
HttpWebRequest request;
HttpWebResponse response;
StreamReader sr;
public string GetHtml(string Url)
{
//Dann initialisieren wir den httpWebRequest und weisem ihm die nötigen
//Parameter zu
request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.CookieContainer = cookieContainer;
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5";
//Hier initialisieren wir den HttWebResponse und casten dazu unser Request
response = (HttpWebResponse)request.GetResponse();
sr = new StreamReader(response.GetResponseStream());
//Zuletzt laden wir den Quelltext und weisen ihn dem
//zurückzugebenen String zu
string html = sr.ReadToEnd();
sr.Close();
response.Close();
return html;
}
}
Wenn wir das erledigt haben, initialisieren wir die HttpHelper Klasse in unserer Hauptklasse und rufen die GetHtml Methode mit der korrekten Url (zu meinem Profil) im Click-Event des linken Buttons auf. Das schaut dann wie folgt aus.
…
public Form1()
{
InitializeComponent();
}
HttpHelper httpHelper = new HttpHelper();
…
private void buttonProfilAufrufen_Click(object sender, EventArgs e)
{
webBrowser1.DocumentText = httpHelper.GetHtml("http://www.studivz.net/Profile/300ee964aa102c6d");
}
Wer mag, kann das bisher geschriebene einfach mal durch den Compiler jagen (F5-Taste) und sich das Ergebnis ansehen. Klickt ihr nun auf den linken Button, so solltet ihr nach kurzer Zeit eine StudiVZ Seite sehen, die euch auffordert euch einzuloggen.
Sollte das der Fall sein, so habt ihr bis jetzt alles richtig gemacht.
Jetzt fehlt nur noch die Methode zum Einloggen. Um diese zu erstellen führen wir im Firefox einen Loginvorgang durch und analysieren diesen. Hierzu benötigen wir ein Plugin, mit dem wir die Http-Requests, die beim Loginvorgang gesendet werden, mitloggen können. Ich habe mich dabei für Live Http Headers entschieden.
Nach dem ihr das Plugin installiert habt, ruft ihr im Firefox http://studivz.net auf und öffnet LiveHttpHeaders.
(siehe Screenshot)
Nun gebt ihr eure Zugangsdaten ein und klickt auf einloggen. Während des Logins erscheint ein Haufen Text im LiveHttpHeaders Fenster. Lasst euch davon nicht verwirren! Ist der Login abgeschlossen, was ihr daran merkt, dass LiveHttpHeaders dem Protokoll nichts mehr hinzufügt, scrollen wir im LiveHttpHeaders Fenster nach ganz oben. Dort steht alles was wir für unseren Login benötigen. Die genaue
Aufschlüsselung entnehmt ihr bitte dem Screenshot und der nachfolgenden Liste.
- Enthält die Url, an die wir unseren Request schicken müssen
- Enthält die Request Methode (Post oder Get) in unserem Fall Post
- Enthält den User-Agent der mitgesendet wird (Wir werden jedoch weiterhin den kurzen User-Agent benutzen, den wir auch für unsere GetHtml Funktion genommen haben.)
- Enthält den Content-Type des Requests
- Enthält die Content-Length des Requests (Diese werden wir später selbst bestimmen, da diese je nach Länge des Contentstrings (siehe 6.) unterschiedlich ist.
- Enthält den übergebenen Content. Die länge dieses Contentstrings variiert je nach username und password.
Jetzt setzen wir die gewonnenen Erkenntnisse in Form der LoginMethode in C# um.
Wir erstellen eine Methode, nennen diese LogIn und weisen ihr im Kostruktor einen String zu, der später beim Aufruf den Contentstring enhalten soll. Danach initialisieren wir, wie schon bei der GetHtml Methode, unser HttpWebRequest, weisen diesem dabei unsere Zielurl (Punkt 1) zu und setzen den CookieContainer, sowie den User-Agent (Punkt 3). Weiter weisen wir der Method Eigenschaft unseres HttpWebRequests den String “Post” (Punkt 2) und der ContentType Eigenschaft den String “application/x-www-form-urlencoded” (Punkt 4) zu. Um die ContentLength Eigenschaft zu bestimmen müssen wir unseren Contentstring per ASCIIEncoding in ein Byte-Array einlesen. Die Length Eigenschaft dieses Arrays definiert gleichzeit die ContentLength Eigenschaft unseres HttpRequests.
Als letztes fügen wir unseren Contentstring hinzu, indem wir einen Stream auf Basis der GetRequestStream Methode unseres HttpWebRequests initialiseren und in diesen unser ContentString-Byte-Array schreiben.
Nun müssen wir unser Request nur noch “absenden”. Hierzu initialisieren wir die HttpWebResponse der HttpHelper-Klasse mit Hilfe der GetResponse Methode unseres HttpWebRequests. Wer mag kann ganz zum Schluss noch eine MessageBox einbauen um später im laufenden Betrieb benachrichtigt zu werden, wenn der Login abgeschlossen ist.
Das Ganze sollte jetzt in etwa so aussehen:
public void LogIn(string LoginString)
{
request = (HttpWebRequest)HttpWebRequest.Create("<a href="https://secure.studivz.net/Login%22%29;">https://secure.studivz.net/Login");</a>
request.CookieContainer = cookieContainer;
request.Method = "POST";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5";
request.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] loginDataBytes = encoding.GetBytes(LoginString);
request.ContentLength = loginDataBytes.Length;
Stream stream = request.GetRequestStream();
stream.Write(loginDataBytes, 0, loginDataBytes.Length);
stream.Close();
response = (HttpWebResponse)request.GetResponse();
MessageBox.Show("eingeloggt");
}
Jetzt brauchen wir nur noch unsere soeben erstellte Login Methode im Click-Event unseres rechten Buttons aufzurufen. (Denkt daran an Stelle von USER und PW euren Usernamen und euer Passwort einzusetzen!)
private void buttonEinloggen_Click(object sender, EventArgs e)
{
httpHelper.LogIn("email=USER&password=PW&login=Einloggen&jsEnabled=true&redirect=&formkey=8d2668da70d06b913eb87e0d2515e5f41977ab
3d8ee403f6d21b532287d6a4a1aac8d251267dc338234239f3e77dc301d0f9924cf149f65c350e31f36001ba9b14bf2dc8764bf9d9fb70ac163ec5cdb7a8e501
fbb0fd3ca2c444fecf84f64448&iv=07eec57af776415f6148b96383f3f9ae");
}
Das war’s auch schon! Wer möchte kann sich das Test-Projekt auch hier downloaden. Wenn ihr euer Projekt nun startet, solltet ihr nach dem Login auch auf die geschützte Seite zugreifen können. Ich hoffe ihr konntet mir Folgen.
Bei Fragen, Problemen, etc. schreibt mir einfach einen Kommentar.
Liebe Grüße,
Raffi
Ähnliche Artikel:
Hallo!

Kategorien
- Der tägliche Senf… (99)
- Informatik (96)
- C# & .net Framework (18)
- Cheat Sheets (4)
- HTML, PHP, etc. (6)
- Neuigkeiten (33)
- Software-Projekte (40)
- Tipps & Tricks (39)
- Web-Projekte (1)
- Musik (11)
- Downloads (4)
- Hörbar – Raffis Musiktipp (4)
- Videoclips (9)
- Schule (5)
Kalendar
| M | D | M | D | F | S | S |
|---|---|---|---|---|---|---|
| « Aug | Okt » | |||||
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | ||||
Counter
| Besucherstatistik | |
| Besucher gesamt: | 154.242 |
| Besucher heute: | 116 |
| Besucher gestern: | 324 |
| Max. Besucher pro Tag: | 677 |
| gerade online: | 1 |
| max. online: | 89 |
| Seitenaufrufe gesamt: | 427.280 |
| Seitenaufrufe diese Seite: | 4.598 |
| Counterstart: | 13.10.2008 |
Meta
Am meisten kommentiert
Neue Artikel
- Soundcloud Downloader
- Große Dateien schnellstmöglich verschicken
- Facebook- & Twitterbutton in Wordpress
- 5x (Audio-)visuelles für die Mittagspause
- C# – Facebook like MessageBox
- Update: Webmusix 1.4.2
- C# – Webcams benutzen
- Mp3’s schneiden, kürzen, ein- und ausblenden
- Netzfundstück: Amsterdam Acoustics
- Pixlr – Online Bilder bearbeiten
Neue Kommentare
- DeannClayton28: The mortgage loans seem to be important for guys, which want to organize their organization. As a...
- Frankonia: Sehr nützliches Tool, danke!
- Raffi: Dann werd ich mir mal das 4.0er Framework draufschmeißen und den Debugger anhauen
- Pari: Moin:) Unter WinXP SP3 mit installiertem .NET 2.0, 3.0 und 3.5 funzt es und unter Win7 x64 ebenso. Nur auf dem...
- Raffi: Hallo Pari, der Fehler ist mir noch nicht über den Weg gelaufen. Hast du eine Möglichkeit das Programm auf...
net-blog.net © 2008-2010




16 Benutzer kommentierten "C# – Login auf Webseiten per HttpWebRequest und HttpWebResponse"
03 Oktober 2009 um 17:34:05
Hey Raffi,
das ist echt klasse! Kann ich gut gebrauchen und funktioniert auch super. Bin gerade dabei, das ganze für ein anderes Portal zum laufen zu bringen. klappt noch nicht ganz, wie es soll aber ich glaube, das wird schon.
Vielen Dank für diesen 2ten Teil.
MfG,
Sebastian
03 Oktober 2009 um 21:49:18
Hallo Sebastian,
solltest du noch Probleme haben, kannst du mir ja mal die Adresse von dem Portal reinreichen, dann schau’ ich mir das auch mal an!
Gruß,
Raffi
05 Oktober 2009 um 10:52:22
Problematisch hierbei ist, dass der Formkey nicht ausgelesen sondern hardcoded in die Loginmethode implementiert wird.
Der formkey wird von Studivz zur Validierung des Requests genutzt und muss jedesmal neu geladen werden.
Sobald sich sonst die formkeys seitens studivz aendern, wirds nix mehr mit dem login.
05 Oktober 2009 um 13:02:45
Die Bedenken sind berechtigt, jedoch funktionieren die Requests mit diesem Formnkey schon seit über einem Jahr. Hat mich auch gewundert, aber es klappt ja schließlich.
06 Oktober 2009 um 12:22:28
War ja klar das hier wieder irgend ein Klugscheisser auftaucht der was madig reden will!
@Nemesis das hier ist ein beispiel für Anfänger! und genau so sollte es auch gesehen werden! Es geht nur darum zu verstehen wie ein Login (programm mässig) abläuft… wer das verstanden hat, sollte auch kein problem damit haben wenn sich der formkey ändert!
@Raffi, nette arbeit! damit haste bestimmt nen paar unwissenden geholfen!
gr33tz
epic|fail
06 Oktober 2009 um 14:17:37
Es ging nicht darum, das Tutorial madig zu reden, sondern darum, dass der formkey zumindest theoretisch nicht statisch ist. Wenn ein Nutzer das nicht weiss und das Tutorial aufgrund des statischen Keys nicht mehr funktioniert, dann wirds beim Nutzer eben auch nicht funktionieren.
06 Oktober 2009 um 16:01:25
Wie schon gesagt, deine Anmerkung war berechtigt und natürlich wird’s nicht mehr gehen, wenn der FormKey geändert wird. Sollte der Fall eintreten, werde ich das Tutorial sicherlich aktualisieren bzw. einen zweiten Teil schreiben, in dem die FormKey-Geschichte erklärt wird, weil ich wie epic|fail richtig erkannt hatte, dieses Tutorial möglichst einfach halten wollte.
Also habt ihr beide Recht und nun haben wir uns alle wieder lieb…
Gruß,
Raffi
06 Oktober 2009 um 20:41:18
für so nen post (1995 als ich ihn gebraucht hätte) wäre ich an die decke gesprungen vor freude ^^
Nur damals gabs noch nichtmal richtig internet, geschweigeden solche plattformen auf welchen man quasi WISSEN für umsonst bekommt.
Nur weil einer sich hinsetzt und die mühe macht! Weil ich das aus dem blickwinkel sehe ist meine toleranzschwelle wohl etwas niedrig.
Weil jeder der da einen blick draufwirft und nen bisschen ahnung hat sieht sofort das ist level 0.
Deshalb muss ich leider sagen, nein nur ich hab recht (jedenfalls diesmal) Wer die topic aufmerksam gelesen hat “…Http-Requests mitschneiden, analysieren und reproduzieren” und den SINN der übung verstanden hat, wird beim mitschneiden & analysieren spätestens feststellen das der formkey sich geändert hat und ihn anpassen.
Der erfolg ist nicht auf StudiVz einzulogen, sondern die header mitzuschneiden sie zu lesen den poststring so wie es die site gerne hätte zusammenzubauen und zu posten. dann ist die frage nur noch, welche site darfs denn sein?!
Aber ich auch für harmonie, also friieeddee!!
gr33tz
epic|fail
07 Oktober 2009 um 13:24:18
Ja, nur der grosse epic|fail hat Recht!!111elf
Moegen alle anderen niederknien.
Und alle lebten in Frieden bis an ihr Lebensende
11 März 2010 um 23:51:54
Hey Raffi,
erstmal vielen Dank für das Tutorial. Es hat mich auf jeden Fall schon mal weiter gebracht.
Ich habe nun aber das Problem, das Skript für eine andere Seite zu reproduzieren.
Und zwar will ich mich bei Vodafone einloggen. Ich glaube, der Loginversuch funktioniert zwar, jedoch ist es mir nicht möglich, danach eine entsprechende Seite aufzurufen.
Hast du vielleicht eine Idee woran das liegen könnte? Oder was ich versuchen kann?
Gruß
Christoph
12 März 2010 um 15:31:58
Wenn du danach an keine internen Seiten kommst, war entweder:
a. der Login nicht erfolgreich
b. wurde die Session nicht aufrecht erhalten
Hast du darauf geachtet, genau die gleiche Instanz des Cookie Containers, welchen du beim Login verwendest, auch bei deinen weiteren Anfragen zu verwenden?
Ansonsten biete ich dir an, dass du mir entweder deinen Code, zumindest in Auszügen zukommen lässt, oder mir mal sagst, wo ich den entsprechenden Login finden kann, damit ich mich mal selbst dran versuchen kann.
Viele Grüße,
Raffi
12 März 2010 um 22:16:19
Also ich vermute, dass die Session nicht aufrecht erhalten wird, denn den selben CookieContainer verwende ich auf jeden Fall. Da sind allerdings auch zwei Cookies drin.
Wenn ich mir das ganze mitschneiden lasse, kommt nach dem Login auch noch eine GET-Methode, in der eine Session-ID existiert, die ich zumindest nicht in den beiden existierenden Cookies gefunden habe (vielleicht war ich auch einfach zu blind).
Der Login ansich sollte erfolgreich gewesen sein, da keine Exception ausgeworfen wird und soweit alle Daten vorhanden sind.
Es handelt sich bei der ganzen Sache um den Login bei Vodafone. Dein Programm habe ich lediglich in soweit modifiziert, dass der Loginstring und die entsprechenden Requestparameter angepasst sind.
Um dich hier nicht mit Kommentaren voll zu spamen, können wir das Gespräch auch gern auf mails verlegen und dann vielleicht nur die Lösung posten.
31 März 2010 um 13:35:48
Hallo Raffi,
da ich bisher mein Problem immernoch nicht gelöst habe, wollte ich fragen, ob es schon was neues gibt zwecks des Logins bei Vodafone. Ich vermute, dass auch bei mir die Session nicht aufrecht erhalten wird.
MfG DerDeveloperInCSharp
06 Mai 2010 um 23:12:23
Hallo Mike,
ich hab auch nochmal einiges probiert und bin leider nicht durchgekommen. Solltest du dennoch eine Lösung finden/gefunden haben. Dann würde ich mich freuen, wenn du dich noch mal meldest!
Gruß Raffi
12 Juli 2010 um 07:09:26
Hallo Raffi,
ich bin mir nicht sicher, ob du mich mit Mike meintest
Aber ich heiße anders
Ich habe es noch einmal versucht aber bisher keine Lösung gefunden. Komischerweise werden mir beim Abrufen des Quellcodes (habe ich so nebenbei auch mal getestet) nur die ersten 3 Zeilen ausgegeben.
Vielleicht sollten wir das aber per Mail klären
Ich werde dir im Laufe der Woche mal schreiben.
MfG Sebastian
15 Juli 2010 um 12:24:31
Ich bin über’s Wochenende unterwegs. Freue mich trotzdem über ‘ne Mail. Nur, dass du nicht erwartest, dass ich nicht innerhalb von 24 Stunden zurückschreibe…