Работа с броузерами

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение v-t-l » 20.07.2007 21:18:34

GET /index.html HTTP/1.0
User-Agent: Mozilla/4.05 (WinNT; 1)Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*



User-Agent обычно необязательно (если только сайт не выдает разные страницы для разных броузеров), а
Host: www.someserver.com
весьма желательно, т.к. на одном адресе обычно живут много сайтов.
И не забудь отправить пустую строку в конце запроса, а то сервер не ответит.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение bokul » 23.07.2007 23:31:46

Спасибо!

Возник вопрос: если юзать объект THttpSend модуля HttpSend, что из библиотеки synapse при подключении к соединениям, защищенных паролем (требующих авторизации при входе), необходимо ли заполнять поля UserName и Password или они предназначенные для других целей?
bokul
новенький
 
Сообщения: 45
Зарегистрирован: 16.09.2006 04:33:58

Сообщение *vmr » 23.07.2007 23:53:21

bokul
Да именно эти поля

Есть ли у Fpc уже встроенные модули или какие-нибудь сторонние библиотеки или средства системы для работы с континентом загруженной страницей (доступ к структуре страницы, возможность ее изменения), например, FireFox'a?

С контентом страницы загруженной в FF? :shock:

Если под винду то можеш использовать ActiveX - IWebBrowser, а там через IHTMLDocument2 получаеш доступ к DOM-структуре html-ки
Это легко делается под Дельфю. Как обстоят с этим дела у ФПЦ я не знаю
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Сообщение bokul » 24.07.2007 00:03:05

Да именно эти поля

Так почему же следующий код вытягивает страницу авторизации форума вместо моих новых сообщений?
Код: Выделить всё
uses httpsend,classes;
var Http:THttpSend;
    res:TStringList;
begin
     Http:=THttpSend.create;
     with Http do begin
          UserName:='bokul';
          Password:='******';//пароль
          if HttpMethod('GET','http://freepascal.ru/forum/privmsg.php?folder=inbox&sid=71aa0eac76cbe305752d29d7fa84da68') then //ссылка на "новые сообщения" моего профиля
             begin
                  res:=TStringList.create;
                  writeln(Document.size);
                  writeln(Headers.GetText);
                  res.LoadFromStream(Document);
                  res.SaveToFile('d:\res.html');
                  res.free;
             end
          else
              writeln('Error');
          destroy;
     end;
     readln;
end.



Если под винду то можеш использовать ActiveX - IWebBrowser, а там через IHTMLDocument2 получаеш доступ к DOM-структуре html-ки
Это легко делается под Дельфю. Как обстоят с этим дела у ФПЦ я не знаю

OLE в Fpc вроде не поддерживается..
bokul
новенький
 
Сообщения: 45
Зарегистрирован: 16.09.2006 04:33:58

Сообщение ev » 24.07.2007 06:21:48

Так почему же следующий код вытягивает страницу авторизации форума вместо моих новых сообщений?

потому что форум использует не HTTP авторизацию
т.е. тебе надо POST'ом отослать свои логин и пароль и только потом получишь список сообщений

следует учесть наличие редиректов и куков ;)
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение bokul » 24.07.2007 07:39:11

Просмотрел какой заголовок высылает FF:
POST /forum/login.php HTTP/1.1
Host: freepascal.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.5)
Keep-Alive: 300
Connection: keep-alive
Referer: http://freepascal.ru/forum/login.php?si ... 1d9571980b
Cookie: hotlog=1; phpbb2mysql_t=a%3A3%3A%7Bi%3A2531%3Bi%3A1185247525%3Bi%3A991%3Bi%3A1185246494%3Bi%3A2521%3Bi%3A1185247556%3B%7D; phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bi%3A-1%3B%7D; phpbb2mysql_sid=302404d2319072d29e389c1d9571980b
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
username=bokul&password=******&redirect=&login=%C2%F5%EE%E4


И в ответ:

HTTP/1.x 302 OK
Set-Cookie: phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A4%3A%221230%22%3B%7D; expires=Wed, 23-Jul-2008 03:28:13 GMT; path=/
Set-Cookie: phpbb2mysql_sid=302404d2319072d29e389c1d9571980b; path=/
Location: http://freepascal.ru/forum/index.php?si ... 1d9571980b
Connection: close


Выходит мне надо пропарсить страницу авторизации чтобы найти имена полей логина и пароля (username, password), а потом построить с их учетом запрос?
следует учесть наличие редиректов и куков

Можно ли чуть поподробнее как проходить процесс входа в систему форума?

PS если у кого-то есть пример, буду безмерно благодарен..
bokul
новенький
 
Сообщения: 45
Зарегистрирован: 16.09.2006 04:33:58

Сообщение ev » 24.07.2007 08:39:47

Выходит мне надо пропарсить страницу авторизации чтобы найти имена полей логина и пароля (username, password), а потом построить с их учетом запрос?

именно так

Можно ли чуть поподробнее как проходить процесс входа в систему форума?

это очень просто узнать самому: делаешь запрос на нужный элемент, парсишь поля логина и пароля, отправляешь POST и смотришь что в ответ :) там может быть 3 варианта:
1. сразу то что запрашивал (самый простой вариант)
2. заглушка с HTML редиректом
3. в хедере будет редирект
если 2 или 3 - просто обрабатываешь и делаешь еще один запрос
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Brainenjii » 24.07.2007 10:07:26

Ммм... Не в тему, наверное, но с Indy все проще ^_^ Правда не знаю, работает ли оно без Lazarus'a...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение ev » 24.07.2007 18:40:20

а некоторые вещи с CURL еще проще ;)
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение bokul » 27.07.2007 06:07:44

это очень просто узнать самому: делаешь запрос на нужный элемент, парсишь поля логина и пароля, отправляешь POST и смотришь что в ответ Smile там может быть 3 варианта:
1. сразу то что запрашивал (самый простой вариант)
2. заглушка с HTML редиректом
3. в хедере будет редирект
если 2 или 3 - просто обрабатываешь и делаешь еще один запрос

Спасибо!
парсишь поля логина и пароля

Опираться на названия полей? Ведь их никак нельзя иначе идентифицировать? Должен ли сервер, в случае нехватки прав клиента на указанный URL, выслать ему ответ с header'oм www-Authenticate равным Unauthorized?

2. заглушка с HTML редиректом

Это на что надо парсить? На присутствие location.replace?

3. в хедере будет редирект

Проверят не является ли URL в Location header'a ответа сервер отменным от запрашиваемого?

Ммм... Не в тему, наверное, но с Indy все проще ^_^ Правда не знаю, работает ли оно без Lazarus'a...

Так работает или нет?

а некоторые вещи с CURL еще проще

А что именно?
bokul
новенький
 
Сообщения: 45
Зарегистрирован: 16.09.2006 04:33:58

Сообщение ev » 27.07.2007 07:05:51

Опираться на названия полей?

да

Должен ли сервер, в случае нехватки прав клиента на указанный URL, выслать ему ответ с header'oм www-Authenticate равным Unauthorized?

нет, т.к. используется авторизация html (а не http)

Это на что надо парсить? На присутствие location.replace?

тэг META с редиректом

А что именно?

например работа с куками
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение bokul » 27.07.2007 07:35:16

тэг META с редиректом

Ну, это, наверное, будет работать только в случае html "замороженного" сайта, без движка или когда мета тег, прописывается в код страицы. Только что посмотрел на диалог общения моего браузера с вашим сервером при попытки получить доступ гостья к форме ответа. При запросе получить данные, находящиеся по URL формы ответа, сервер делает редирект, указывая в location header'e ответа адрес страницы авторизация пользователя.

http://freepascal.ru/forum/posting.php? ... ply&t=2521

GET /forum/posting.php?mode=reply&t=2521 HTTP/1.1
Host: freepascal.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: ...

HTTP/1.x 302 OK
Date: Fri, 27 Jul 2007 03:21:53 GMT
Server: Apache/1.3.37 (Unix) PHP/5.1.6 mod_ssl/2.8.28 OpenSSL/0.9.8d
X-Powered-By: PHP/5.1.6
Location: http://freepascal.ru/forum/login.php?re ... ply&t=2521
Connection: close
Content-Type: text/html; charset=windows-1251


нет, т.к. используется авторизация html (а не http)

Значит ли это, что запрашивая страница будет доступна ТОЛЬКО когда нету никаких редиректов (ни http, ни html, ни JavaScript) и ни в коем другом случае? Естественно не учитывая 404 ошибки и других подобных..[/quote]
bokul
новенький
 
Сообщения: 45
Зарегистрирован: 16.09.2006 04:33:58

Сообщение ev » 27.07.2007 08:19:47

Ну, это, наверное, будет работать только в случае html "замороженного" сайта, без движка или когда мета тег, прописывается в код страицы.

нет, это просто разный подход к редиректу
например, в форуме при отправке сообщения используется именно META-редирект

Значит ли это, что запрашивая страница будет доступна ТОЛЬКО когда нету никаких редиректов (ни http, ни html, ни JavaScript) и ни в коем другом случае?

ну почему же
как я привел пример выше с META-редиректом
страница будет показана и через некоторое время обновлено содержиме (либо переход на другой адрес)
с JS - аналогично, ведь он так же как и META может сработать позже... а может и вообще не сработать (в зависимости от условий скрипта)


p.s. кукисы свои не выкладываем, а то аккаунт хакнут ;)
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение bokul » 28.07.2007 04:56:54

Ну вот, код... попробовал просто сделать поддержку http и html редиректов, но какой-то баг мешает. Если стравить методу download страничку без redirect, то страничка скачивается без проблем. Если же с ним - то "400 Bad Request", хотя в трассировке четко видно как мы заходим в функции определение этого redirect'a, и что самое главное - он определяется верно...
Код: Выделить всё
{$mode ObjFpc}
uses httpsend,classes,synautil;

type
    TStatus=(HtmlRedirection,HttpRedirection,LoginPage,RequiredPage,DownloadError);

type
    TDownloadPage=class(THttpSend)
           protected
                 fNickName:string;
                 fPassWordValue:string;
                 fStatus:TStatus;
                 DocumentStrings:TStringList;
           public
                 Constructor Create;
                 function    Download(URL:string):boolean;
                 //function    Login(URL:string):boolean;
                 Destructor  Destroy; override;
           published
                 property NickName:string read fNickName write fNickName;
                 property PassWord:string read fPassWordValue write fPassWordValue;
                 property Status:TStatus read fStatus;
           public
                 NickField,PassField:string;//пока не используется
                 URL,redirect:String;

                 function AbsoluteUrl:string;
                 //function ParseForLoginFields:boolean;
                 function IsHttpRedirection:boolean;//<---проверяем присутствует ли Http Redirect, если да - сохраняем его в redirect
                 function IsHtmlRedirection:boolean;//<--- тоже самое только для Html Redirect
    end;
constructor TDownloadPage.Create;
begin
     inherited;
     fNickName:='';
     fPassWordValue:='';
     NickField:='';
     PassField:='';
     URL:='';
     DocumentStrings:=TStringList.create;
end;

function TDownloadPage.Download(URL:string):boolean;//<---проблемный метод
begin
     result:=false;
     fStatus:=DownloadError;
     if not(HttpMethod('GET',URL)) then
        exit;
     DocumentStrings.LoadFromStream(Document);
     if (IsHttpRedirection) or (IsHtmlRedirection) then begin//<---если есть Redirection
       { document.clear;
        DocumentStrings.clear;
        headers.clear; }
        result:=Download(redirect);//<---скачиваем другую страницу
        exit;
     end;
     result:=true;
     fStatus:=RequiredPage;
end;

function TDownloadPage.AbsoluteUrl:string;
var res:String;
begin
if pos('http://',Url)=0 then
   Url:=TargetHost+Url;
end;

function TDownloadPage.IsHttpRedirection:boolean;
var i:integer;
begin
     writeln('Http redirection');
     result:=false;
     for i:=0 to Headers.Count-1 do
         if pos('Location',Headers.Strings[i])<>0 then//<---если в ответе сервера есть Location хидер
            if SeparateRight(Headers.Strings[i],':')<>AbsoluteUrl then begin//<---и он не равен запрашиваемому URL, значит нас редиректнули
               result:=true;
               fStatus:=HttpRedirection;
               redirect:=SeparateRight(Headers.Strings[i],': ');
               writeln('Redirect is ',redirect);
            end;
end;

function TDownloadPage.IsHtmlRedirection:boolean;
var ind:integer;
begin
     writeln('Html redirection');
     result:=false;
     if pos('<meta http-equiv="refresh"',DocumentStrings.Text)<>0 then//тут идет парсинг файла на мета тег.
begin
        result:=true;
        fStatus:=HtmlRedirection;
        redirect:=GetBetween('URL=','"',DocumentStrings.Text);
        writeln('Redirect is ',redirect);
     end;
end;

destructor TDownloadPage.Destroy;
begin
    DocumentStrings.free;
    inherited;
end;

var Page:TDownloadPage;
begin
     Page:=TDownloadPage.create;
     with Page do begin
          Download('http://freepascal.ru/forum/posting.php?mode=reply&t=2527');
          //Download('http://freepascal.ru/forum/login.php?redirect=posting.php&mode=reply&t=2527&sid=a4623f941081cee5a8e5a19748b435f0');
          //Download('http://forum.pascal.net.ru/index.php');
          headers.add('redirect: '+redirect+#13#10);
          writeln(headers.text);
          DocumentStrings.SaveToFile('d:\document.html');//<---измените пути
          Headers.SaveToFile('d:\headers.html');//<--- и тут не забудьте..
          destroy;
     end;
     readln;
end.

Вот запакованные модули synapse необходимые для компиляции:
(blcksock.pas, synautil.pas, synaip.pas, synsock.pas, synafpc.pas, synacode.pas)
http://doomed-game.narod.ru/Untis.rar
bokul
новенький
 
Сообщения: 45
Зарегистрирован: 16.09.2006 04:33:58

Сообщение bokul » 31.07.2007 00:42:48

Так почему ответа нету? Может идеи причинности такого поведения программы есть? Буду рад любым советам!
bokul
новенький
 
Сообщения: 45
Зарегистрирован: 16.09.2006 04:33:58

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru