Hey,
da ich nun vermehrt PN's erhalten habe, in denen gefragt wird, wie man
HttpWebRequests benutzt, erstelle ich hier ein kleines Tutorial und werde euch zeigen, wie ihr euch damit auf Epvp einloggen könnt. Habt ihr erstmal das Prinzip verstanden, könnt ihr es eigentlich überall anwenden und somit auch einen YouTube Account Creator / Bot und sonstige Sachen erstellen.
Das einzige was wir eigentlich noch brauchen ist das Programm [Only registered and activated users can see links. Click Here To Register...] (Firefox-Addon).
So, nun startet ihr dieses und kreuzt unten in der Mitte "Mitschneiden" an.
Nun wird euer Browserverlauf sozusagen mitverfolgt und alle Anfragen, die euer Browser erstellt angezeigt.
Nun loggen wir uns auf Epvp ein und schauen, was uns LHH (Live HTTP Headers) anzeigt:
Das ganze müssen wir nur noch in unserem Programm nachbilden und schon können wir uns darüber einloggen (und danach auch im eingeloggten Account weitere Sachen machen).
In der 1. Zeile von LHH sehen wir den Link, an den unser Browser die Anfrage gesendet hat.
In der 3. Zeile können wir die Art der Anfrage sehen. "POST" kommt immer dann, wenn wir z.B. etwas ausgefüllt haben und eine Seite mit den von uns zuvor eingegeben Daten (in diesem Fall die Logindaten) aufrufen.
Dann gibt es noch "GET", welches kommt, wenn wir einfach die Seite aufrufen, um sie anzeigen zu lassen (in diesem Fall wäre es dann die Hauptseite vom Epvp-Forum nach dem Login).
Da wir uns ja einloggen wollen und somit unsere Logindaten übergeben müssen, nehmen wir nun auch POST. User-Agent & Content-Type übernehmen wir einfach in unser Programm. Zu den restlichen werde ich gleich noch kommen.
Nun können wir auch schon zum Codingteil übergehen.
Erst einmal importieren wir einige Namespaces (braucht man nicht unbedingt, jedoch müssen wir es dann nicht jedesmal davor schreiben).
Danach erstellen wir uns gleich zu Beginn einen neuen CookieContainer.
In diesem werden alle Cookies gespeichert (so wie es euer eigener Browser auch macht), damit ihr auch wirklich noch eingeloggt seid, wenn ihr nach dem Einloggen auf eine andere Seite geht. Diesen müssen wir somit bei jeder weiteren Anfrage (Request) mitübergeben.
So, nun erstellen wir uns unseren ersten Request.
Wie wir in der 1. Zeile von LHH sehen können, senden wir eine Anfrage an:
Somit sieht unsere Anfrage folgendermaßen aus:
(Hinweis: Das "DirectCast" [alternativ dazu auch CType] benutze ich wegen Option Strict On.
Am besten macht ihr dies auch, indem ihr einfach "Option Strict On" in die oberste Zeile einfügt. Dies ist dafür gedacht, dass ihr gleich von Beginn an alles richtig umwandelt und definiert, damit es später zu keinen Problemen im Programm kommt.)
Da wir ja unsere Logindaten übergeben wollen, müssen wir wie gesagt "POST" benutzen, also:
Und setzen gleich unseren CookieContainer:
UserAgent & ContentType kopieren wir einfach aus LHH raus:
So, nun kommen wir zum Übergeben der Logindaten.
Schauen wir uns mal den Content an (letzte Zeile):
Zu unserem Glück ein ziemlich simpler Inhalt. Diesen können wir also ohne weiteres übernehmen. Unseren Inhalt speichern wir am besten in einer Variable:
Dies müssen wir nun als einen Stream übergeben. Zunächst benötigen wir die Länge des Inhalts:
So, nun haben wir die Länge und schreiben den Inhalt in unseren Stream:
Nun haben wir also unsere Anfrage abgeschickt und schauen, was uns der Server geantwortet hat. Dazu erstellen wir ein HttpWebResponse:
Die Antwort haben wir nun also in der Variable "response" gespeichert.
Aus dieser lesen wir nun den Seitenquelltext aus:
Nun haben wir den aktuellen Seitenquelltext in der Variable "seitenQuelltext" gespeichert. Um jetzt zu prüfen, ob wir wirklich eingeloggt sind, schauen wir uns mal den Seitenquelltext etwas genauer an.
Wenn wir eingeloggt sind, dann muss ja logischerweise auch die Möglichkeit bestehen, sich wieder auszuloggen. Wenn die Seite nun auf Deutsch ist, steht ja oben auf der Seite bzw. im Quelltext "Abmelden", ansonsten "Log Out".
Nun erstellen wir einfach eine kleine If-Abfrage und prüfen, ob unsere Variable sowas auch enthält.
Normalerweise müsste jetzt noch "nicht eingeloggt" ausgegeben werden, weil wir derzeit noch auf der Redirect-Seite sind, die nach dem Login kommt (da wo steht "Danke für deinen Login, solltest du nicht weitergeleitet werden, klicke hier" oder so ähnlich).
Laut dem Quelltext sind wir also auf der Redirect-Seite. Dies sehe ich daran, dass der Quelltext folgendes enthält:
Gehen wir also nochmal zu LHH.
Nachdem wir unsere Daten abgeschickt haben, hat unser Browser die Hauptseite von Epvp aufgerufen. Das können wir auch im LHH sehen, wenn wir etwas weiter runterscrollen:
Hier wird nun nicht mehr "POST" sondern "GET" verwendet, weil wir ja dann nichts mehr übergeben, sondern einfach nur die Seite aufgerufen haben. Das bilden wir in unserem Programm einfach kurz nach:
Und nicht vergessen, die Cookies mit zu übergeben:
Und holen uns wieder die Antwort vom Server:
So, nun müssten wir eingeloggt und auf der Hauptseite von Epvp sein.
Um das zu prüfen, benutzen wir einfach die kleine If-Abfrage von oben.
Sollten wir jedoch immer noch nicht eingeloggt sein, besteht auch die Möglichkeit, zu schauen, warum das so ist. Wenn man z.B. falsche Logindaten eingibt, erscheint die Fehlermeldung "Benutzername oder Passwort falsch" oder so ähnlich. Das prüfen wir einfach auch mit einer If-Abfrage und können dann dementsprechend dem Benutzer des Programms sagen, warum das Einloggen nicht geklappt hat.
Wenn ihr nun weitere Sachen im eingeloggten Account erledigen wollt, macht ihr das einmal in eurem Browser nach und bildet einfach den Inhalt von LHH nach.
Das war's eigentlich auch schon. Am Ende gibt's nochmal eine kleine Klasse, die das ganze etwas leichter und übersichtlicher macht, natürlich mit einem Beispiel, wie man sie benutzt.
Aufruf (mit Login + Überprüfung):
Natürlich würde diese Klasse nicht den 1. Platz im "Schönheitswettbewerb" bekommen, das soll sie aber auch nicht. Sie soll bloß zeigen, wie man es mit einer eigenen Klasse einfacher und übersichtlicher machen kann. Natürlich besteht die Möglichkeit diese Klasse nun zu erweitern und weiter zu verbessern. Ein wichtiger Punkt ist z.B. das Prüfen auf das Vorhandensein eines Meta-Refresh (in unserem Beispiel ist es der Aufruf der Epvp-Hauptseite nach dem Login). Wie man sowas genau machen kann, werde ich später noch diesem Tutorial hinzufügen, habe leider nicht viel Zeit und am Handy geht es schlecht ;)
Hier nochmal was kleines, wie man eine Datei uploaden kann: [Only registered and activated users can see links. Click Here To Register...]
Im Anhang findet ihr noch einen Projektordner eines Treasure Creators, vielleicht hilft dies ja dem ein oder anderen das Tutorial bzw. allgemein HttpWebRequests zu verstehen.
Mit freundlichen Grüßen
Kraizy
da ich nun vermehrt PN's erhalten habe, in denen gefragt wird, wie man
HttpWebRequests benutzt, erstelle ich hier ein kleines Tutorial und werde euch zeigen, wie ihr euch damit auf Epvp einloggen könnt. Habt ihr erstmal das Prinzip verstanden, könnt ihr es eigentlich überall anwenden und somit auch einen YouTube Account Creator / Bot und sonstige Sachen erstellen.
Das einzige was wir eigentlich noch brauchen ist das Programm [Only registered and activated users can see links. Click Here To Register...] (Firefox-Addon).
So, nun startet ihr dieses und kreuzt unten in der Mitte "Mitschneiden" an.
Nun wird euer Browserverlauf sozusagen mitverfolgt und alle Anfragen, die euer Browser erstellt angezeigt.
Nun loggen wir uns auf Epvp ein und schauen, was uns LHH (Live HTTP Headers) anzeigt:
PHP Code:
http://www.elitepvpers.com/forum/login.php?do=login
POST /forum/login.php?do=login HTTP/1.1
Host: http://www.elitepvpers.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://www.elitepvpers.com/forum/
Cookie: epvp_backend=s4; __gads=ID=6f749e44ae0087e5:T=1320237926:S=ALNI_MYbOtE8lku_di_EUqg6BvxxSVr9Hg; __utma=15670114.427803338.1320237927.1322589050.1322663893.131; __utmz=15670114.1322134269.108.19.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=elite%20sro%20password%20change; IDstack=2328552; vbulletin_userlist_hide_avatars_buddylist=0; vbulletin_userlist_hide_avatars_incomingreqs=0; __utmb=15670114.40.10.1322663894; __utmc=15670114; bbsessionhash=c3af316e486100aba492eb086d001409; bblanguageid=2; bblastvisit=1322665729; bblastactivity=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 147
vb_login_username=EPVP_USERNAME&vb_login_password=EPVP_PASSWORT&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf=
In der 1. Zeile von LHH sehen wir den Link, an den unser Browser die Anfrage gesendet hat.
In der 3. Zeile können wir die Art der Anfrage sehen. "POST" kommt immer dann, wenn wir z.B. etwas ausgefüllt haben und eine Seite mit den von uns zuvor eingegeben Daten (in diesem Fall die Logindaten) aufrufen.
Dann gibt es noch "GET", welches kommt, wenn wir einfach die Seite aufrufen, um sie anzeigen zu lassen (in diesem Fall wäre es dann die Hauptseite vom Epvp-Forum nach dem Login).
Da wir uns ja einloggen wollen und somit unsere Logindaten übergeben müssen, nehmen wir nun auch POST. User-Agent & Content-Type übernehmen wir einfach in unser Programm. Zu den restlichen werde ich gleich noch kommen.
Nun können wir auch schon zum Codingteil übergehen.
Erst einmal importieren wir einige Namespaces (braucht man nicht unbedingt, jedoch müssen wir es dann nicht jedesmal davor schreiben).
PHP Code:
Imports System.IO
Imports System.Net
Imports System.Text
In diesem werden alle Cookies gespeichert (so wie es euer eigener Browser auch macht), damit ihr auch wirklich noch eingeloggt seid, wenn ihr nach dem Einloggen auf eine andere Seite geht. Diesen müssen wir somit bei jeder weiteren Anfrage (Request) mitübergeben.
PHP Code:
Dim cookieCon As New CookieContainer
Wie wir in der 1. Zeile von LHH sehen können, senden wir eine Anfrage an:
PHP Code:
http://www.elitepvpers.com/forum/login.php?do=login
PHP Code:
Dim request As HttpWebRequest = DirectCast(HttpWebRequest.Create("http://www.elitepvpers.com/forum/login.php?do=login"), HttpWebRequest)
Am besten macht ihr dies auch, indem ihr einfach "Option Strict On" in die oberste Zeile einfügt. Dies ist dafür gedacht, dass ihr gleich von Beginn an alles richtig umwandelt und definiert, damit es später zu keinen Problemen im Programm kommt.)
Da wir ja unsere Logindaten übergeben wollen, müssen wir wie gesagt "POST" benutzen, also:
PHP Code:
request.Method = "POST"
PHP Code:
request.CookieContainer = cookieCon
PHP Code:
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"
request.ContentType = "application/x-www-form-urlencoded"
Schauen wir uns mal den Content an (letzte Zeile):
PHP Code:
vb_login_username=EPVP_USERNAME&vb_login_password=EPVP_PASSWORT&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf=
PHP Code:
Dim username As String = "EPVP_USERNAME"
Dim password As String = "EPVP_PASSWORD"
Dim post As String = "vb_login_username=" & username & "&vb_login_password=" & password & "&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf="
PHP Code:
Dim byteArr() As Byte = Encoding.Default.GetBytes(post)
request.ContentLength = byteArr.Length
PHP Code:
Dim dataStream As Stream = request.GetRequestStream()
dataStream.Write(byteArr, 0, byteArr.Length)
PHP Code:
Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
Aus dieser lesen wir nun den Seitenquelltext aus:
PHP Code:
Dim reader As New StreamReader(response.GetResponseStream())
Dim seitenQuelltext As String = reader.ReadToEnd()
Wenn wir eingeloggt sind, dann muss ja logischerweise auch die Möglichkeit bestehen, sich wieder auszuloggen. Wenn die Seite nun auf Deutsch ist, steht ja oben auf der Seite bzw. im Quelltext "Abmelden", ansonsten "Log Out".
Nun erstellen wir einfach eine kleine If-Abfrage und prüfen, ob unsere Variable sowas auch enthält.
PHP Code:
If seitenQuelltext.Contains("Log Out") Then
//eingeloggt
Else
//nicht eingeloggt
End If
Laut dem Quelltext sind wir also auf der Redirect-Seite. Dies sehe ich daran, dass der Quelltext folgendes enthält:
PHP Code:
...
Thank you for logging in, xKraizy.
...
Click here if your browser does not automatically redirect you.
...
Nachdem wir unsere Daten abgeschickt haben, hat unser Browser die Hauptseite von Epvp aufgerufen. Das können wir auch im LHH sehen, wenn wir etwas weiter runterscrollen:
PHP Code:
http://www.elitepvpers.com/forum/
GET /forum/ HTTP/1.1
Host: www.elitepvpers.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://www.elitepvpers.com/forum/login.php?do=login
PHP Code:
request = DirectCast(HttpWebRequest.Create("http://www.elitepvpers.com/forum/"), HttpWebRequest)
PHP Code:
request.CookieContainer = cookieCon
PHP Code:
response = DirectCast(request.GetResponse(), HttpWebResponse)
reader = New StreamReader(response.GetResponseStream())
seitenQuelltext = reader.ReadToEnd()
Um das zu prüfen, benutzen wir einfach die kleine If-Abfrage von oben.
Sollten wir jedoch immer noch nicht eingeloggt sein, besteht auch die Möglichkeit, zu schauen, warum das so ist. Wenn man z.B. falsche Logindaten eingibt, erscheint die Fehlermeldung "Benutzername oder Passwort falsch" oder so ähnlich. Das prüfen wir einfach auch mit einer If-Abfrage und können dann dementsprechend dem Benutzer des Programms sagen, warum das Einloggen nicht geklappt hat.
Wenn ihr nun weitere Sachen im eingeloggten Account erledigen wollt, macht ihr das einmal in eurem Browser nach und bildet einfach den Inhalt von LHH nach.
Das war's eigentlich auch schon. Am Ende gibt's nochmal eine kleine Klasse, die das ganze etwas leichter und übersichtlicher macht, natürlich mit einem Beispiel, wie man sie benutzt.
PHP Code:
Option Strict On
Option Explicit On
Imports System.IO
Imports System.Net
Imports System.Text
Public Class Http
Dim cookieCon As New CookieContainer
Dim request As HttpWebRequest
Dim response As HttpWebResponse
Public Function GetResponse(ByVal url As String) As String
request = CType(HttpWebRequest.Create(url), HttpWebRequest)
request.CookieContainer = cookieCon
response = CType(request.GetResponse(), HttpWebResponse)
Return New StreamReader(response.GetResponseStream()).ReadToEnd()
End Function
Public Function GetResponse(ByVal url As String, ByVal post As String) As String
request = CType(HttpWebRequest.Create(url), HttpWebRequest)
request.Method = "POST"
request.CookieContainer = cookieCon
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"
request.ContentType = "application/x-www-form-urlencoded"
Dim byteArr() As Byte = Encoding.Default.GetBytes(post)
request.ContentLength = byteArr.Length
Dim dataStream As Stream = request.GetRequestStream()
dataStream.Write(byteArr, 0, byteArr.Length)
response = CType(request.GetResponse(), HttpWebResponse)
Return New StreamReader(response.GetResponseStream()).ReadToEnd()
End Function
End Class
PHP Code:
Private Sub btnLogin_Click (sender As Object, e As EventArgs) Handles btnLogin.Click
With New Http
//hier wird der Seitenquelltext gespeichert
Dim html As String = String.Empty
//Login ausführen
Dim username As String = "EPVP_USERNAME"
Dim password As String = "EPVP_PASSWORD"
html = .GetResponse("http://www.elitepvpers.com/forum/login.php?do=login", "vb_login_username=" & username & "&vb_login_password=" & password & "&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf=")
//Hauptseite aufrufen
html = .GetResponse("http://www.elitepvpers.com/forum/")
//prüfen, ob Login erfolgreich war
If html.Contains("Log Out")
//eingeloggt
Else
//nicht eingeloggt
End If
End With
End Sub
Hier nochmal was kleines, wie man eine Datei uploaden kann: [Only registered and activated users can see links. Click Here To Register...]
Im Anhang findet ihr noch einen Projektordner eines Treasure Creators, vielleicht hilft dies ja dem ein oder anderen das Tutorial bzw. allgemein HttpWebRequests zu verstehen.
Mit freundlichen Grüßen
Kraizy