Страница: 1 | 2 | 3 | 4 |
Вопрос: Залогиниться к Mail.Ru из VB
Добавлено: 19.09.04 21:25
Автор вопроса: Comanche
Ответы
Всего ответов: 46
Номер ответа: 16
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #16
Добавлено: 22.09.04 18:30
Pavel дал правильный ответ на твой вопрос. От себя добавлю: изучайте люди НТТР и меньше спрашивайте, тогда авторизация на мейл.ру не будет для вас дилемой.
Беру "Тестер" и отсылаю пакет:
-------------------
POST http://auth.mail.ru/cgi-bin/auth HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
Referer: http://win.mail.ru/cgi-bin/splash
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: auth.mail.ru
Content-Length: 40
Pragma: no-cache
Cookie: p=wrYEAGDPxgAA; t=obLD1AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAABELxAcA; c0=XNVwQgAAAAB10wEAAAAA; Mpop=1094310579:057d6503505d584619050219091d011b03050a4f6a5d5e465e0404031b00757f1f555d4c545d03115c565c5b1b4341:blume2@mail.ru
Login=blume2&omain=mail.ru&Password=123
-----------------
Получаю вполне реальный ответ без перенаправления:
-----------------
HTTP/1.1 200 OK
Date: Wed, 22 Sep 2004 14:24:07 GMT
Server: Apache/1.3.27 (Unix) mod_perl/1.27 rus/PL30.17
Pragma: no-cache
Cache-Control: no-cache, no-store
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Frontend-key: 194.67.57.149
Connection: close
Content-Type: text/html; charset=windows-1251
Last-Modified: Wed, 22 Sep 2004 14:24:07 GMT
-----------------
и дальше идет тело страницы, где меня просят заново ввести пароль.
Так в чём проблема???
Номер ответа: 17
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #17
Добавлено: 22.09.04 19:59
Проблема в том, что аналогичные действия у меня не увенчались успехом, и с учётом твоего последнего ответа я теперь точно не понимаю, в чём причина. Ладно, буду ковыряться. Другой вопрос: как я понимаю - поправьте, если ошибаюсь - из-за того, что в пакете содержится "кука", я не могу просто запихнуть этот пакет "как константу" в код своей программы, рассчитывая при этом, что программа запустится и на другом компьютере тоже. Так?! ведь "кука" - это файлик, и в теле пакета (после слова "Cookie:" наверняка идёт ссылка на конкретное имя этого файла. А на другом компе этого файла уже не будет... значит ли это, что файл "куки" я должен найти и затем как-то таскать вместе со своей прогой?!
И ещё: может, отключить на своём компе поддержку "куков", очистить папку с ними, а затем попробовать залогиниться с "перехватом"? м.б. строка подключения будет другой?
Номер ответа: 18
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #18
Добавлено: 22.09.04 21:55
Во первых, действительно, когда логиниться с правильным паролем, тогда сервер отвечает редиректом, нужно следовать по ссылке, указанной в ответе сервера.
Во вторых, куки разные браузеры сохраняют в файл, а при потребности передают в НТТР пакетах. Надеюсь понятно?Нет?Куки НЕ могут ни на что указывать, ето просто набор "переменная=значение" и все.
Номер ответа: 19
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #19
Добавлено: 22.09.04 21:59
P.S. куки можно ваще убрать, и не парить себе голову. Пусть майл.ру думает, что ты отключил куки в браузере.
Номер ответа: 20
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #20
Добавлено: 23.09.04 13:00
Может если кука есть то выдается страница X, а если нет - Y?
Номер ответа: 21
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #21
Добавлено: 23.09.04 16:48
2DaSharm: Небольшая "подвижка" есть. Я отключил поддержку куков и очистил их папку. После этого перехватил твоим отладчиком исходящий пакет - и в нём действительно уже нет блока "Cookie:". В итоге, пакет получился более читаемым. Я отправил его на MAIL.RU и - о чудо! - наконец-то не возникло никаких ошибок: я получил страницу, что "document has moved here". Причём если по ссылке "here" щёлкнуть мышью, то я попадаю в свой почтовый ящик. Это прекрасно, но вот как мне "щёлкнуть" ИЗ КОДА? Допустим, я тоже запишу пакет, отправляемый этим щелчком, но вот как передать его из кода "вместе" с первым? (просто сразу после первого?!) да и в этой ссылке сидит (вроде бы) опять ссылка на куку (почему?)
Номер ответа: 22
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #22
Добавлено: 23.09.04 16:55
Да, просто отправь ещё один НТТР пакет после первого. А кука в ссылке сидеть не может, это кошмар был бы какой-то
Номер ответа: 23
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #23
Добавлено: 23.09.04 19:43
Но этот второй пакет я, похоже, не могу просто записАть и потом использовать повторно: эта ссылка ("here" выглядит примерно так: http://www.mail.ru/.../checkcookie?id=<xxx>, где <xxx> - довольно длинная последовательность каких-то символов, раз от раза меняющаяся. Т.е. один раз щёлкнув по ней вручную и записав этот пакет, я потом вряд ли смогу использовать этот же пакет повторно. Как быть?
Номер ответа: 24
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #24
Добавлено: 23.09.04 20:10
Я посмотрел ещё раз на этот пакет, полученный с MAIL.RU, - помимо фразы "document has moved here" там есть ещё одна особенность: редиректный URL содержится как в тэге <TITLE>, так и в тэге <BODY> - в единственном его тэге <A>. В принципе, можно просто выделить URL оттуда, а потом ShellExecute "open", .... - и вот он доступ к ящику. Но... как-то это неправильно ("некрасиво", по-моему. Что скажешь?
И ещё: почему всё-таки после удачной передачи первого пакета я не логинюсь в ящик СРАЗУ, а попадаю на эту чёртову "редиректную" страницу? типа это защита MAIL.RU? от чего? можно ли как-то это обойти и попадать в ящик сразу?
Номер ответа: 25
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #25
Добавлено: 23.09.04 21:39
Попадать сразу не выйдет, я думаю. А редирект ещё должен быть в одном из полей НТТР ответа сервера, все что тебе нужно, это вытащить из нужного поля ссылку и использовать по своему усмотрению. А "некрасиво" здесь не к месту, иначе просто никак, мы действуем так, как ситуация требует
Номер ответа: 26
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #26
Добавлено: 23.09.04 23:41
В ответе сервера и правда есть поле "Location", где после двоеточия идёт тот же самый URL. Только вот это поле существует в пределах серой таблички, которая расположена ДО тэгов <HTML>, в самом начале ответа. Я вот не пойму: это сам Mail.Ru так отвечает, или же эту табличку твоя прога в начало приклеивает? Просто если это твоя прога, то мне в своей это поле "Location" не получить никак )
Номер ответа: 27
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #27
Добавлено: 24.09.04 13:25
Вроде разобрался. Не посмотришь код?
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
 ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Dim Packet As String
Private Sub Form_Click()
Winsock1.Close
End Sub
Private Sub Form_Load()
 im Login As String, Password As String
 im cLength As Integer ' << длина самой последней строки пакета
Login = "XXXXX"
Password = "YYYYYY"
cLength = 39 + Len(Login) + Len(Password)
Packet = _
"POST http://win.mail.ru/cgi-bin/auth HTTP/1.0" & vbCrLf & _
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*" & vbCrLf & _
"Referer: http://www.mail.ru/" & vbCrLf & _
"Accept-Language: ru" & vbCrLf & _
"Content-Type: application/x-www-form-urlencoded" & vbCrLf & _
"Proxy-Connection: Keep-Alive" & vbCrLf & _
"Host: win.mail.ru" & vbCrLf & _
"Content-Length: " & CStr(cLength) & vbCrLf & _
"Pragma: no-cache" & vbCrLf & vbCrLf & _
"Mpopl=1&Login=" & Login & "&omain=mail.ru&Password=" & Password
' Примечание: строчку
' "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MRA 3.0 (build 00614))" & vbCrLf & _
' из пакета выкинул - хуже на стало )
'
' А вот величину "Mpopl" приравнял единице наобум - и тоже вроде прокатило...
Winsock1.Close
Winsock1.LocalPort = 0
Winsock1.Connect "mail.ru", 80
End Sub
Private Sub Winsock1_Close()
 ebug.Print ">> Closed."
End Sub
Private Sub Winsock1_Connect()
 ebug.Print ">> Connected!"
Winsock1.SendData Packet
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
 im strData As String, fN As Integer
 im Location As String, pos As Long
Winsock1.GetData strData
 ebug.Print ">> Server response:"
 ebug.Print strData
fN = FreeFile
Open App.Path + "\Response.html" For Binary Access Write As #fN
Put #fN, , strData
Close #fN
pos = InStr(1, strData, "Location:"
If pos > 0 Then
' Наверное, сервер ответил редиректом
Location = Mid$(strData, pos + 10, InStr(pos, strData, vbCrLf) - pos - 10)
ShellExecute Me.hwnd, "Open", Location, "", "", 1&
Else
' просто открываем Response.html
ShellExecute Me.hwnd, "Open", App.Path + "\Response.html", "", App.Path, 1&
End If
End Sub
Private Sub Winsock1_SendComplete()
 ebug.Print ">> Send complete!"
End Sub
======================================================================================================
Нет ли каких "ляпов" с моей стороны?
И ещё вопрос:
Winsock1.Connect "mail.ru", 80 - работает, а вот
Winsock1.Connect "www.mail.ru", 80 или
Winsock1.Connect "http://www.mail.ru", 80 - НЕ РАБОТАЕТ.
ПОЧЕМУ?
Номер ответа: 28
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #28
Добавлено: 24.09.04 13:55
В принципе все правильно, а www.mail.ru может не быть сопоставлено с АйПи адресом. "http://www.mail.ru" использовать нельзя, так, как "http://" не может быть составной частью домена.
Номер ответа: 29
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #29
Добавлено: 24.09.04 15:07
Т.е. в ОБЩЕМ случае мне нужно всегда выделять из URL'а "доменную часть", так? ну или иметь URL заданный в виде явного IP...
Кстати, у меня в этом коде есть строчка "Наверное, сервер ответил редиректом". Чтобы не "гадать", мне посоветовали воспользоваться следующей информацией:
http://www.vbip.com/winsock/winsock_http_07_01.asp
Там чётко расписано, как точно определить, был редирект или нет. Так что реализую это в своём коде.
Ещё вопрос:
Мне кажется, что код события Winsock1_DataArrival написан у меня неверно - я в нём предполагаю, что весь ответ придёт "одним куском". А ведь вроде как надо накапливать ответы, полагая, что это событие может отработать более одного раза... или нет?
Номер ответа: 30
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #30
Добавлено: 24.09.04 16:17
[q]весь ответ придёт "одним куском"[/q]
Для определения конца данных используй поле Content-Length в НТТР ответе сервера. Там указано количество байт в странице.