[vb.net] data ophalen van website d.m.v. post (viewstate?)

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Beste allemaal,

Graag zou ik via een VB.NET tooltje wat data van een bepaalde website afhalen.
Ik maar daarbij gebruik van een HttpWebRequest met als Method een POST.

Om e.e.a. beter de kunnen debuggen heb ik Live HTTP Headers (Plug in voor Firefox) gebruikt om te achterhalen wat ik als POST-data moet sturen. Ik krijg daar een "Content-Length" uit van 190. Daarna dus een hele string met allemaal (gecodeerde) data. (ook gewone tekst zoals "EVENTARGET, VIEWSTATE" etc...)

Als ik die data mee stuur in mijn aanvraag via het VB.NET tooltje, dan krijg ik netjes de data terug die ik graag wil hebben. So far so good, mijn tooltje werkt 8)

Maar: zodra ik het tooltje een week later aanroep -met dus nog steeds diezelfde (vast in code geplaatste) String- dan krijg ik ineens een pagina terug met een foutmelding erop, en dus niet de data die ik graag zou willen hebben. Het lijkt erop dat die data die ik in mijn POST mee stuur "tijdsafhankelijk" is ofzo :?

Vraag: hoe kan ik die POST-data "faken" of van te voren "capturen" zodat ik wél gewoon de data terugkrijg die ik graag wil hebben?

Alle reacties


Acties:
  • +1 Henk 'm!

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 23:23
De target website waar jij je data vandaan haalt gebruikt ASP.NET webforms, en ook de bijbehorde viewstate. Deze viewstate wordt op het moment van posten gevalideerd, en bevat blijkbaar een waarde welke afwijkt. (zie MSDN: Understanding ASP.NET View State voor meer informatie)

Wat je kunt proberen is altijd vooraf een GET doen, deze gegevens posten en hierbij alleen de waardes aanpassen die jij nodig hebt.

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
DoDo schreef op dinsdag 12 juli 2016 @ 15:29:
De target website waar jij je data vandaan haalt gebruikt ASP.NET webforms, en ook de bijbehorde viewstate. Deze viewstate wordt op het moment van posten gevalideerd, en bevat blijkbaar een waarde welke afwijkt. (zie MSDN: Understanding ASP.NET View State voor meer informatie)

Wat je kunt proberen is altijd vooraf een GET doen, deze gegevens posten en hierbij alleen de waardes aanpassen die jij nodig hebt.
Thanks voor je snelle reactie.
Wat bedoel je precies met "en hierbij alleen de waardes aanpassen die jij nodig hebt." ?
Moet ik de gegevens in de string aanpassen die ik vervolgens als mijn POST data gebruik?
Mag ik daar iets in aanpassen dan? Ik heb gewoon eens wat random data erin gezet, om te kijken of het dan werkte, maar dat was helaas niet het geval... (ik dacht misschien checken ze om de zoveel tijd of ze niet steeds aanvragen met dezelfde POST data krijgen ofzo?!)

Wat zou ik met die GET vooraf dan moeten doen? Daar ook alvast wat data uithalen ofzo? (en zoja: welke data dan?)

Acties:
  • +2 Henk 'm!

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 23:23
Ik weet niet uit welke pagina jij het haalt, dus het is een beetje koffiedik kijken maar ik denk dat je de variabele "__VIEWSTATE" moet halen uit de GET, en deze vervolgens weer moet gebruiken met de POST.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:12
Ik vind het zowiezo vreemd dat je een POST doet als je eigenlijk data wil afhalen ?
Wat stuur je mee met die post ?

https://fgheysels.github.io/


Acties:
  • +1 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
DoDo schreef op dinsdag 12 juli 2016 @ 15:38:
Ik weet niet uit welke pagina jij het haalt, dus het is een beetje koffiedik kijken maar ik denk dat je de variabele "__VIEWSTATE" moet halen uit de GET, en deze vervolgens weer moet gebruiken met de POST.
Hoppa, dat werkt! :D (handmatig)
Alleen nog ff iets maken om die string achter:

code:
1
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/


te pakken te krijgen :)

Maareh: thanks dus _/-\o_
Ik ga er vanuit dat dit straks of morgen ook nog gewoon werkt. Even nog wat verder onderzoeken :9
whoami schreef op dinsdag 12 juli 2016 @ 15:41:
Ik vind het zowiezo vreemd dat je een POST doet als je eigenlijk data wil afhalen ?
Wat stuur je mee met die post ?
Ik stuur mee wat ik ook zie dat meegestuurd wordt als ik in HTTP Live Headers kijk.
Dus ik doe in feite gewoon die "originele" aanvraag na. Toevallig is dat in dit geval een POST :)

[ Voor 6% gewijzigd door Atmoz op 12-07-2016 15:53 ]


Acties:
  • +1 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:12
atmoz schreef op dinsdag 12 juli 2016 @ 15:52:
[...]

Ik stuur mee wat ik ook zie dat meegestuurd wordt als ik in HTTP Live Headers kijk.
Dus ik doe in feite gewoon die "originele" aanvraag na. Toevallig is dat in dit geval een POST :)
eigenlijk niet, want je doet geen GET eerst. (Maar nu dus wel zie ik).

https://fgheysels.github.io/


Acties:
  • +1 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 21:54

Damic

Tijd voor Jasmijn thee

Je weet dat je apart je parameters kunt meesturen ;)

Bekijk eens http://cd-pc.mazda-club.be/?page=telemeter#download de source code en dan http_request() in frmSettings ;)

[ Voor 53% gewijzigd door Damic op 12-07-2016 17:51 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Chips, nu lukt het weer ineens niet meer...

Lijkt wel of er een soort "beveiligings mechanisme" achter zit.

Als ik gewoon naar de website ga kom ik er wel op (zonder inloggen of wat dan ook, want het is gewoon openbare info).

Zodra ik het via m'n code doe krijg ik "Uw sessie is verlopen. U wordt nu automatisch omgeleid naar de beginpagina."

Moet ik nog iets doen met cookies ofzo? Als ik 't via Live HTTP Headers probeer (en dan ook gewoon de data krijg te zien), dan zie ik op een gegevens moment:

Cookie: GenericSessionID=cyeqio22c3tryl23vp14tbko; WT_FPC=id=111.35.54.100-2203861568.30532042:lv=1468935207895:ss=1468935207895; ASP.NET_SessionId=lrx5c255dwr2ugjc66kwxg0b

Zou ik die nog ergens moeten meegeven in mijn VB.NET code?

Acties:
  • +1 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 21:54

Damic

Tijd voor Jasmijn thee

Euhm jah je moet de cookies opslaan en daarmee de hele sessie mee doen.

Cookie handler zit ook in mijn programma
boven aan bij je define's
[code=vb]
'-webrequest data
Private tempCookies As New CookieContainer
Private encoding As New UTF8Encoding
[/vb]
dit zet je ergens bij
Visual Basic:
1
2
3
4
5
Private Sub ClearCookies()
        tempCookies = Nothing
        tempCookies = New CookieContainer

    End Sub


in je http request (Dim ... As HttpWebRequest = DirectCast(WebRequest.Create(Uri), HttpWebRequest) ) zet je ergens bij ... .CookieContainer = tempCookies

wat verder doe je een response en dan doe je een select case (in mijn geval dan)
Visual Basic:
1
2
3
4
5
6
7
8
9
Using postresponse As HttpWebResponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
                    Select Case postresponse.StatusCode
                        Case HttpStatusCode.OK, HttpStatusCode.Redirect
                                                         tempCookies.Add(postresponse.Cookies)
                        Case Else
                            msgbox("HTTP_ERROR_CODE::" & postresponse.StatusCode & "::" & postresponse.StatusDescription)
                    End Select
                End Using
                           

[ Voor 108% gewijzigd door Damic op 19-07-2016 17:23 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Hmzz, ik kom er toch niet helemaal uit...

Ik doe eerst een HttpWebRequest om die "Viewstate" eruit te parsen:

code:
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
    Public Function LoadSiteContents(ByVal url As String) As String
        Try

            Dim webRequest As Net.HttpWebRequest = CType(Net.WebRequest.Create(url), Net.HttpWebRequest)
            webRequest.Timeout = 25000
            Dim webResponse As Net.HttpWebResponse = CType(webRequest.GetResponse(), Net.HttpWebResponse)
            Dim ReceiveStream As Stream = webResponse.GetResponseStream()
            Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("utf-8")
            Dim readStream As New StreamReader(ReceiveStream, encode)
            Dim responseFromServer As String = readStream.ReadToEnd.ToString

            logincookie.Add(webResponse.Cookies)

            readStream.Close() : webResponse.Close()

            webRequest = Nothing
            webResponse = Nothing
            readStream.Dispose()

            Return responseFromServer

        Catch ex As Exception
            Loggen("Fout bij LoadSiteContents(" & url & "). Melding: " & ex.Message)
            Return String.Empty
        End Try
    End Function


Daar heb ik nu ook "logincookie.Add(webResponse.Cookies)" bij gezet.

Vervolgens doe ik verderop:

code:
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
31
32
33
34
            Dim postData As String = "__EVENTTARGET=ctl00%24ContentPlaceHolder1%24" & Datum & "000000&__EVENTARGUMENT=&__VIEWSTATE=%2F" & ViewState & "%3D&__VIEWSTATEGENERATOR=9C00E890"
            Dim tempCookies As New CookieContainer
            Dim endoding As New UTF8Encoding
            Dim byteData As Byte() = endoding.GetBytes(postData)
            Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create("http://test.com.nl/d.aspx"), HttpWebRequest)

            postReq.Method = "POST"
            postReq.KeepAlive = True
            postReq.CookieContainer = logincookie 'tempCookies
            postReq.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
            postReq.Referer = "http://test.com/d.aspx"
            postReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"
            postReq.ContentLength = byteData.Length
            postReq.Accept = "*/*"
            postReq.Host = "test.d.nl"

            Dim postreqstream As Stream = postReq.GetRequestStream()
            postreqstream.Write(byteData, 0, byteData.Length)
            postreqstream.Close()

            Using postresponse As HttpWebResponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
                Select Case postresponse.StatusCode
                    Case HttpStatusCode.OK, HttpStatusCode.Redirect
                        tempCookies.Add(postresponse.Cookies)
                    Case Else
                        MsgBox("HTTP_ERROR_CODE::" & postresponse.StatusCode & "::" & postresponse.StatusDescription)
                End Select

                Dim postrequestreader As New StreamReader(postresponse.GetResponseStream())
                Dim thePage As String = postrequestreader.ReadToEnd

                ...etc....

       End Using


Maar nog steeds krijg ik de pagina "uw sessie is verlopen".

Ik doe vast nog vanalles verkeerd, maar wat? :P
Pagina: 1