0

cookiecontainer(httpwebrequest)に問題があると思います

私のクラスには2つの主要な関数があり、最初に新しいフォーム(フォームタグの隠しトークン)を取得し、Cookie(設定されていない)を設定し、次に2番目の関数(doLogin)がフォームにログインする必要があります。Cookie が設定されていないのはなぜですか? ここに私のコードがあります: (wikiURLとして「http://wetcatdesign.com/wiki/」で私のコードをテストできます)

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
4

2 に答える 2

0

まず、リクエストを送信する前に Cookie を設定する必要があります。次に、必要なときに応答から Cookie を抽出する必要があります。ここにそれを行う1つの方法があります

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
            SaveIncomingCookies(res, wikiURL)

            '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
            req.CookieContainer = CookieJar
            sw.Write(poststring)
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            sw.Close()
        End Try

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

        doLogin = HTML 'returns HTML result
    End Function

    Private Function SaveIncomingCookies(ByRef response As HttpWebResponse, ByRef Uri As String)


        If response.Headers("Set-Cookie") <> Nothing Then
            CookieJar.SetCookies(New Uri("http://wetcatdesign.com"), response.Headers("Set-Cookie"))
        End If

    End Function
End Class
于 2012-05-31T10:24:45.670 に答える
0

前に設定するとどうなりますres = req.GetResponse()か?

于 2012-05-30T21:25:19.480 に答える