Программная авторизациия на сайте - VB

Формулировка задачи:

Здравствуйте уважаемые форумчане! На досуге возникла проблема в автоматической авторизацией на сайте estrabota.ru . Перелопатил тонны интернет материалов, в том числе с форума про возможные решения проблемы: формирование POST запроса на авторизацию и эмуляцию человеческих действий, но к сожалению ни тот ни другой вариант не увенчались успехом. Помогите пожалуйста разобраться что я делаю не так? Формирование и отправка POST запроса:
        WebBrowser1.Navigate(url & "user/logout/") ' Logout, url = "http://www.spb.estrabota.ru/index.php/"
        waiting(1) ' процедура ожидания загрузки страницы, она работает в ней проблем нет
        Dim body As String = "password2=" & id.pas & "&login2=" & id.log ' id структура содержащая логин и пароль, это тело запроса
        Dim rqst As Net.HttpWebRequest = Net.HttpWebRequest.Create(url & "user/j_login/")
        System.Net.ServicePointManager.Expect100Continue = False ' отключил постоянно появляющуюся строчку Expect: 100-continue
 
        rqst.Method = "post"
        Dim addhead As String
        rqst.Headers.Add("x-requested-with", "XMLHttpRequest")
        rqst.Headers.Add("AcceptLanguage", "ru")
        rqst.Referer = url
        rqst.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
        rqst.Headers.Add(Net.HttpRequestHeader.AcceptEncoding, "gzip, deflate")
        rqst.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322)"
        rqst.ContentLength = body.Length.ToString()
        rqst.Headers.Add(Net.HttpRequestHeader.Pragma, "no-cache")
        rqst.Headers.Add(Net.HttpRequestHeader.Cookie, "wfSessionCookie=77e257512893fb06ee0a7c1b45877932")
        addhead = "x-requested-with: XMLHttpRequest" & Environment.NewLine
        addhead = addhead + "Accept-Language: ru" & Environment.NewLine
        addhead = addhead + "Referer: " & url & Environment.NewLine
        addhead = addhead + "Accept: */*" & Environment.NewLine
        addhead = addhead + "Content-type: application/x-www-form-urlencoded; charset=UTF-8" & Environment.NewLine
        addhead = addhead + "Accept-Encoding: gzip, deflate" & Environment.NewLine
        addhead = addhead + "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322)" & Environment.NewLine
        ' пакет получился полностью такой же как и перехваченный Charles ответ от сервера пришел такой же как и при нормальной авторизации
        Using rqst_s = rqst.GetRequestStream()
            Dim rqst_body() As Byte = System.Text.Encoding.UTF8.GetBytes(body)
            rqst_s.Write(rqst_body, 0, rqst_body.Length)
        End Using
        Dim response As HttpWebResponse = CType(rqst.GetResponse(), HttpWebResponse)
        Dim dataStream As Stream = response.GetResponseStream()
        Dim reader As New StreamReader(dataStream)
        Dim responseFromServer As String = reader.ReadToEnd()
        'Dim resp As Byte = System.Text.Encoding.UTF8.GetBytes(responseFromServer)
        WebBrowser1.Navigate(url, "", System.Text.Encoding.UTF8.GetBytes(body), "") ' тут пробовал всевозможные варианты, даже ставил WebBrowser1.Navigate(url, "", System.Text.Encoding.UTF8.GetBytes(responseFromServer), "") результат - вместо страницы с замещенной формой личного кабинета со стандартными ссылками открывается сама форма личного кабинета с нерабочими ссылками и авторизация не проходит
        waiting(1)
Итог - пакет вроде правильный но адекватной реакции WebBrowser'a я не добился. Второй вариант: эмуляция действий человека:
        WebBrowser1.Navigate(url) 
        waiting(2)
        Dim point As System.Drawing.Point
        point.X = 895
        point.Y = 480  ' указываю координаты поля ввода Email
        WebBrowser1.Document.GetElementFromPoint(point).Focus()
        SendKeys.SendWait("{DEL}") 'на всякий случай стираю то что там есть
        WebBrowser1.Document.ActiveElement.InnerText() = id.log
        'SendKeys.SendWait(id.log) ' пробовал и эмулировать нажатия кнопок
        'Clipboard.SetText(id.log)
        'SendKeys.SendWait("^(v)") ' и вставку из буфера обмена
        SendKeys.SendWait("{TAB}") ' переход в поле ввода пароля
 
        WebBrowser1.Document.ActiveElement.InnerText() = id.pas
        'SendKeys.SendWait(id.pas) ' то же самое просто пробовал разные вариации
        'Clipboard.SetText(id.pas)
        'SendKeys.SendWait("^(v)")
 
        SendKeys.SendWait("{TAB}") ' перехожу на ссылку "зарегестрироваться"
        SendKeys.SendWait("{TAB}") 'перехожу собственно на кнопку "войти"
        WebBrowser1.Document.ActiveElement.InvokeMember("click") 'и нажимаю так
        'SendKeys.SendWait("{ENTER}") ' или даже так
Итог сих действий - отправка точно такого же POST запроса с маленьким нюансом - в теле запроса вместо нужной строчки "password2=2@2.ru&login2=2@2.ru" почему то получается "password2=пароль&login2=2@2.ru" (естественно @ = %40 а пароль = тоже куча знаков с %) и ответ от сервера - неверный логин или пароль. Подскажите пожалуйста мне верное решение, мне абсолютно неважно какой способ будет работать, в принципе важен сам результат. Была мысль оставить второй вариант и написать процедуру - сниффер которая пакет бы поймала, отредактировала и послала дальше(через Charles получилось перехватить этот пакет, значение "пароль" поменять на "2@2.ru", послать дальше и авторизация прошла, все корректно отобразилось) но я так понял это настолько трудоемко что вряд ли я смогу без помощи это реализовать. Очень надеюсь на вашу помощь!

Код к задаче: «Программная авторизациия на сайте - VB»

textual
WebBrowser1.Document.getElementById("login2").Value = "login"
WebBrowser1.Document.getElementById("password2").Value = "pass"
WebBrowser1.Document.getElementsByName("signIn")(0).Click

7   голосов, оценка 4.286 из 5


СОХРАНИТЬ ССЫЛКУ