Nabend mitteinand,
ich möchte gerne ein paar Werte von ask.fm/account/stream lesen, allerdings scheitert es schon beim Login.
Vorgehen:
- Seite anfordern und authentication_token auslesen
- Logindaten an den Server senden
- ...
Das Problem, denke ich, liegt an den unvollständigen Cookies beim Senden der Logindaten. z.B. _ask.fm_session Cookie?
Danke (:
Hier Code dazu(was sind die richtigen [vb.net]-code Tags?):
PHP Code:
Public Sub login(user As String, pw As String)
//Get response for authentication token
Dim tempcookie As New CookieContainer
Dim request As WebRequest = _
WebRequest.Create("http://ask.fm/")
request.Credentials = CredentialCache.DefaultCredentials
Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
//expect _ask.fm_session cookie here, but there is non cookie returned at all
tempcookie.Add(response.Cookies)
Dim dataStream As Stream = response.GetResponseStream()
Dim reader As New StreamReader(dataStream)
Dim responseFromServer As String = reader.ReadToEnd()
Dim starttag As String = "authenticity_token"" type=""hidden"" value="""
Dim endtag As String = "="" />"
Dim t_token As String
Dim user_list As New List(Of String)
Dim postdata As String
//Clean up the streams and the response.
reader.Close()
response.Close()
//Get token stream data
t_token = responseFromServer.Substring(responseFromServer.IndexOf(starttag) + starttag.Length)
auth_token = t_token.Substring(0, t_token.IndexOf(endtag))
//prepare cont for login
Dim encoding As New UTF8Encoding
postdata = "authenticity_token=" & auth_token & _
"%3D&login=" & user & _
"&password=" & pw & _
"&follow=&like=&back=&authenticity_token=" & auth_token & _
"%3D"
Dim bytes() = encoding.GetBytes(postdata)
Dim ask_request As HttpWebRequest = DirectCast(WebRequest.Create("http://ask.fm/session"), HttpWebRequest)
ask_request.Method = "POST"
ask_request.KeepAlive = True
ask_request.CookieContainer = tempcookie
Dim ask_request_stream As Stream = ask_request.GetRequestStream()
ask_request_stream.Write(bytes, 0, bytes.Length)
ask_request_stream.Close()
Dim ask_response As HttpWebResponse = DirectCast(ask_request.GetResponse(), HttpWebResponse)
//The cookies given are different to those usually given when login was successful
tempcookie.Add(ask_response.Cookies)
logincookie = tempcookie
Dim ask_response_reader As New StreamReader(ask_response.GetResponseStream())
Dim ask_response_string As String = ask_response_reader.ReadToEnd()
ask_response_reader.Close()
ask_request_stream.Close()
ask_response.Close()
End Sub
Hier wird der Cookie "_ask.fm_session" mitgesendet, wo kann ich das auslesen?
Darum musst du dich nicht kümmern, setze einen GET Request auf die Hauptseite mit verbundenem CookieContainer ab und logge dich danach über den POST Request (mit dem selben CookieContainer) ein.
Ich denke eher, dass diese ominöse Cookie nur gesetzt wird, wenn du dich erfolgreich eingeloggt hast aber das ist nun nur Spekulation. In der Regel werden gesetzte Cookies im Set-Cookie Header angegeben, du müsstest halt mal alle relevanten Anfragen (und dazu gehören nicht nur die Header) posten damit man eine vernünftige Debugbasis hat.
PS: Wo hast du dir den Code zusammenkopiert? Das tut ja schon in den Augen weh...
PPS: Zensier die Session ID, du weißt anscheinend nicht dass diese jedem den Zugriff auf diesen Account gewähren kann.
Du musst da keine Cookies hin und her schieben. Wenn der Server Cookies setzt, sind sie automatisch im CookieContainer, das macht .NET selbst.
Deine letzte Frage verstehe ich nicht, meinst du Packet Sniffer und Debugger? Ich würde dir so etwas wie Fiddler empfehlen, der fungiert als Proxy und bekommt alle Anfragen die du sendest (sowie die Antworten darauf). Dort siehst du auch genau, ob der Server deine Anfrage ablehnt oder wie er eben generell darauf reagiert.
Habe nichts dazu gefunden. Hätte mich auch etwas gewundert, da hier keine wirkliche Struktur vorliegt. Du hast ja nicht immer Werte nach Key-Value Prinzip und die Delimiter wechseln auch ständig.
Hau einfach ein entsprechendes RegEx pattern rein, dann wirst du die Informationen schnell und geordnet extrahieren können.