2012-05-30 3 views
0

Я думаю, что есть проблема с cookiecontainer (HttpWebRequest)Войти с VB.NET и HttpWebRequest cookiecontainer

есть 2 основные функции в моем классе, первым получать новую форму (скрытый маркер в виде тега), и он должен установить файлы cookie (которые не установлены), а затем вторая функция (doLogin) должна войти в форму. почему cookie не установлен ...? здесь мои коды: (вы можете проверить свой код с «http://wetcatdesign.com/wiki/», как 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 

ответ

0

Что произойдет, если вы установите его перед res = req.GetResponse()?

+0

Oh! да! я случайно сделал эту ошибку, но не буду работать даже после того, как исправил ее ... –

+0

Я нашел решение: req.Headers.Set («Cookie», CookieJar) 'Настройка Cookies res = req.GetResponse() CookieJar = res.Headers.Get ("Set-Cookie") 'получение файлов cookie –

0

Во-первых, вам необходимо установить файлы cookie перед отправкой запроса, а во-вторых, вам нужно извлечь куки-файлы из ответа, когда вы их ожидаете. Вот один из способов сделать это

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 
Смежные вопросы