Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Не могу разобраться с WebBrowser...


Автор: eViperEA 18.3.2008, 06:53
Вот написал код ... для авто регистрации ... как мне сделать так чтоб все действия отображались в WebBrowser... 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl,
  IWTreeview, OleCtrls, SHDocVw, IdCookieManager;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    IdHTTP1: TIdHTTP;
    WebBrowser1: TWebBrowser;
    IdCookieManager1: TIdCookieManager;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://forum.trktvs.ru/index.php?t=index&') ;
memo1.lines.savetofile('c:\test.html');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://forum.trktvs.ru/index.php?t=index&') ;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
S: TStringList;
begin
S:= TStringList.Create;
S.Add('login=eViper');
S.Add('password=xxx');
S.Add('SQ=0');
S.Add('adm=');
memo1.Text:=IdHTTP1.Post('http://forum.trktvs.ru/index.php?t=login&', S);
memo1.lines.savetofile('c:\test.html');
end;

end.

Тоесть получается так.. На кнопку нажимаю выполнить.. он логинится и сохраняет файл что залогинился .. нажимаю на кнопку проверить (button2) он отображает что не залогинился а сохнанение в файле делает что залогинился ...  smile 

Автор: MetalFan 18.3.2008, 09:39
eViperEA, а при чем тут Indy и IWebBrowser? надо видимо "ловить" в Indy печеньки и передавать WebBrowser'у

Автор: eViperEA 18.3.2008, 10:02
я искал в DRKB там про куки менеджер нету ниче smile 
Я не знаю как "отловить" куки...  smile 

Автор: eViperEA 26.3.2008, 17:21
Я все еще пытаюсь понять как мне передать куки в WebBrowser 
Код

uses
   Registry;

 function GetDirectory: string;
 var
   reg : TRegistry;
 begin
   reg := TRegistry.Create;
   try
     reg.RootKey := HKEY_LOCAL_MACHINE;
     reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Cache\Special Paths\Cookies',
       False);
     Result := reg.ReadString('Directory');
   finally
     reg.Free;
   end;
 end;


 procedure TForm1.Button1Click(Sender : TObject);
 var
   s : string;
 begin
   S := GetDirectory;
   ShowMessage(GetDirectory);
 end;

Он вроде находит дерикторию куков но как их присвоить webbrowser'y?

Автор: MetalFan 26.3.2008, 17:52
"отловить" куки не сложно.
вариант 1. подключить кукименеджер и посмотреть, что просиходит в OnNewCookie
вариант 2. посмотреть самому в ResponseHeader'е поле set-cookie.
добавить куку в ослика тоже не сложно.
выкладывал я тут http://forum.vingrad.ru/forum/topic-186678/kw-wininet-tmfwihttp-http-client/index.html, там есть класс, работающий с кэшом ослика, в котором также лежат и куки.

Автор: eViperEA 26.3.2008, 22:08
С первым способом я не разобрался ..( когда я нажимаю 2а раза на он нью куки у меня появляется процедура ... 
Код

procedure TForm1.IdCookieManager1NewCookie(ASender: TObject;
  ACookie: TIdCookieRFC2109; var VAccept: Boolean);
begin

end;

в которой он не переваривает почему то TIdCookieRFC2109.
со вторым тоже не очень .. Пробовал в нете поискать (google.ru) 
нашел 
Код

procedure Auth;
var RequestHeader: TStringList;
var ResponseHeader: TStringList;
var Location: string;
var S: string;
var TCP: TIdTCPClient;
var Cookies: TstringList;
var Browser: TstringList
var Login,Domain,Nick,Password,Room: string;
begin

Login:=Edit3.Text;
Domain:=ComboBox1.Text;
Nick:=Edit4.Text;
Password:=Edit5.Text;
Room:=Edit6.Text;

TCP:=TIdTCPClient.Create(nil);
RequestHeader:=TStringList.Create;
ResponseHeader:=TStringList.Create;
Cookies:=TStringList.Create;
Browser:=TStringList.Create;

TCP.Port:=80;

Cookies.Clear;

Browser.Clear;
Browser.Append('User-Agent=Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.5; en) Opera 12.50');
Browser.Append('Cookie2=$Version=1');

// Первый запрос на сервер

ResponseHeader.Clear;
RequestHeader.Clear;
RequestHeader.AddStrings(Browser);
RequestHeader.Append('Content-Type=application/x-www-form-urlencoded');
RequestHeader.Append('Host=my.chat.mail.ru');
RequestHeader.Append('Referer=http://chat.mail.ru/');
S:='page=http%3A%2F%2Fchat.mail.ru%2F&FailPage=http%3A%2F%2Fchat.mail.ru%2Fdata-xml%2Ferlogin.html &enter=1812&mra=&mra_status=&Login='+Login+'&Domain='+Domain+'&Password='+ Password+'&nick='+Nick+'&nickcolor=0&textcolor=0&roomleft=&room='+Room+'&';
RequestHeader.Append('Content-Length='+IntTostr(Length(S)));
RequestHeader.AddStrings(Cookies);

TCP.Host:='my.chat.mail.ru';
TCP.Connect;
TCP.WriteLn('POST /cgi-bin/auth HTTP/1.0');
TCP.WriteHeader(RequestHeader);
TCP.WriteLn(S);

TCP.ReadStrings(TStrings(ResponseHeader));

// Проверка куков и идентификация на сервере.

RequestHeader.Clear;
RequestHeader.AddStrings(Browser);
RequestHeader.Append('Referer=http://my.chat.mail.ru/cgi-bin/auth');
RequestHeader.Append('Content-Type=text/html');

ExtractHeader(ResponseHeader,Cookies,Location);
ResponseHeader.Clear;
RequestHeader.AddStrings(Cookies);

TCP.Connect;
TCP.WriteLn('GET '+Location+' HTTP/1.0');
TCP.WriteHeader(RequestHeader);

TCP.ReadStrings(TStrings(ResponseHeader));

Cookies.Append('Cookie=Login='+Login+'; Domain='+Domain+'; nick='+Nick+'; nickcolor=0; textcolor=0; room='+Room+'; silent=0; signore=0');

RequestHeader.Clear;
RequestHeader.AddStrings(Browser);
RequestHeader.Append('Referer='+Location);
RequestHeader.Append('Content-Type=text/html');
ExtractHeader(ResponseHeader,Cookies,Location);
ResponseHeader.Clear;
RequestHeader.Append(InlineCookie(Cookies));

TCP.Connect;
TCP.WriteLn('GET '+Location+' HTTP/1.0');
TCP.WriteHeader(RequestHeader);
TCP.ReadStrings(TStrings(ResponseHeader));

S:=ResponseHeader.Text;
Delete(S,1,pos('<h2>',S)+3);
Delete(S,pos('</h2>',S),length(S));

if (S <> '') then ;// Обработчик ошибок
RequestHeader.Free;
ResponseHeader.Free;
Cookies.Free;
Browser.Free;
TCP.Free;
end;

procedure ExtractHeader(Header: TStringList; var Cookies: TStringList; var Location: string);
var I: integer;
var S: string;
begin
Location:='';
I:=0;
while (Header[I] <> '') do
begin
S:=Header[I];
if (pos('Set-Cookie:',S) = 1) then
begin
Delete(S,1,12);
Delete(S,pos(';',S),length(S));
if (Length( copy(S,pos('=',S)+1,length(S))) > 0) then
Cookies.Append('Cookie='+S);
end;
if (pos('Location:',S) = 1) then
begin
Delete(S,1,10);
Location:=S;
end;
inc(I);
end;

end;
function InlineCookie(Cookies: TStringList): string;
var I: integer;
var S: string;
begin
Result:='Cookie=';
for I:=0 to Cookies.Count-1 do
begin
S:=Cookies[I];
Delete(S,1,7);
Result:=Result+S+'; ';
end;
end;

как тут "ловить"  smile 
добавить куку в ослика тоже не сложно.  Мне прийдется работать с IE или можно в программе вставлять? в WebBrowser? smile 
А с твоим компонентом нужно еще разбираться (буду стараться)...(с первого забега ниче не понял... придется долго вникать smile ) smile  

Автор: eViperEA 27.3.2008, 07:30
с первой проблемой разобрался надо было просто в uses добавить IdCookie
А дальше пока не могу понять...(

Автор: MetalFan 27.3.2008, 09:42
смотри в моем компоненте юнит WinInet_WrapperClasses класс  TMFWinInetCacheList

Автор: eViperEA 27.3.2008, 19:15
Я нашел эту строчку...( Сложно понять smile 
Смотрел пример почти ничего не понял ...( 
Как мне этим воспользоваться не представляю... 
Поясни пожалуйсто ато голова кипит...

Автор: eViperEA 31.3.2008, 14:09
Вот нашел как добавлять куки но не знаю по чему у меня он не хочет работать ... 
Код

procedure TwebDispatcher.WebAction(Sender: TObject; Request: TWebRequest; 
  Response: TWebResponse; var Handled: Boolean);
begin
  with (Response.Cookies.Add) do
  begin
    name := 'TESTNAME';
    Value := 'TESTVALUE';
    Secure := False;
    Expires := Now;
    Response.Cookies.WebResponse.SendResponse;
  end;
end;

Подчеркивает WebAction, TWebRequest, TWebResponse, name, Value, Secure, Expires, Cookie.Add,  
Cookies.WebResponse.SendResponse
Помогите пожалуйста...

Автор: MetalFan 31.3.2008, 15:15
кто такой WebDispatcher?

Автор: eViperEA 31.3.2008, 16:08
ok поставил его на форму=) сори 
но WebAction все равно подчеркивает smile 

Автор: eViperEA 31.3.2008, 19:43
Написал вот так ...
 
Код

procedure TForm1.WebDispatcher1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
with (Response.Cookies.Add) do
  begin
    name := 'TESTNAME';
    Value := 'TESTVALUE';
    Secure := False;
    Expires := Now;
    Response.Cookies.WebResponse.SendResponse;
  end;
end;

теперь как с помощью этого из HTTP в веб кинуть ... Помогите мне я разобраться никак не могу..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)