Есть рабочая процедура авторизации на сайт.
Код:
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 | procedure TForm1 . btn1Click(Sender: TObject);
var
stream: TStringStream;
http1: THTTPSend;
httpsend: THTTPSend;
TOKEN: string ;
begin
httpsend:=THTTPSend . Create;
http1:=THTTPSend . Create;
mmo3 . Lines . LoadFromStream(http1 . Document);
TOKEN:=Copy(mmo3 . Text, Pos( 'org.apache.struts.taglib.html.TOKEN' , mmo3 . Text)+ 44 , 32 );
edt1 . Text:=TOKEN;
stream:=TStringStream . Create( '' );
stream . WriteString( 'org.apache.struts.taglib.html.TOKEN=' +TOKEN+ '&isSubmitted=true&USERNAME=&USER_NAME=&ORIG_URL=&isInetUser=null&buser=&bpath=&user=%2B38' +edt2 . Text+ '&password=435465&Submit=%C2%F5%B3%E4+%E2+%F1%E8%F1%F2%E5%EC%F3&value%28jumpTo%29=&value%28jumpToUrl%29=' );
httpsend . MimeType:= 'application/x-www-form-urlencoded' ;
httpsend . Document . LoadFromStream(stream);
begin
mmo1 . Lines . Add( '-----------------------------' );
mmo1 . Lines . Add( 'http.ResultCode=' +IntToStr(httpsend . ResultCode));
mmo1 . Lines . Add( '-----------------------------' );
mmo1 . Lines . Add( 'http.Cookies.Text=' +(httpsend . Cookies . Text));
mmo1 . Lines . Add( '-----------------------------' );
mmo1 . Lines . Add( 'http.Headers.Text=' +(httpsend . Headers . Text));
mmo1 . Lines . Add( '-----------------------------' );
mmo1 . Lines . Add( 'http.MimeType=' +httpsend . MimeType);
mmo1 . Lines . Add( '-----------------------------' );
mmo2 . Lines . LoadFromStream(httpsend . Document);
end ;
end ;
|
После успешной авторизации происходит редирект, необходимо выловить и отобразить в memo html-код страницы, на которую средиректило. Нашел в интернете следующую функцию, которая с виду реализует то, что мне нужно.
Код:
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 | function GetHTML(URL: string ): RawByteString;
var Synapse: THTTPSend;
NewUrl: string ;
n: integer ;
FStream: TMemoryStream;
temp: RawByteString;
begin
Synapse := THTTPSend . Create;
try
try
if Synapse . HTTPMethod( 'GET' , URL) then
begin
case Synapse . Resultcode of
301 ,
302 ,
307 :
begin
n := FoundLocationStrNum(Synapse . Headers, 'Location: ' );
if (n >= 0 ) and (n <= Synapse . Headers . count- 1 ) then
begin
NewUrl := StringReplace(Synapse . Headers . Strings[n], 'Location: ' , '' , [rfIgnoreCase]);
result := GetHTML(NewUrl);
end ;
end ;
200 :
begin
FStream := TMemoryStream . Create;
try
FStream . LoadFromStream(Synapse . Document);
temp := StreamToRawByteString(FStream);
SetCodePage(temp, 65001 , false );
Result := temp;
finally
FStream . Free;
end ;
end ;
end ;
end ;
except
end ;
finally
Synapse . Free;
end ;
end ;
|
Только вот если её по живому вставить в тело прогрммы – при компиляции выпрыгует кучу ошибок, которые ругаются на:
[Error] Unit1.pas(39): Undeclared identifier: 'RawByteString'
[Error] Unit1.pas(56): Undeclared identifier: 'FoundLocationStrNum'
[Error] Unit1.pas(69): Undeclared identifier: 'StreamToRawByteString'
И так далее… Я что-то не подключил? Или не поставил какой-то компонент?