login with VB.NET and httpwebrequest cookiecontainer

Mostafa Abasinejad picture Mostafa Abasinejad · May 30, 2012 · Viewed 9.1k times · Source

I think there is a problem with cookiecontainer (httpwebrequest)

there are 2 main functions in my class, first getting a new form (a hidden token in form tag), and it should set the cookies (which not set) and then second function (doLogin) should login the form. why cookie is not set...? here is my codes: (you can test my code with "http://wetcatdesign.com/wiki/" as wikiURL)

Public Class wiki_submitter
Dim CookieJar As New CookieContainer
Public wikiURL As String

Private Function cutStr(ByVal Str As String, ByVal startStr As String, _
                        ByVal finishStr As String, Optional ByVal startPos As Integer = 1) As String
    Dim start As Integer = InStr(startPos, Str, startStr) + Len(startStr)
    Dim finish As Integer = InStr(start + 1, Str, finishStr)
    cutStr = Mid(Str, start, finish - start)
End Function

Public Function GetNewForm()
    Try
        Dim req As HttpWebRequest = HttpWebRequest.Create(wikiURL & "index.php?title=Special:UserLogin&returnto=Main_Page")
        Dim res As HttpWebResponse
        req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"
        res = req.GetResponse()
        'Setting cookies
        req.CookieContainer = CookieJar

        'getting HTML result
        Dim sr As StreamReader = New StreamReader(res.GetResponseStream())
        Dim HTML = sr.ReadToEnd
        sr.Close()


        Dim wpLoginToken As String = cutStr(HTML, "<input type=""hidden"" name=""wpLoginToken"" value=""", """") ' finding wpLoginToken parameter
        GetNewForm = wpLoginToken
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Function

Public Function doLogin(ByVal username As String, ByVal pass As String)
    Dim req As HttpWebRequest = HttpWebRequest.Create(wikiURL & "index.php?title=Special:UserLogin&action=submitlogin&type=login")
    Dim res As HttpWebResponse
    Dim HTML As String
    '-------Setting up headers------------
    req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"
    req.Referer = wikiURL & "index.php?title=Special:UserLogin&returnto=Main_Page"
    req.ContentType = "application/x-www-form-urlencoded" 'Form content type
    req.Method = "POST" 'data will be send in POST method
    req.CookieContainer = CookieJar 'Setting cookies
    '-------------------------------------

    Dim sw As StreamWriter = New StreamWriter(req.GetRequestStream)
    Dim poststring = "wpLoginToken=" & GetNewForm() & "&wpLoginattempt=Log in&wpName=" & username & "&wpPassword=" & pass
    Try
        sw.Write(poststring)
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        sw.Close()
    End Try

    res = req.GetResponse()
    Dim sr As StreamReader = New StreamReader(res.GetResponseStream())
    HTML = sr.ReadToEnd 'HTML as result
    sr.Close()

    doLogin = HTML 'returns HTML result
End Function
End Class

Answer

Pradeep Kumar picture Pradeep Kumar · May 30, 2012

What happens if you set it before res = req.GetResponse() ?