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 (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:
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