Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.12.2012, 00:05
Taemin Taemin вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 45
Репутация: 10
По умолчанию Помогите подключить функцию

Есть рабочая процедура авторизации на сайт.
Код:
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'
И так далее… Я что-то не подключил? Или не поставил какой-то компонент?
Ответить с цитированием
  #2  
Старый 12.12.2012, 07:22
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Taemin
Только вот если её по живому вставить в тело прогрммы – при компиляции выпрыгует кучу ошибок, которые ругаются на:
[Error] Unit1.pas(39): Undeclared identifier: 'RawByteString'
[Error] Unit1.pas(56): Undeclared identifier: 'FoundLocationStrNum'
[Error] Unit1.pas(69): Undeclared identifier: 'StreamToRawByteString'
И так далее… Я что-то не подключил? Или не поставил какой-то компонент?
Похоже, что этот кусок написан, для более новых Delphi. По крайней мере тип RawByteString появился только в юникодных версиях Delphi (если не ошибаюсь, то начиная с Delphi 2009). В старой Delphi можешь заменить этот тип на обычный String (AnsiString) и выполнить при необходимости преобразование из UTF8 функцией Utf8Decode.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025