Есть рабочая процедура авторизации на сайт.
Код:
procedure TForm1.btn1Click(Sender: TObject);
var
stream: TStringStream;
http1: THTTPSend;
httpsend: THTTPSend;
TOKEN:string;
begin
httpsend:=THTTPSend.Create;
http1:=THTTPSend.Create;
http1.HTTPMethod('get','https://my.kyivstar.ua/tbmb/login/perform.do');
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);
if httpsend.HTTPMethod('post','https://my.kyivstar.ua/tbmb/login/perform.do') then
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-код страницы, на которую средиректило. Нашел в интернете следующую функцию, которая с виду реализует то, что мне нужно.
Код:
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'
И так далее… Я что-то не подключил? Или не поставил какой-то компонент?