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

Откуда: Kharkiv, Ukraine
Сообщений: 13864
JaDi
CEF полностью поддерживает querySelectorAll.


CEF4Delphi поддерживает внедрение JS в страничку
21954002
1 сен 19, 09:52    [21961401]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
JaDi
Это же жесть -- вручную перебирать всю структуру DOM.


Хорошо. А как получить в свою программу из документа определённый контент, содержимое той или иной ноды? Но без установки доп. расширений в CEF.
2 сен 19, 10:24    [21961665]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4132
X11
JaDi
Это же жесть -- вручную перебирать всю структуру DOM.


Хорошо. А как получить в свою программу из документа определённый контент, содержимое той или иной ноды? Но без установки доп. расширений в CEF.

Это риторический вопрос в стиле "как из процедуры вернуть результат, не преобразовывая ее в функцию". Хром -- асинхронный. Чтобы что-то из него получить, необходимо дождаться результата. Это можно сделать разными способами -- от eval и extention до вечного while в ожидании появления новых данных в скрытом dom-элементе. См. примеры в "\demos\Delphi_VCL\JavaScript", как там значения возвращаются.
2 сен 19, 11:30    [21961727]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Если вы загружаете скрипт из файла в кодировке UTF-8, то не забудьте перед его внедрением в CEF конвертировать в string:
s := UTF8ToString(RawByteString(sJsScript));
4 сен 19, 12:30    [21963276]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Я правильно понимаю, что
GlobalCEFApp := TCefApplication.Create;

Создаётся глобально для всей системы, а не только для моей программы и тем более не только для доп. потока(ов) приложения?

Я про то, что когда TChromium (PID_BROWSER) и процесс рендерига (PID_RENDERER) обмениваются между собой сообщениями
frame.SendProcessMessage();

в сообщении нужно конкретизировать как-то - что и кому предназначено?

Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?
5 сен 19, 13:06    [21964474]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
ведь процесс создания браузера запускается из DPR файла, т.е. непосредственно ещё до старта моего приложения

procedure CreateGlobalCEFApp;
begin
//вызов CreateGlobalCEFApp() происходит в dpr

  GlobalCEFApp                            := TCefApplication.Create;
  GlobalCEFApp.OnProcessMessageReceived   := GlobalCEFApp_OnProcessMessageReceived;
  GlobalCEFApp.WindowlessRenderingEnabled := True;
  GlobalCEFApp.EnableHighDPISupport       := True;
  GlobalCEFApp.DisableFeatures            := 'NetworkService,VizDisplayCompositor';
  GlobalCEFApp.FrameworkDirPath           := '...';
  GlobalCEFApp.LocalesDirPath             := '...';
  GlobalCEFApp.ResourcesDirPath           := '...';
  GlobalCEFApp.LogFile                    := '...';
end;


Получается, что процедура GlobalCEFApp_OnProcessMessageReceived ловит сообщения от всех экземпляров TChromium из разных потоков приложения?

Каждый отдельный поток парсит свой отдельный сайт.
Нормально ли будет работать браузер?
Первый поток Chromium1.LoadURL(...);
Загрузка этого сайта даже не завершилась, а тут
Второй поток Chromium2.LoadURL(другой сайт);

нормально ли завершиться загрузка первого сайта?
5 сен 19, 13:14    [21964484]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4132
Конечно нормально. Там же асинхронное всё, да еще и в своих собственных процессах крутится.
5 сен 19, 13:31    [21964516]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
X11
Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?


как правильно? или нет разницы?
5 сен 19, 13:32    [21964519]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Просто я собираюсь использовать Chromium в headless режиме и там не будет TCEFWindowParent.

Вот если в приложении несколько вкладок или пользователь сам создает вкладки, как это в классическом браузере, то достаточно одного экземпляра Chromium, как я понимаю?
Просто будет вот так:
Chromium1.CreateBrowser(CEFWindowParent1, '');
Chromium1.CreateBrowser(CEFWindowParent2, '');
Chromium1.CreateBrowser(CEFWindowParent3, '');


Но у меня-то не будет разных CEFWindowParent.
5 сен 19, 13:39    [21964536]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4132
CEFWindowParent1 -- это визуальный компонент, где будет идти отрисовка конкретного экземпляра браузера. В соседней же теме было, что для работы в безрендеринговом режиме можно туда nil передавать.

Для потоков должен быть свой собственный браузер TChromium.Create
5 сен 19, 14:00    [21964571]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
JaDi
CEFWindowParent1 -- это визуальный компонент, где будет идти отрисовка конкретного экземпляра браузера. В соседней же теме было, что для работы в безрендеринговом режиме можно туда nil передавать.


это я всё знаю уже давно
5 сен 19, 14:09    [21964579]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
JaDi
Для потоков должен быть свой собственный браузер TChromium.Create


Вы не понимаете мои вопросы?
5 сен 19, 14:09    [21964582]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4132
X11
Вы не понимаете мои вопросы?


Ответ был на это:
автор
Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?
5 сен 19, 14:16    [21964592]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Возникла проблема в реальной программе.
Программа защищается с помощью ASProtect SKE.
Т.е. где-то в какой-то форме, которая создается по кнопке есть использование сторонней dll.
Так вот, при инициализации CEF`а происходит исключение (exception).
Хотя строка инициализации CEF`а
CreateGlobalCEFApp;

идёт самой первой после begin в dpr.

Как обойти проблему?

На всякий случай прикреплю код получения HardwareID
uses aspr_api;



procedure TfmAbout.FormCreate(Sender: TObject);
begin
  edHid.Text := String(PAnsiChar(GetHardwareID));
end;


в aspr_api.pas есть
functon  GetHardwareID : PChar; stdcall;
...
...
implementation
...
...
function  GetHardwareID : PChar; external aspr_ide name 'GetHardwareID';


т.е. нужно как-то заставить dll`ку грузиться позже? или....
11 сен 19, 10:46    [21968343]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
В принципе, у меня всё взлетело и парсинг работает в отдельном потоке без окон, т.е. в режиме headless.

Осталось решить проблему с загрузкой сторонней dll.
11 сен 19, 16:17    [21968652]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
А как получить скриптом то, что всплывает в окне?

Вот мой код, я сделал по принципу, как на других сайтах.
Но функция поиска телефона (FindTel) ищет номер в текущем документе, а нужно в новом окне.

+ JS
var intervalHandl;
var tel = "";
var tel1 = "";
var s1 = "Показать номер";
var countTryFindTel = 0;
const cTryFindTel = 4;// 5 попыток для поиска телефона
const constQuerySelectorAll1 = "span.sc-cJSrbW.cHCRbi";
const constQuerySelectorAll2 = "???";

function LOG(sLog){
  console.log((new Date()).toLocaleString() + ": " + sLog);
}

function StartCounting(){   
    LOG("StartСounting start");
    intervalHandl = setInterval(function(){FindTel()}, 3000);
}

function StartGetTel(){
    LOG("StartGetTel");
    var links = document.querySelectorAll(constQuerySelectorAll1);
    if (links) {
      for (var x = 0; x <= links.length; x++) {        
        if (links[x]) { 
          LOG("links[x] = " + x);
          LOG(s1);
          if (links[x].innerText.trim().indexOf(s1) != -1) { 
            links[x].click(); 
            LOG(links[x].innerText);
            
          }
        } 
      }
      StartCounting();
    }
  }
  
  function FindTel(){
    LOG("FindTel");
      if (tel !== "" || countTryFindTel >= cTryFindTel) {
        LOG("clearInterval");
        clearInterval(intervalHandl);
        return;
      }
      else 
        countTryFindTel++;
        
      var links = document.querySelectorAll(constQuerySelectorAll2);
      if (links && links.length > 0) { 
        LOG("links length = " + links.length); 
        for (var x = 0; x <= links.length; x++) { 
          if (links[x]) { 
            LOG(links[x].innerText);
            tel1 = links[x].innerText;
            if (tel == "") 
                tel = tel1
            else
              tel = tel + ", " + tel1
          }
       }
     }
  }
  
  StartGetTel();


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

Откуда:
Сообщений: 961
Это не окно, а просто див, который так же в структуре document сидит. Просто селектор не рабочий
4 окт 19, 18:27    [21987046]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
т.е. нужно выяснить, что вставить вместо ??? в
const constQuerySelectorAll2 = "???";

?
4 окт 19, 18:43    [21987063]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
нашёл div.sc-iwsKbI.kiAeTp a
4 окт 19, 18:52    [21987071]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
А как получить полностью всю страничку как она есть?
Потому что document.Body.AsMarkup возвращает только часть html-странички.

т.е. приходится клеить document.Head.AsMarkup + document.Body.AsMarkup
5 окт 19, 12:16    [21987292]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Странно, сохранил страничку в текст. А она в кодировке ANSI. Так и должно быть?
Снимок с виндового Блокнота:

К сообщению приложен файл. Размер - 4Kb
25 окт 19, 13:14    [22002503]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
А кто-нибудь пробовал нажать программно на гугловскую рекапчу? Обойти её...
10 ноя 19, 23:25    [22013155]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
Подозреваю, если бы это было так просто, то в ней не было бы никакого смысла))
11 ноя 19, 10:02    [22013284]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13864
Я не про распознавание картинки.
Иногда рекапча не показывает картинок, нужно просто кликнуть.
11 ноя 19, 10:18    [22013305]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 961
Так а в чем проблема-то? Находишь ДОМ элемент, кликаешь.
Только опять же, она не просто так не показывает картинки. Иначе это была бы не каптча. Насколько я знаю, она анализирует действия юзера на страничке, и если он похож на человека, то картинки не показываются

Сообщение было отредактировано: 11 ноя 19, 13:56
11 ноя 19, 13:55    [22013535]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6   вперед  Ctrl      все
Все форумы / Delphi Ответить