Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 [4] 5 6 вперед Ctrl→ все |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
CEF4Delphi поддерживает внедрение JS в страничку 21954002 |
||
1 сен 19, 09:52 [21961401] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Хорошо. А как получить в свою программу из документа определённый контент, содержимое той или иной ноды? Но без установки доп. расширений в CEF. |
||
2 сен 19, 10:24 [21961665] Ответить | Цитировать Сообщить модератору |
JayDi Member Откуда: Сызрань, Россия Сообщений: 4144 |
Это риторический вопрос в стиле "как из процедуры вернуть результат, не преобразовывая ее в функцию". Хром -- асинхронный. Чтобы что-то из него получить, необходимо дождаться результата. Это можно сделать разными способами -- от eval и extention до вечного while в ожидании появления новых данных в скрытом dom-элементе. См. примеры в "\demos\Delphi_VCL\JavaScript", как там значения возвращаются. |
||||
2 сен 19, 11:30 [21961727] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Если вы загружаете скрипт из файла в кодировке UTF-8, то не забудьте перед его внедрением в CEF конвертировать в string:s := UTF8ToString(RawByteString(sJsScript)); |
4 сен 19, 12:30 [21963276] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Я правильно понимаю, что GlobalCEFApp := TCefApplication.Create; Создаётся глобально для всей системы, а не только для моей программы и тем более не только для доп. потока(ов) приложения? Я про то, что когда TChromium (PID_BROWSER) и процесс рендерига (PID_RENDERER) обмениваются между собой сообщениями frame.SendProcessMessage(); в сообщении нужно конкретизировать как-то - что и кому предназначено? Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим? |
5 сен 19, 13:06 [21964474] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
ведь процесс создания браузера запускается из 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] Ответить | Цитировать Сообщить модератору |
JayDi Member Откуда: Сызрань, Россия Сообщений: 4144 |
Конечно нормально. Там же асинхронное всё, да еще и в своих собственных процессах крутится. |
5 сен 19, 13:31 [21964516] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
как правильно? или нет разницы? |
||
5 сен 19, 13:32 [21964519] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Просто я собираюсь использовать Chromium в headless режиме и там не будет TCEFWindowParent. Вот если в приложении несколько вкладок или пользователь сам создает вкладки, как это в классическом браузере, то достаточно одного экземпляра Chromium, как я понимаю? Просто будет вот так: Chromium1.CreateBrowser(CEFWindowParent1, ''); Chromium1.CreateBrowser(CEFWindowParent2, ''); Chromium1.CreateBrowser(CEFWindowParent3, ''); Но у меня-то не будет разных CEFWindowParent. |
5 сен 19, 13:39 [21964536] Ответить | Цитировать Сообщить модератору |
JayDi Member Откуда: Сызрань, Россия Сообщений: 4144 |
CEFWindowParent1 -- это визуальный компонент, где будет идти отрисовка конкретного экземпляра браузера. В соседней же теме было, что для работы в безрендеринговом режиме можно туда nil передавать. Для потоков должен быть свой собственный браузер TChromium.Create |
5 сен 19, 14:00 [21964571] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
это я всё знаю уже давно |
||
5 сен 19, 14:09 [21964579] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Вы не понимаете мои вопросы? |
||
5 сен 19, 14:09 [21964582] Ответить | Цитировать Сообщить модератору |
JayDi Member Откуда: Сызрань, Россия Сообщений: 4144 |
Ответ был на это:
|
||||
5 сен 19, 14:16 [21964592] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Возникла проблема в реальной программе. Программа защищается с помощью 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] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
В принципе, у меня всё взлетело и парсинг работает в отдельном потоке без окон, т.е. в режиме headless. Осталось решить проблему с загрузкой сторонней dll. |
11 сен 19, 16:17 [21968652] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
А как получить скриптом то, что всплывает в окне? Вот мой код, я сделал по принципу, как на других сайтах. Но функция поиска телефона (FindTel) ищет номер в текущем документе, а нужно в новом окне.
К сообщению приложен файл. Размер - 36Kb |
|
4 окт 19, 17:55 [21987009] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Это не окно, а просто див, который так же в структуре document сидит. Просто селектор не рабочий |
4 окт 19, 18:27 [21987046] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
т.е. нужно выяснить, что вставить вместо ??? в const constQuerySelectorAll2 = "???"; ? |
4 окт 19, 18:43 [21987063] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
нашёл div.sc-iwsKbI.kiAeTp a |
4 окт 19, 18:52 [21987071] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
А как получить полностью всю страничку как она есть? Потому что document.Body.AsMarkup возвращает только часть html-странички. т.е. приходится клеить document.Head.AsMarkup + document.Body.AsMarkup |
5 окт 19, 12:16 [21987292] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Странно, сохранил страничку в текст. А она в кодировке ANSI. Так и должно быть? Снимок с виндового Блокнота: К сообщению приложен файл. Размер - 4Kb |
25 окт 19, 13:14 [22002503] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
А кто-нибудь пробовал нажать программно на гугловскую рекапчу? Обойти её... |
10 ноя 19, 23:25 [22013155] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Подозреваю, если бы это было так просто, то в ней не было бы никакого смысла)) |
11 ноя 19, 10:02 [22013284] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15044 |
Я не про распознавание картинки. Иногда рекапча не показывает картинок, нужно просто кликнуть. |
11 ноя 19, 10:18 [22013305] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Так а в чем проблема-то? Находишь ДОМ элемент, кликаешь. Только опять же, она не просто так не показывает картинки. Иначе это была бы не каптча. Насколько я знаю, она анализирует действия юзера на страничке, и если он похож на человека, то картинки не показываются Сообщение было отредактировано: 11 ноя 19, 13:56 |
11 ноя 19, 13:55 [22013535] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 [4] 5 6 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |