Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/56: Рейтинг темы: голосов - 56, средняя оценка - 4.61
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
1

Авторизация на сайте через post запрос

30.09.2014, 00:26. Показов 10950. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Я новичок в vb net (учусь кодить) недавно мне пришлось работать с post get запросами. Так вот, есть сайтhttp://forum.minecraft-galaxy.ru/guilogin/ (это страница, где нужно войти на сайт запросом) тут нужно заполнить два поля (логин и пароль соответственно)
Я ловил запрос через http analyzer и делал такой же, но что-то, наверное, делал не так... Не получилось.
Для чего мне это нужно? Можно же просто зайти через wb
Возможно, это и не нужно. Но сам проект - это не только авторизация. Но и отправка запросов на инвайт. Инвайты вроде как отправляются... Но инвайт не приходит, почему?
Я думаю, что это как раз из-за отсутствия запроса на авторизацию, а авторизацию через wb vb net не видет.
Надеюсь, понятно расписал. (если кто не понял, нужен запрос на авторизацию)
Заранее спасибо!

Добавлено через 2 часа 12 минут
VB.NET
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
Dim request1 As HttpWebRequest = HttpWebRequest.Create("http://forum.minecraft-galaxy.ru/main/")
        Dim request As HttpWebRequest = HttpWebRequest.Create("http://forum.minecraft-galaxy.ru/login.php")
        request1.Method = "POST"
        request1.Accept = "..."
        request1.UserAgent = "..."
        request1.ContentType = "."
        request1.Referer = "http://forum.minecraft-galaxy.ru/guilogin/"
        request.Method = "POST"
        request.Accept = "..."
        request.UserAgent = "...."
        request.ContentType = "..." 
        request.Referer = "http://forum.minecraft-galaxy.ru/guilogin/" 'всякие поля, которые я заполняю 
        Dim data As String = "login=...&pass=..." 'логин и пароль
        Dim writer As New StreamWriter(request.GetRequestStream(), Encoding.Default)
        writer.Write(data)
        writer.Close()
        Dim stream As Stream = request.GetResponse().GetResponseStream()
        Dim reader As New StreamReader(stream, Encoding.Default)
        Dim response As String = reader.ReadToEnd
        request.Abort()
 
        Dim Request2 As HttpWebRequest = HttpWebRequest.Create("") 'ссылка для работы 2 части программы
        Dim Response2 As HttpWebResponse
        Request2.Method = "POST"
        Request2.AllowAutoRedirect = False
 
        Dim reqString As String = "form=&invite=&user=..." 'user - кого инвайтить
        Dim requestData As Byte() = Encoding.Default.GetBytes(reqString)
 
        Using s As Stream = Request2.GetRequestStream()
            s.Write(requestData, 0, requestData.Length)
        End Using
        Response2 = Request2.GetResponse
Мои наработки по коду, еще вроде как GET запрос нужен...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2014, 00:26
Ответы с готовыми решениями:

Авторизация на сайте через POST запрос и последующая работа с этого аккаунта
Вот допустим я могу авторизироваться на сайте через ПОСТ запрос, а как мне сделать чтобы...

Авторизация через POST запрос. Как правильно работать с капчей?
Здравствуйте. Как всегда, проблема :D Мне нужно послать POST-запрос с данными из формы...

Авторизация на сайте. POST - запрос
Миллион тем было, миллион тем будет. Ниже процедура и 2 вызова. для LDS - работает, для Life -...

Программная авторизация на сайте, POST-запрос
Ребят, я этим никогда не интересовался, поэтому простите, если вопрос глупый. Не могу программно...

29
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
30.09.2014, 13:36 2
Вычисти из запроса как можно больше заголовков (чтобы ответ получился адекватным). А то тут ещё gzip'а какого-нибудь не хватало...

Добавлено через 3 минуты
А вообще, погугли "Если данные верные, то будет сообщение вида" вместе с кавычками.
1
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
30.09.2014, 21:47  [ТС] 3
П.С. Как можно нажать на вот такую кнопку?
HTML5
1
<input type="submit" value="имя_кнопки" class="btn">
0
121 / 114 / 62
Регистрация: 27.07.2014
Сообщений: 225
30.09.2014, 22:14 4
n1lsik,
1) С авторизацией разобрался?
2) Нажать на кнопку, где? в WebBrowser?
0
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
30.09.2014, 22:43  [ТС] 5
Hemicide, Авторизация вроде как работала, не работала вторая часть кода.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Dim Request2 As HttpWebRequest = HttpWebRequest.Create("") 'ссылка для работы 2 части программы
        Dim Response2 As HttpWebResponse
        Request2.Method = "POST"
        Request2.AllowAutoRedirect = False
 
        Dim reqString As String = "form=&invite=&user=..." 'user - ник пользователя
        Dim requestData As Byte() = Encoding.Default.GetBytes(reqString)
 
        Using s As Stream = Request2.GetRequestStream()
            s.Write(requestData, 0, requestData.Length)
        End Using
        Response2 = Request2.GetResponse
Да, в WebBrowser, я смог вот таким кодом
VB.NET
1
2
3
4
For Each h As HtmlElement In WebBrowser1.Document.Body.GetElementsByTagName("input")
            h.GetAttribute("value").Equals("имя_кнопки")
            h.InvokeMember("click")
        Next
Но тут проблема, похоже, что нажимаются две кнопки или больше...
0
121 / 114 / 62
Регистрация: 27.07.2014
Сообщений: 225
30.09.2014, 22:53 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

n1lsik, а Вы условие на проверку значения забыли поставить. Конечно у Вас будут все кнопки в документе нажиматься
VB.NET
1
2
3
4
5
For Each h As HtmlElement In WebBrowser1.Document.Body.GetElementsByTagName("input")
     If h.GetAttribute("value").Equals("имя_кнопки") Then
          h.InvokeMember("click")
     End if
Next
Так-же проверьте класс элемента, если он уникален для кнопки, можно попробовать так:
VB.NET
1
2
3
4
Dim attr As Object = h.getAttribute("Class")
If Not attr Is Nothing AndAlso attr.Equals("btn") Then
    'вызов клика / проверка нужна для того, чтобы не получить исключения при отсутствии такого атрибута, ведь не все элементы имеют атрибут Class
End If
2
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
30.09.2014, 22:59  [ТС] 7
Hemicide, спасибо! Но мне бы все-таки с запросами разобраться. Второй способ (через клик кнопки и т.д) не очень удобный
0
121 / 114 / 62
Регистрация: 27.07.2014
Сообщений: 225
30.09.2014, 23:27 8
n1lsik, Я бы на твоём месте поставил нормальный сниффер, типа Fiddler4, и посмотрел, что отправляется через сайт, и что отправляет твой код.
1
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
01.10.2014, 01:53 9
Цитата Сообщение от n1lsik Посмотреть сообщение
П.С. Как можно нажать на вот такую кнопку?
Не надо так.

Цитата Сообщение от n1lsik Посмотреть сообщение
Encoding.Default
И так тоже не надо

Цитата Сообщение от n1lsik Посмотреть сообщение
Но мне бы все-таки с запросами разобраться.
Ты погуглил то что я говорил? Там очень много на эту тему написано.
0
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
02.10.2014, 16:39  [ТС] 10
Цитата Сообщение от Qwertiy Посмотреть сообщение
Не надо так.
Это я понял)
Цитата Сообщение от Qwertiy Посмотреть сообщение
И так тоже не надо
А что вместо этого тогда?)
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
02.10.2014, 18:36 11
n1lsik, я же написал, какую фразу ввести в гугл. Там будет единственный результат (потом появится второй - та страница, где мы сейчас). Там уйма информации с примерами о том, как сделать то, что ты хочешь. Может быть всё-таки посмотришь?
И да, нужен .NET 4, с более ранними есть какой-то косяк...

А про кодировку - Default - это текущая кодовая страница компьютера (у нас Win1251, но вполне может оказаться и другая), т. е. работающая на одном компьютере программа вполне может перестать работать на другом.
0
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
12.11.2014, 15:00  [ТС] 12
Вернулся к работе над кодом. Теперь использую вот такой код:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Function YouCodes_Post(ByVal url As String, ByVal data As String) As String
        Dim cook = New CookieContainer()
        'ServicePointManager.Expect100Continue = False
        Dim request = DirectCast(WebRequest.Create(url), HttpWebRequest)
        request.CookieContainer = cook
        request.Method = "POST"
        request.ContentType = "application/x-www-form-urlencoded"
        Using requestStream = request.GetRequestStream()
            Using writer = New StreamWriter(requestStream)
                writer.Write(data)
            End Using
        End Using
        Using responseStream = request.GetResponse().GetResponseStream()
            Using reader = New StreamReader(responseStream)
                Dim result = reader.ReadToEnd()
                Return result
            End Using
        End Using
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Text = YouCodes_Post("куда отправить запрос (сайт)", "данные для отправки") 'отправляем запрос, получаем исходный код страницы
    End Sub
Похоже, что проблема из куков (Cookie), а точнее из-за их не сохранения. Так как судя по ответу от сервера (показывает запрос с нужным ответом), авторизация проходит (запросы смотрю через Fiddler)
Что посоветуете?
Заранее спасибо!
0
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
12.11.2014, 15:19 13
n1lsik, а в чем проблема-то? Не пройти правильно авторизацию или что?
0
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
12.11.2014, 15:58  [ТС] 14
Дядя Корней, авторизация проходит. Но дальнейшие действия, для которых она нужна не проходят...
Т.е не сохраняются куки, наверное. Поэтому и сразу "вылетает" так сказать.
0
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
12.11.2014, 16:41 15
n1lsik, а Вы уверены, что авторизация проходит правильно?
Посмотрите в result присутствует ли там Ваш логин. Если его нет, то авторизация не пройдена.

Добавлено через 27 минут
n1lsik, в Вашем коде отсутствует половина заголовков, поэтому сервер скорее всего Вас редиректит на начальную страницу. Сложно вообще что-то понять не понимая что именно Вы делаете.
Держите, вот код правильной авторизации:

VB.NET
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
Public _loginCookie As CookieContainer
    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Dim postdata As String = "form=&ref=http%3A%2F%2Fforum.minecraft-galaxy.ru%2Fmain%2F&login=тут логин&pass=тут пароль"
        Dim tempCookies As New CookieContainer
        Dim encoding As New UTF8Encoding
        Dim bytedata As Byte() = encoding.GetBytes(postdata)
        Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create("http://forum.minecraft-galaxy.ru/login.php"), HttpWebRequest)
        postReq.Method = "POST"
        postReq.KeepAlive = True
        postReq.CookieContainer = tempCookies
        postReq.ContentType = "application/x-www-form-urlencoded"
        postReq.UserAgent = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12"
        postReq.Referer = "Referer: http://forum.minecraft-galaxy.ru/main/"
        postReq.ContentLength = bytedata.Length
        Dim postreqststream As Stream = postReq.GetRequestStream()
        postreqststream.Write(bytedata, 0, bytedata.Length)
        postreqststream.Close()
        Dim postresponse As HttpWebResponse
        postresponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
        _loginCookie = tempCookies
        Dim postreqreader As New StreamReader(postresponse.GetResponseStream, System.Text.Encoding.UTF8)
        Dim thepage As String = postreqreader.ReadToEnd()
        postresponse.Close()
        postreqreader.Close()
        postreqststream.Close()
        RichTextBox1.Text = thepage
    End Sub
Попробовал всё работает. Кука на месте. Все функции авторизированного пользователя доступны.
Искренне надеюсь, что Вам это нужно не для спама! Спам, это
2
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
12.11.2014, 23:14 16
У n1lsik'а код лучше...
Заголовки позбираются под конкретный сервер.
Куки можно сразу сохранять в CookieContainer.
0
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
12.11.2014, 23:53 17
Qwertiy, а никто и не спорит
Человеку нужно было решение и я его дал, а лучше оно, воспользуется им ТС или нет, это уже его личное дело.

...ну и на словах оно конечно круто звучит. Можно и куки сразу сохранять и код лучше писать. Это всё хорошо, но это просто слова, а Вы лучше код напишите и покажите на примере, как можно куку сохранить и как лучше написать, критиковать-то много ума не нужно. Без обид!
1
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
13.11.2014, 11:26 18
Цитата Сообщение от Дядя Корней Посмотреть сообщение
а Вы лучше код напишите и покажите на примере
Да без проблем. Только недавно писал подобное. Делалось для конкретного сайта, так что есть отдельный модуль Options с настройками, в котором находится базовый адрес, кодировка и некоторые другие параметры - по идее такие вещи имеет смысл передавать в конструктор или помещать в сам класс.
VB.NET
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
 
Public Class SiteProcessor
 
Private CookieContainer As New CookieContainer
 
Public ReadOnly Property CookieHeader As String
  Get
    Return CookieContainer.GetCookieHeader(Options.CookieUri)
  End Get
End Property
 
Protected Async Function GetHtmlPageByGet(ByVal Url As String) As Task(Of String)
  Dim Request As HttpWebRequest = WebRequest.Create(Url)
  Dim SetCookie As String
 
  With Request
    .Method = WebRequestMethods.Http.Get
    .CookieContainer = CookieContainer
    Using Response As HttpWebResponse = Await .GetResponseAsync()
      With Response
        SetCookie = .Headers("Set-Cookie")
        If Not String.IsNullOrEmpty(SetCookie) Then CookieContainer.SetCookies(Options.CookieUri, SetCookie)
        Using ResponseStream As Stream = .GetResponseStream()
          Using Reader As New StreamReader(ResponseStream, Options.SiteEncoding)
            Return Await Reader.ReadToEndAsync()
          End Using
        End Using
      End With
    End Using
  End With
End Function
 
Protected Async Function GetHtmlPageByPost(ByVal Url As String, ByVal Data As Dictionary(Of String, String), Optional ByVal AllowAutoRedirect As Boolean = True) As Task(Of String)
  Dim Request As HttpWebRequest = WebRequest.Create(Url)
  Dim DataStr As String = String.Join("&", From Kvp In Data Select Uri.EscapeUriString(Kvp.Key) & "=" & Uri.EscapeUriString(Kvp.Value))
  Dim BinData As Byte() = Options.SiteEncoding.GetBytes(DataStr)
  Dim SetCookie As String
 
  With Request
    .Method = WebRequestMethods.Http.Post
    .AllowAutoRedirect = AllowAutoRedirect
    .CookieContainer = CookieContainer
    .ContentType = "application/x-www-form-urlencoded"
    .ContentLength = BinData.Length
    .GetRequestStream().Write(BinData, 0, BinData.Length)
    Using Response As HttpWebResponse = Await .GetResponseAsync()
      With Response
        SetCookie = .Headers("Set-Cookie")
        If Not String.IsNullOrEmpty(SetCookie) Then CookieContainer.SetCookies(Options.CookieUri, SetCookie)
        Using ResponseStream As Stream = .GetResponseStream()
          Using Reader As New StreamReader(ResponseStream, Options.SiteEncoding)
            Return Await Reader.ReadToEndAsync()
          End Using
        End Using
      End With
    End Using
  End With
End Function
 
Public Async Function LoginAsync(ByVal User As String, ByVal Password As String) As Task
  Await GetHtmlPageByPost(Options.SiteUrl & "/login.php", New Dictionary(Of String, String) From {{"usrname", User}, {"passwrd", Password}, {"login", "Войти"}}, False)
End Function
 
End Class
Добавлено через 2 минуты
А ещё можно всё-таки погуглить написанную фразу и увидеть предыдущую версию этого кода.
3
9 / 9 / 5
Регистрация: 29.04.2014
Сообщений: 70
13.11.2014, 20:28  [ТС] 19
Дядя Корней, спасибо за код. Логин присутствует, но у меня дальше проблемы с кодом. Например, не могу понять, как в этой строке
VB.NET
1
Dim postdata As String = "form=&ref=http%3A%2F%2Fforum.minecraft-galaxy.ru%2Fmain%2F&login=тут логин&pass=тут пароль"
сделать login= тексту из TextBox'а (т.е login=TextBox1.Text). Это не для флуда, теперь делаю запрос для еще одного сайта
VB.NET
1
check=данные&texttospel=TextBox1.Text&sendtospel=данные(2)
Qwertiy, спасибо. Но у меня +40 ошибок с Вашим кодом
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
13.11.2014, 21:55 20
Цитата Сообщение от n1lsik Посмотреть сообщение
как ... сделать login= тексту из TextBox'а
Вот же:
Цитата Сообщение от Qwertiy Посмотреть сообщение
VB.NET
1
2
' New Dictionary(Of String, String) From {{"usrname", User}, {"passwrd", Password}, {"login", "Войти"}}
Dim DataStr As String = String.Join("&", From Kvp In Data Select Uri.EscapeUriString(Kvp.Key) & "=" & Uri.EscapeUriString(Kvp.Value))


Цитата Сообщение от n1lsik Посмотреть сообщение
Qwertiy, спасибо. Но у меня +40 ошибок с Вашим кодом
И что, мне его надо загнать каждую функцию в одну строку, как ёлочки?
0
13.11.2014, 21:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2014, 21:55
Помогаю со студенческими работами здесь

POST запрос, авторизация на сайте Intertelecom
Пытаю написать программу, которая проверяет остаток средств на лицевом счете, чтобы пополнять...

Авторизация на сайтах через WebBrowser или POST запрос
Здравствуйте, нигде не могу найти адекватное руководство как же залогинится на сайте через...

Авторизация на сайте посредством Post запроса
Авторизация на сайте по средствам Post запроса На сайте есть форма входа: &lt;form...

Авторизация на сайте ппри помощи post-запроса
На сайте есть форма входа: &lt;td class=&quot;bc&quot;&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot;...

Авторизация на сайте методом POST через Android приложение
Необходимо проверить авторизован ли ты на сайте, дан URL ответа JSON. Пожалуйста, подкиньте хотя бы...

Авторизация mail.ru через POST-запрос
Доброго времени суток всем! Поздравляю вас с наступившим Новым Годом ;) Хотел оживить свою...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru