![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
![]()
Этой темой я открою цикл ответов и объяснений самых распространенных проблем, с которыми сталкиваются программисты Delphi при написании программ, которые должны взаимодействовать с удаленными WEB сайтами.
Итак, у нас стоит задача при работе своей программы авторизоваться на неком удаленном сайте. Для простейшего примера я взял портал mail.ru Зарегистрировал там пользователя programmers с паролем 1234 Итак, сначала немного теории: Авторизация на любом сайте происходит путем заполнения формы и отправки её данных некому удаленному крипту методом POST. На самом деле после того как вы заполнили формы и нажали на кнопку, данные отправятся в виде простой строки, содержащей все параметры и их значения разделенные разделителем. Все формы на страницах описываются тегом <form> имеющим достаточное кол-во параметров, приведу самые нужные для нас: Параметр method Значение параметра method не зависит от регистра. Различают два метода — GET и POST. Существуют и другие методы, но они пока мало используются. GET Этот метод является одним из самых распространенных и предназначен для получения требуемой информации и передачи данных в адресной строке. Пары «имя=значение» присоединяются в этом случае к адресу после вопросительного знака и разделяются между собой амперсандом (символ &). Удобство использования метода GET заключается в том, что адрес со всеми параметрами можно использовать неоднократно, сохранив его, например, в «Избранное» браузера, а также менять значения параметров прямо в адресной строке. POST Метод POST посылает на сервер данные в запросе браузера. Это позволяет отправлять большее количество данных, чем доступно методу GET, поскольку у него установлено ограничение в 4 Кб. Большие объемы данных используются в форумах, почтовых службах, заполнении базы данных и т.д. Параметр Action Указывает обработчик, к которому обращаются данные формы при их отправке на сервер. В качестве обработчика может выступать CGI-программа или HTML-документ, который включает в себя серверные сценарии (например, Parser). После выполнения обработчиком действий по работе с данными формы он возвращает новый HTML-документ. Если параметр action отсутствует, текущая страница перезагружается, возвращая все элементы формы к их значениям по умолчанию. (Описания параметров предоставлены сайтом htmlbook.ru) Итак, заходим на сайт Mail.ru и смотрим исходный код страницы. Ищем тег "<form" Разумеется, на странице может быть множество форм, но необходимая нам достаточно интуитивно понятно находится: Цитата:
Итак, вот мы получили форму: Код:
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи Последний раз редактировалось Квэнди; 24.03.2009 в 08:17. |
|
![]() |
![]() |
![]() |
#2 | ||||
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
![]()
На сервер могут отправится только значения элементов формы, которым относятся:
Тег input который отвечает за ввод информации и может принимать множество видов и вариантов. Вплоть до выбора файла, но об этом уже в следующих темах. Внимание, ВСЕ теги Input лучше заполнять перед отправкой, поэтому обращайте внимание на теги Input с параметром type, имеющим тип type="hidden". Более конкретно о них я расскажу в конце. Тег <select> отвечает за выбор элемента из фиксированного списка. Внутри тега <select> должны присутствовать теги <option> каждый из которых описывает один из параметров списка. Выбранный элемент списка отображается свойством selected тега option но для нас это малоинтересно, нам гораздо интересней параметр value тега option, который отражает именно тот текст, который будет отправлен на сервер при выборе этого элемента. Ну вот собственно и все, теперь соберем всю необходимую нам информацию воедино: Адрес, на который мы должны отправить запрос, чтобы авторизоваться мы берем из параметра action тега <form> Цитата:
Код:
Код:
Код:
Код:
Теперь перейдем к Delphi. Создадим новый проект. "Бросим" на форму компонент IdHTTP из вкладки Indy Clients и кнопку. теперь настроим наш компонент IdHTTP. Поставим параметр AllowCookies в True (оговорюсь сразу: это на всякий случай, ибо далеко не всегда после авторизации и во время её задействованы cookies) Выставим параметр HandleRedirects в True (вы можете и оставить этот параметр в False, но в этом случае рискуете после авторизации получить сообщение о просто успешном выполнении запроса, которое совершенно не говорит об успешности авторизации, либо о том, что был обнаружен redirect) Этот параметр позволяет IdHTTP в случае получения директивы http redirect следовать этому перенаправлению. Дело в том, что в большинстве случаев скрипты, которые авторизую пользователя, после авторизации перенаправляют его на некую страницу, поэтому нам гораздо интересней узнать именно её текст. Собственно и все, больше никаких параметров нам не потребуется. Теперь напишем обработчик нажатия на кнопку: Код:
сначала нам необходимо создать список параметров, которые мы будем передавать серверу для успешной авторизации. Выше мы уже выделили все необходимые поля, которые нам надо заполнить. Создадим список: Код:
<параметр>=<значение> Значение ни в какие кавычки заключать не надо. Код:
так как именно этот текст стоял в значении параметра value нужного нам тега option: Цитата:
Цитата:
Цитата:
Код:
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи Последний раз редактировалось Квэнди; 21.03.2009 в 00:31. |
||||
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
![]()
К сообщению я прикрепил описанный проект:http://programmersforum.ru/attachmen...5&d=1234643278
среда: Delphi 2009 Версия Indy: 10.2.5
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 12.11.2008
Сообщений: 124
|
![]()
Огромное спасибо, превосходная статья
![]() |
![]() |
![]() |
![]() |
#5 |
Регистрация: 25.05.2009
Сообщений: 4
|
![]()
Огромное спасибо, изумительная статья, понятная даже для ламеров.
Но, не могли бы Вы еще помочь с TWebBrowser, как там отправлять postdata? Заранее огромное спасибо, и я эту статью повешаю на стену, как вечную памятку. |
![]() |
![]() |
![]() |
#6 |
Delphi,Python,PHP
Форумчанин
Регистрация: 04.04.2009
Сообщений: 138
|
![]() Пример авторизации на сайте с помощью idHTTP.Post Несмотря на то, что все мои заготовки статей канули в Лету вместе с другими данными (в том числе исходниками), которые были на флешке, я не пала духом и попытаюсь написать что-нибудь полезное заново. Сегодня расскажу, как использовать idHTTP.Post для авторизации на сайте. Я возьму для примера сайт LiveJournal.com. Немного теории для начинающих. Итак, вызов метода Post компонента idHTTP отличается от вызова Get-а только тем, что помимо URL-а необходимо передать параметры. Параметры можно передавать в виде StringList-а, или каких-нибудь Stream-ов, или чего-нибудь еще подходящего.) Пример Post-процедуры (параметры передаются в виде StringList-а): Код:
Пример Post-функции (параметры передаются в виде IdMultiPartFormDataStream-а): Код:
Сейчас попробуем применить полученные знания. Идем на LiveJournal.com, включаем сниффер, логинимся на сайте и смотрим, какие параметры надо передавать ('mode=login', 'user=логин', 'password=пароль'). Авторизация не произойдет, если на стороне клиента не будут сохранены кукисы. Для сохранения кукисов среди компонентов Indy существует TidCookieManager. IdCookieManager подключается к idHTTP через свойство CookieManager. idHttp.CookieManager := IdCookieManager; В этом случае при запросах в заголовок добавляются кукисы, автоматически сохраненные в IdCookieManager. IdCookieManager можно найти на закладке Indy Misc или создать динамически. ![]() Поместим на форму 2 TEdit-а, TMemo и кнопку, на которую повесим следующий работающий код авторизации: Код:
Возвращенные заголовки (после ответа сервера) можно посмотреть так: Код:
Сохраненные в CookieManager-е кукисы можно посмотреть так: Код:
Вот что записал туда LiveJourmal.com: ![]() Ну вот впринципе и всё, спасибо за внимание!
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Восстановление удаленных файлов | Rio309 | Компьютерное железо | 9 | 17.11.2011 13:35 |
О сайтах | shv-dr | Софт | 1 | 12.11.2008 09:53 |
Восстановление удаленных записей InterBase | Vinas | БД в Delphi | 3 | 05.12.2007 10:29 |
Администрирование\управление компьютером\Общие папки\Общие ресурсы\прекратить общий доступ | lm_strj | Безопасность, Шифрование | 2 | 13.10.2007 21:28 |