Новые форумы для: пользователей, администраторов, математиков и филологов.
0

Помогите разобраться с интернет-соединением в Delphi. Суть в чем, вот у меня есть ссылка с логином и паролем login/?name=имя&pass=пароль. Надо сначала перейти по этой ссылке, дабы авторизоватся на сайте, потом перейти на другую страницу того же сайта и с интервалом в 5 секунд обновлять страницу, получить её исходный код и искать в нем определенный тег, допустим, <span></span> и если он найден, то выводит соответствующее сообщение. Имя и пароль для той ссылки берутся с объектов edt1.text и edt2.text, а исходный код вывести в memo поле. Помогите с написанием этого фрагмента кода, если можно с комментариями к коду, ибо в этом разобраться надо, а не прогу на "абы отвалили" написать. Заранее спасибо!

задан 19 Фев 1:29

_Alexandr_'s gravatar image

_Alexandr_
01

изменен 22 Фев 20:26

Angry%20Bird's gravatar image

Angry Bird
609310

1
procedure TForm1.Button1Click(Sender: TObject);
var
  v: Variant;
  doc: IHTMLDocument4;
  doc2: IHTMLDocument2;
  elems: IHTMLElementCollection;
  i: Integer;
  elem: IHtmlElement;

  PersistStream: IPersistStreamInit;
  Stream: IStream;
  MemoryStream: TMemoryStream;
begin
  //CoInitialize(nil);// Если запуск будет внутри другого потока (thread'а), нужно вызывать для работы Ole объектов, rtm
  //Временный документ, для вызова метода
  doc:= CoHTMLDocument.Create as IHTMLDocument4;
  //Чтобы работали методы, нужно чтоб документ был непустой
  v:= VarArrayCreate([0, 0], varVariant);
  //html код временного документа. можно любой, он не играет роли
  v[0] := '<html></html>';
  with (doc as IHTMLDocument2) do
  begin
    //Преобразование к требуемому типу
    writeln(PSafeArray(TVarData(v).VArray));
    close();
  end;
  //Создаем документ по url. Сюда подставить надо нужный адрес
  //Предварительно стоит проверить и отэскейпить если надо логин и пароль (самостоятельно:)
  doc2:=doc.createDocumentFromUrl('http://example.com/login/?name='+Edt1.Text+'&pass='+Edt2.Text,'');
  //Ждем пока загрузится документ
  while doc2.readyState <> 'complete' do
    Application.ProcessMessages;
  //Загрузился документ
  //Выбираем все элементы по тэгу
  elems:=doc2.all.tags('span') as IHTMLElementCollection;
  //Альтернативный вариант из IHTMLDocument3 вызывать getElementsByTagName или другие необходимые методы
  //  предварительно преобразуем doc3:=doc2 as IHTMLDocument3;
  for i := 0 to elems.length - 1 do
  begin
    //Соответствующее сообщение
    MessageBox(Handle,'Span найден!!!111','Искали span',MB_OK);
    //Вдруг понадобится не только сообщать но еще что-то получить из этих элементов:
    //    elem:=elems.item(i,0) as IHTMLElement;
    //    Memo2.Lines.Add('Span найден!!!111');
    //    Memo2.Lines.Add(elem.innerHTML);
  end;

  //Сохраняем исходный текст страницы
  //Преобразуем документ к другому интерфейсу
  PersistStream := doc2 as IPersistStreamInit;
  //Поток, в который будем писать исходник
  MemoryStream:= TMemoryStream.Create;
  try
    //Создаем объект с интерфейсом IStream, он нужен для общения с интерфейсом документа
     Stream := TStreamAdapter.Create(MemoryStream, soReference) as IStream;
    //Сохраняем исходный текст документа, если не вышло, ругаемся
     if Failed(PersistStream.Save(Stream, True)) then ShowMessage('SaveAs HTML fail!') ;
    //Перемещаем позицию в потоке в начало (после записи она в конце)
     MemoryStream.Position:=0;
    //Грузим из потока в Memo1
     Memo1.Lines.LoadFromStream(MemoryStream);
   finally
    //Освобождаем память
     MemoryStream.Free;
  end;
end;

ЗЫ Первую часть - загрузку документа можно упростить с помощью TWebBrowser'а, в поисковиках полно примеров на эту тему.

ссылка

отвечен 19 Фев 4:50

Yura%20Ivanov's gravatar image

Yura Ivanov
3.0k8

Ваш ответ

Если вы не нашли ответ, задайте вопрос.

Здравствуйте

ХэшКод - это совместно редактируемый форум вопросов и ответов для начинающих и опытных программистов.

Присоединяйтесь!

отмечен:

×814
×52
×14

задан
19 Фев 1:29

показан
95 раз

обновлен
22 Фев 20:26

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии