Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6   вперед  Ctrl      все
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
В общем, не так всё просто. Там куча событий используется и обрабатывается, в том числе и движение курсора мышки внутри фрейма.
11 ноя 19, 14:14    [22013566]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
alfangur
Member

Откуда:
Сообщений: 10
X11, посмотрите в сторону nwjs или electron либо другую реализацию в виде headless
так вы избавитесь от кучи костылей и получите актуальную версию браузера со всеми новыми фишками V8\JS и т.д.

как вариант:
- запускаете nwjs\eletron\headless приложение
-- окно скрыто по умолчанию, его всегда можно показать при необходимости либо показать нужную часть
- передаете адрес который необходимо посетить
-- получаете уведомление о полной загрузке страницы
- получаете код всей страницы
- выполняете необходимые действия на сайте

P.S. если задач не много могу оказать помощь
11 ноя 19, 22:21    [22013969]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.
11 ноя 19, 23:53    [22014019]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
X11
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.

Электрон это тот же хромиум. Но Дельфи там, разумеется, никаким боком не применяется. Разве что FPC-шный pas2js присобачить

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

Еше бы ))) вопрос был из серии "банкомат требует пин-кода карточки, на что нажать, чтобы его не вводить?"

Сообщение было отредактировано: 12 ноя 19, 11:39
12 ноя 19, 11:37    [22014257]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Василий 2, не понял, и что?

Ещё раз. Я ничего не нашёл в сети по nwjs + delphi.

Мне что, самому нужно писать обёртку вокруг nwjs?
12 ноя 19, 11:41    [22014263]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
На сколько я понял, то Electron и nwjs - это для создания приложений, чтобы отображать веб-контент.
У меня задача немножко другая. Мну нужно парсить сайты.
12 ноя 19, 11:49    [22014282]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
Electron это движок браузера без обвязки, соответственно он позволяет писать приложения на html+js. Ну и отображать сайты, разумеется.
Но в общем случае CEF не имеет особых недостатков по сравнению с предложенным вариантом. Разве что вот каптчу обмануть... можно попробовать мышью над страницей "пошевелить". Но это опять же, с наскоку обмануть кодеров Гугла разве что гений сможет
12 ноя 19, 14:29    [22014513]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

А у меня браузер работает в потоке, без окон. При чем класс, в котором создаётся и работает парсер и сам браузер не имеет доступа к модулю потока.
Я читал и смотрел примеры по Winapi.Messages в потоках, но там всё основано на том, что код обмена сообщениями находится непосредственно в модуле (в pas-файле) самого потока, в Thread.Execute.

Нет ли более менее простого способа, чтобы заменить Winapi.Messages на что-то другое?

К сообщению приложен файл. Размер - 30Kb
17 янв 20, 12:14    [22061479]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
В потоке вполне себе может быть окно, в чем проблема-то?
17 янв 20, 14:15    [22061595]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
вот в чем

X11
Я читал и смотрел примеры по Winapi.Messages в потоках, но там всё основано на том, что код обмена сообщениями находится непосредственно в модуле (в pas-файле) самого потока, в Thread.Execute.


вот пример
https://rsdn.org/forum/delphi/3112311.hot

procedure TMsgThread.Execute;
var
  msg: TMsg;

begin
  while not Terminated do begin
    if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then begin
      case msg.message of
         WM_USER: Synchronize(Answer);
      end;
    end;
  end;
end;


а мой код работает далеко не в TMsgThread.Execute.
17 янв 20, 14:28    [22061616]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля. Или вообще создаешь окно, в конструкторе либо до запуска задавай объект-заглушку, а при получении сообщения вызывай TObject.Dispatch. Преимущество тут в том, что не надо писать WndProc метод, можно задать обработчики как TMsgHandler.Msg_That(var Message); message MSG_THAT
17 янв 20, 16:02    [22061700]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 480
X11,
Что за код? Выложи?
17 янв 20, 16:53    [22061748]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
ziv-2014, код именно чего?
17 янв 20, 16:58    [22061754]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
В общем, я посмотрел пример использования компоненты TCEFUrlRequestClientComponent.
Добавил модуль TCEFUrlRequestClientComponent и в событии Chromium1.OnResourceResponse запускаю процедуру скачивания, типа:

  s := UTF8ToString(request.Url);

// вылавливаем нужный URL
  if s.ToLowerInvariant.Contains(fResponsePath.ToLowerInvariant) then
    DownloadRequestDataStart(s);
17 янв 20, 17:01    [22061757]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 480
X11
ziv-2014, код именно чего?

Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

Получения ответа response
17 янв 20, 17:02    [22061758]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Ещё один вариант мне предложили.
Где-то, в какой-то момент с пом. JS скачивать ещё раз тело ответа и внедрять его прямо в HTML, чтобы парсер видел прямо в теле страницы нужные данные.
17 янв 20, 17:11    [22061768]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
ziv-2014
X11
ziv-2014, код именно чего?

Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

Получения ответа response


так это стандартный пример, см в папке
CEF4Delphi\demos\Delphi_VCL\ResponseFilterBrowser
17 янв 20, 17:12    [22061770]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Василий 2
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля.


Дело в том, что у меня как раз всё в другом модуле и работает.
В модуле создания и запуска потока только одно действие в Execute - создание объекта (класса) парсера и старт этого парсера.

В методе Execute нет никаких while ... repeate ... terminate.
Просто выполнить один проход и завершить поток.

вот пример старта парсинга:

type
  TDlThreadXXXXX = class(TDlThread)
  private
    Parser: TParseXXXXX;

  public
    procedure Execute; override;
  end;
  
...
...
...

procedure TDlThreadXXXXX.Execute;
begin

//создать объект класса парсера  
  Parser := TParseXXXXX.Create(proxy, ProfId);

  try
    self.ParserAd           := Parser;
    Parser.OnProgress       := OnSiteParseProgress;

    Parser.ProfileID        := ProfId;
    Parser.StartURL         := StartUrl;

    synchronize(GetfmMainCaption);

    try
        Synchronize(ShowBaloonStartProcess);// уведомление
		
// старт парсинга
        if not Parser.DownloadInProcess then
          Parser.DoParse;

        Synchronize(ShowBaloonEndProcess);// уведомление

    except
      on e:exception do
        raise;

    end;// try except

  finally

    if assigned(Parser) then
    begin
      Parser.Free;
      Parser := nil;
    end;

    if Assigned(dltXXXXX) then
    dltXXXXX := nil;
  end;//try finally
end;


вот там, внутри, под капотом у Parser.DoParse и работает Хромиум.

Т.е. не в этом модуле нужно создавать окно AllocateHWnd и обработку сообщения (PeekMessage), а именно в модуле Parser: TParseXXXXX??? Я правильно понимаю?
22 янв 20, 13:10    [22064345]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Или где-то внутри Parser: TParseXXXXX нужно создавать ещё один "внутренний" поток и в нем запускать цикл ожидания, получения и обработки сообщений?
22 янв 20, 13:46    [22064367]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
Ну стало быть надо залезать внутрь DoParse. Я не очень понял, как у тебя хромиум может "работать через сообщения", если ты его засовываешь в цикл.
Обычная схема работы с выборкой сообщений в потоке - в Execute:

while not Terminated and GetMessage(Msg, 0, 0) do
case Msg.message of
  MSG_1: ...
  MSG_2: ...
end;


Как там устроен парсер - по названию функции сложно сказать, нужно больше деталей
22 янв 20, 18:09    [22064637]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
В DoParse организован тупо цикл whilte true по страницам сайта.


Василий 2
. Я не очень понял, как у тебя хромиум может "работать через сообщения",


А он у меня и не работает через сообщения. Я ж написал вроде, что это в официальном примере получение response-содержимого через сообщения реализовано.
Если у вас установлен Хромиум в Дельфи, откройте и посмотрите (CEF4Delphi\demos\Delphi_VCL\ResponseFilterBrowser).

А у меня Хромиум скачивает странички примерно так:
function TChrom.GetInnerHTMLPage(const url: string): string;
begin
  if fParseAD.MyProgressMsg.Stop then exit;

// обнуляем переменные
  bIsLoadingPage := True;// указываем, что страница грузится, см. ChromiumProcessMessageReceived()
  sInnerHTMLPage := '';
  iFinishedHTMLCount := 0;

// старт процесса загрузки и рендеринга, ответ ждать в ChromiumProcessMessageReceived()
  CefGetUrl(Chromium, url, fParseAD.ProfileName);

// ждём, пока грузится страница в процессе рендеринга
  while bIsLoadingPage do
  begin
    Sleep(3000);

    if fParseAD.MyProgressMsg.Stop then
      break;//выходим из цикла

  end;

  result := sInnerHTMLPage;
end;

Ну там ещё около 10+ разных событий и вспомогательных методов.


Вот я и хочу пример из ResponseFilterBrowser применить для себя.
Может быть есть возможность заменить сообщения на другой вид обмена, т.к. фактически скачивание и получение response-содержимого живет в одном классе, в одном модуле.

Сообщение было отредактировано: 23 янв 20, 15:45
23 янв 20, 15:45    [22065322]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Я думаю, что отправку сообщения самому себе можно заменить процедурой ожидания, где будет цикл while true, как в вышеописанном методе GetInnerHTMLPage
23 янв 20, 16:06    [22065344]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
Да, в примере PostMessage просто чтобы не блокировать форму, в случае потока можно заменить на вызовы соответствующих функций
23 янв 20, 16:43    [22065376]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Я так и не разобрался, что это за WasHidden
Chromium.WasHidden(True);

но если вызывать этот метод, то не все ссылки и не вся страничка грузится
просто имейте ввиду


  if Chromium.Initialized then
  begin
    Chromium.WasHidden(True);
    Chromium.LoadURL(url);
  end
  else
  begin
    Chromium.CreateBrowser(nil);
    Chromium.WasHidden(True);
    Chromium.LoadURL(url);
  end;


Сообщение было отредактировано: 29 янв 20, 17:29
29 янв 20, 17:23    [22068887]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Док
Member

Откуда: Казань
Сообщений: 6538
X11,

так красивше
if not Chromium.Initialized then Chromium.CreateBrowser(nil);
Chromium.WasHidden(True);
Chromium.LoadURL(url);
29 янв 20, 18:08    [22068936]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6   вперед  Ctrl      все
Все форумы / Delphi Ответить