Webrequest Frage

02/17/2013 16:52 dercoder#1
Hey,

ich bin relativ erfahren was visual basic angeht, aber hab noch nie mit httpwebrequest gearbeitet und hoffe, dass ich hier hilfe finde.

Was ich machen will
Mich auf der Paypalseite einloggen

Was mein Problem ist
Code:
Dim Request As HttpWebRequest = CType(WebRequest.Create("X"), HttpWebRequest)
X sollte ja der Link zum login sein, aber wie bekomme ich den, wenn ich auf den loginbutton keinen rechtsklick machen kann ?

Danke im Voraus
02/17/2013 17:03 Kraizy​#2
[Only registered and activated users can see links. Click Here To Register...]
Wenn du Firefox nutzt, dann hol dir LiveHttpHeaders, bei Chrome z.B. ist das schon integriert, ich glaub das war STRG+ALT+I.
02/17/2013 17:17 dercoder#3
Danke, aber kannst du mir helfen ?
Bekomm ein ERROR 404 zurück

Code:
Dim Request As HttpWebRequest = CType(WebRequest.Create("https://www.paypal.com/de/cgi-bin/we...=_login-submit"), HttpWebRequest)
        Request.Method = "POST"
        Request.ContentType = "application/x-www-form-urlencoded"

        Dim Post As String = "csrfModel.returnedCsrf=uTE1yH6jECK3jUNh-mbdN-zyFrQ7uLDR7yhORi5n3dcARoeE7vzo2pGwmMn1JwaHeZ4tu0qZ2GL13HgxysNPyZ76_YseZaZjm2on7fQqxrkF27eE&login_email=" & User & "&login_password=" & Pwd & "&submit.x=Einloggen&browser_name=Firefox&browser_version=18&browser_version_full=18.0&operating_system=Windows&bp_mid=v%3D1%3Ba1%3Dna%7Ea2%3Dna%7Ea3%3Dna%7Ea4%3DMozilla%7Ea5%3DNetscape%7Ea6%3D5.0+%28Windows%29%7Ea7%3Dna%7Ea8%3Dna%7Ea9%3Dtrue%7Ea10%3Dna%7Ea11%3Dtrue%7Ea12%3DWin32%7Ea13%3Dna%7Ea14%3DMozilla%2F5.0+%28Windows+NT+6.1%3B+rv%3A18.0%29+Gecko%2F20100101+Firefox%2F18.0%7Ea15%3Dfalse%7Ea16%3Dna%7Ea17%3Dna%7Ea18%3Dwww.paypal.com%7Ea19%3Dna%7Ea20%3Dna%7Ea21%3Dna%7Ea22%3Dna%7Ea23%3D1920%7Ea24%3D1080%7Ea25%3D24%7Ea26%3D1040%7Ea27%3Dna%7Ea28%3Dna%7Ea29%3Dna%7Ea30%3Dna%7Ea31%3Dna%7Ea32%3Dna%7Ea33%3Dna%7Ea34%3Dna%7Ea35%3Dna%7Ea36%3Dna%7Ea37%3Dna%7Ea38%3Dna%7Ea39%3Dna%7Ea40%3Dna%7Ea41%3Dna%7Ea42%3Dna%7E&bp_ks1=v%3D1%3Bl%3D8%3BDi0%3A8876Di1%3A112Ui0%3A8Di2%3A174Ui1%3A75Ui2%3A51Di3%3A29Di4%3A102Ui3%3A87Ui4%3A65Di5%3A25Ui5%"
        Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post)
        Request.ContentLength = byteArray.Length
        Dim DataStream As Stream = Request.GetRequestStream()
        DataStream.Write(byteArray, 0, byteArray.Length)
        DataStream.Close()

        Dim Response As HttpWebResponse = Request.GetResponse()
        DataStream = Response.GetResponseStream()
        Dim reader As New StreamReader(DataStream)
        Dim ServerResponse As String = reader.ReadToEnd()
        reader.Close()
        DataStream.Close()
        Response.Close()

        If InStr(ServerResponse, "Wenn diese") Then
            MessageBox.Show("Login OK")
        Else
            MessageBox.Show("Login nicht OK")
        End If
02/17/2013 17:20 Kraizy​#4
Ist doch logisch dass csrfModel.returnedCsrf=... usw immer neu generiert werden muss
02/17/2013 17:21 dercoder#5
kannst mir einen anhaltspubkt geben wie ich das immer neu generiere ?
02/17/2013 19:11 vwap#6
GET Request an die Seite und dann den Source-Code parsen.
02/17/2013 19:35 Kraizy​#7
Entweder stehen die Werte direkt im Quelltext, oder werden intern durch JavaScript o.ä. generiert (was das ganze normalerweise komplizierter macht).
Aber vom Namen her (returnedCsrf) würde ich auf letzteres tippen.

P.S. du solltest den Link schon richtig kopieren, bei dir ist er nämlich durch .. abgekürzt, das erklärt wohl auch 404 not found
02/18/2013 09:55 dercoder#8
Danke für eure Hilfe !
Habs nun hinbekommen den Key immer neu zu generieren (steht im source) nun hab ich aber ein Problem, wenn ich mich einlogge, uns auf "Einloggen..." überprüfe sagt er mir immer, dass das einloggen erfolgreich war egal ob mit richtige daten oder komplet sinnlosen...

was kann das sein ?
02/18/2013 12:04 kissein#9
Quote:
If InStr(ServerResponse, "Wenn diese") Then
[Only registered and activated users can see links. Click Here To Register...]
Quote:
Returns an integer specifying the start position of the first occurrence of one string within another.
02/18/2013 12:51 dercoder#10
ich hab mir beide responses in eine datei schreiben lassen (mit richtigen daten und mit falschen daten) und die dateien waren identisch ...
02/18/2013 16:43 tolio#11
kann nicht sein, schau dir die responses bei nem haltepunkt im html vorschau ding an und überprüfe das mal
02/19/2013 08:13 dercoder#12
So hab mir mal die Klasse von Kraizy c&p, um zu testen obs so klappt aber leider auch nicht
hier mein Code:

Code:
 Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://paypal.com")
        Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
        Dim reader1 As StreamReader = New StreamReader(httpResponse.GetResponseStream)
        Dim httpContent As String = reader1.ReadToEnd
        RichTextBox1.Text = httpContent
        Dim Text As String = RichTextBox1.Lines(468)
        Dim Splitt As String() = Text.Split("=")
        'csrfModel Key auslesen
        Dim Key As String() = Splitt(3).Split(My.Settings.Setting)


        With New Http

            Dim html As String = String.Empty
            Dim User As String = "XXX"
            Dim PWD As String = "XXX"
            Dim username As String = "EPVP_USERNAME"
            Dim password As String = "EPVP_PASSWORD"
            html = .GetResponse("https://www.paypal.com/at/cgi-bin/webscr?cmd=_login-submit", "csrfModel.returnedCsrf=" & Key(1) & "&login_email=" & User & "&login_password=" & PWD & "&submit.x=Einloggen")

            html = .GetResponse("https://t.paypal.com/ts?v=0.1&t=1361259418036&g=-60&e=im&pgrp=My%20Account%20Overview&cnac=AT&page=My%20Account%20Overview&teal=ICmOX8D7uXYnjkVNrhtu09qamQpXCF32wSvO4KHRJejIhYJ8lTAQZQ%253d%253d_13cf15e048c&tmpl=xpt%2FCustomer%2Faccount%2FWelcome&cust=9G720876214018245&acnt=premier&aver=verified&rstr=unrestricted&pgst=1361259137&lgin=in&calc=5f805afe26f8&rsta=de_DE&pt=Mein%20Konto%20-%20PayPal&cd=24&sw=1920&sh=1200&bw=1226&bh=507&ce=1&pl=pdf%2Csilverlight%2CShockwave%20Flash%2011.5%20r502&t1=2&t1c=0&t1d=0&t1s=0&t2=2292&t3=24&t4=205&t4d=182&t4e=23&tt=2527&teal=ICmOX8D7uXYnjkVNrhtu09qamQpXCF32wSvO4KHRJejIhYJ8lTAQZQ%253d%253d_13cf15e048c")

            If html.Contains("Willkommen, Vorname Nachname") Then //Vorname nachname sind natürlich die die angezeigt werden.
                MsgBox("!!!")
            Else
                MsgBox("....")
            End If
        End With

Ich komm nun garnicht mehr in den account - egal ob richtig oder faktedaten.

Der 2. Getresponse link ist der, an dem mich paypal weiterleitet, ich vermute auch, dass hier der Fehler ist, der Link ist ewig lange und warscheinlich werden da weiß gott wieviele werte generiert an die ich nicht kommen - kann das sein ?


Mit diesem Teil lese ich den "csrfModel.returnedCsrf" Wert aus den mir Paypal für eine neue session zuteilt.
Bisschen umständlich über die RTB aber für testzwecke reicht es.

Code:
HttpWebRequest.Create("http://paypal.com")
        Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
        Dim reader1 As StreamReader = New StreamReader(httpResponse.GetResponseStream)
        Dim httpContent As String = reader1.ReadToEnd
        RichTextBox1.Text = httpContent
        Dim Text As String = RichTextBox1.Lines(468)
        Dim Splitt As String() = Text.Split("=")
        'csrfModel Key auslesen
        Dim Key As String() = Splitt(3).Split(My.Settings.Setting)
02/19/2013 11:55 'Heaven.#13
Wenn ich nicht falsch gelesen habe nutzt du nicht immer den gleichen cookiecontainer ;)
Dadurch stimmt der Key aus deinem erstem Request nicht mit dem, den du beim einloggen übergeben musst überein...
02/19/2013 12:51 Kraizy​#14
PHP Code:
With New Http
   Dim html 
As String = .GetResponse("http://www.paypal.de")
   
Dim csrf As String html.Substring(html.IndexOf("csrfModel.returnedCsrf")).Split(""""c)(2)

   
Dim sb As New StringBuilder
   sb
.Append("csrfModel.returnedCsrf=" csrf)
   
sb.Append("&login_email=" email)
   
sb.Append("&login_password=" password)
   
sb.Append("&submit.x=Einloggen")

   
html = .GetResponse("https://www.paypal.com/de/cgi-bin/webscr?cmd=_login-submit"sb.ToString())

   If 
html.Contains("Ausloggen")
      
MsgBox("ok")
   Else
      
MsgBox("nope")
   
End If
End With