Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Работа с Web-платформой Olymp Trade


TraderProg ©   (11.02.18 09:02

Здравствуйте! Собираюсь сделать торгового робота в Delphi для бинарных опционов, работающий в Web-плаформе Olymp Trade.
Адрес платформы: https://olymptrade.com/ru-ru/platform
Для доступа к платформе потребуется простенькая регистрация (это вручную).
Для начала надо организовать:

1. Чтение цены выбранного инструмента - на сайте имеется графический, динамический меняющийся уровень с цифрами в правой части экрана.
2. Нажатие на кнопки "Выше" или "Ниже"

Конечно потом возможно понадобится и чтение текущего баланса, регулировка стоимости и экспирации опциона, но пока самое главное эти 2 пункта.
Перечитал много ресурсов про использование компонентов TWebBrowser и связки TIdHTTP + TIdSSLIOHandlerSocketOpenSSL

Пробовал так:
1. Для парсинга цены пробовал так:
Memo1.Lines.Add(UTF8Decode(IdHTTP1.Get('https://olymptrade.com/ru-ru/platform')));

Но вылазит ошибка "HTTP/1.1 403 Forbidden". При этом другие HTTPS сайты подгружаются нормально.
Может конечно над считывать совершенно иначе.
Код страницы, где видна динамически-меняющаяся цена, показан на скриншоте.

2. Для работы с кнопками "Выше" и "Ниже" пытался так:
Загрузка страницы в WebBrowser по команде
WebBrowser1.Navigate('https://olymptrade.com/ru-ru/platform', Flags, TargetFrameName, PostData, Headers);
или
WebBrowser1.Navigate('https://olymptrade.com/ru-ru/platform');
Здесь пока все нормально. А вот дальше уже проблемы.
Далее непосредстенно клик на кнопке:
WebBrowser1.OleObject.Document.GetElementById('svg_btn-up').click;
Тут вылазит ошибка показанная на третьем скриншоте.
Код страницы, где видны кнопки показан на втором скриншоте.

Прошу помощи по крайней мере с этими самыми главными двумя пунктами. Сильно не пинайте, я начинающий программист-любитель.
Возможно сайт с платформой написан нестандартно, так как не хотят работать классические примеры работы с сайтами в Delphi.
Рассмотрю любые варианты организации работы с этой платформой, единственное мне не подходят варианты:
1. Брать цену из других источников, так как она может отличаться
2. Искать другой сайт, на котором заработают приведенные выше классические способы - тоже НЕТ, так как торговые условия устраивают меня лично только здесь.


TraderProg ©   (11.02.18 09:03[1]

Извините, но похоже скриншоты добавить не могу. Попробую перепечатать коды web-платформы в интересующих местах


TraderProg ©   (11.02.18 09:05[2]

Код где отображается текущая цена:

<g class="cutoffG" transform="translate(0, 405)" style="visibility: visible;"><line class="cutoffLine" x1="0" x2="802" y1="0" y2="0" style="stroke: rgb(131, 140, 152); stroke-opacity: 0.7; shape-rendering: auto;"></line><path class="pin" d="M0,15L6.947213595499958,28.894427190999917A2,2,0,0,0,8.73606797749979,30L77.9 296875,30A2,2,0,0,0,79.9296875,28L79.9296875,2A2,2,0,0,0,77.9296875,0L8.73606797 749979,0A2,2,0,0,0,6.947213595499958,1.105572809000084" transform="translate(787.0703125,-15)" style="fill: rgb(50, 53, 81);"></path><text class="pin_text" text-anchor="end" y="2" dx="0" dy="3" x="862" style="font-size: 14px; font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, "Liberation Sans", Arial, sans-serif; font-weight: bold; fill: rgb(255, 255, 255);">8058.657</text></g>


TraderProg ©   (11.02.18 09:06[3]

Текущая цена в приведенном выше тексте: 8058.657


TraderProg ©   (11.02.18 09:08[4]

Код где идет работа с кнопками "Выше" и "Ниже":

<div class="state-block js_tu_deal_buttons deal-form__item deal-form__risk-free"><div class="buttons js_tu_deal_buttons"><div class="buttons-wrapper"><div class="container -up"><button data-test="deal-button-up"><svg class="svg"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#svg_btn-up"></use></svg><span class="spinner"> </span><span class="text" data-trans="deals_upper">Выше</span></button></div><div class="container -down"><button data-test="deal-button-down"><svg class="svg"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#svg_btn-down"></use></svg><span class="spinner"> </span><span class="text" data-trans="deals_lower">Ниже</span></button></div></div></div></div>


TraderProg ©   (11.02.18 09:10[5]

Вот как-то надо организовать взаимодействие и работу с этой Web-платформой из под Delphi. В крайнем случае на C# или VB


Redmond   (13.02.18 00:35[6]

Одно из четырёх:
* Вы используете API сайта (рекомендуется, если оно есть)
* Вы изучаете какие запросы делает страница и пытаетесь повторить их (муторно и далеко не всегда этим вариантом можно сделать требуемое)
* Вы скачиваете страницу и ковыряете текст (муторно и многие вещи будут недоступны, например скрипты и подкачка информации)
* Вы загружаете страницу в TWebBrowser и тыкаете в DOM (оптимальный вариант, если ни API ни запросы вам не доступны)


Redmond   (13.02.18 00:43[7]

Открываете страницу в Chrome, правой мышкой на нужный элемент и в выпадающем списке "Посмотреть код".
В инструментах разработчика правой мышью на исследуемом/выделенном/нужном элементе и в выпадающем списке "Copy > Copy selector".
После этого в буфере обмена у вас информация подсказывающая как этот элемент найти по DOM.


Дмитрий Белькевич ©   (13.02.18 10:29[8]

Если API нет, то грузи страницу в TWebBrowser. Если в тексте страницы есть нужные данные, можешь из TWebBrowser забрать этот же текст и попробовать его разобрать (распарсить).
Можешь погуглить по запросу 'twebbrowser get html'

Вот хотя бы:

https://stackoverflow.com/questions/10091666/how-can-i-get-html-source-code-from-twebbrowser


TraderProg ©   (13.02.18 16:36[9]

Спасибо за ответы Redmond и Дмитрий Белькевич!
1. API сайта не нашел
2. Пытался через сниффер отследить запросы, но так и не понял ничего. Я новичок в этом деле.
3. Код страницы в браузере я уже видел через кнопку F12 и нашел нужные участки с кодом. Только вот применить их в самом Delphi пока не пойму как.
4. В TWebBrowser и так уже гружу. А по DOM можно поподробнее?

По ответу Дмитрия Белькевича: попробую извлечь HTML из TWebBrowser без применения TIdHTTP, о результатах напишу.  Только вот это пол дела - для чтения текущей цены сгодится, но как мне по кнопкам на Веб-странице нажать? Как уже писал по id нашел кнопку, кликаю как в распростарненных примерах, но ошибка вылазит. Возможно не пот тому элементу кликаю. По кликам на других элементах вылазит даже более грубая ошибка.


TraderProg ©   (13.02.18 18:21[10]

Проблему №1 по парсингу цены частично решил. Удалось вывести код страницы в Memo аж двумя разными способами:
1-й:
function GetWebBrowserHTML(const WebBrowser: TWebBrowser): String;
var
 LStream: TStringStream;
 Stream : IStream;
 LPersistStreamInit : IPersistStreamInit;
begin
 if not Assigned(WebBrowser.Document) then exit;
 LStream := TStringStream.Create('');
 try
   LPersistStreamInit := WebBrowser.Document as IPersistStreamInit;
   Stream := TStreamAdapter.Create(LStream,soReference);
   LPersistStreamInit.Save(Stream,true);
   result := LStream.DataString;
 finally
   LStream.Free();
 end;
end;

2-й:
function GetHTML(w: TWebBrowser): String;
Var
 e: IHTMLElement;
begin
 Result := '';
 if Assigned(w.Document) then
 begin
    e := (w.Document as IHTMLDocument2).body;

    while e.parentElement <> nil do
    begin
      e := e.parentElement;
    end;

    Result := e.outerHTML;
 end;
end;

Первый способ работает довольно шустро, но выдает всего 12 кб текста, а второй - несколько секунд думает (даже на моем мощном игровом компе) и выдает 500 кб текста. Первый способ не подходит так как поиск текста не находит нужные элементы в коде. А второй слишком медленный - цена меняется по несколько раз за секунду, а вывод кода в Memo - несколько секунд !!!

В связи с этим вопрос - возможно ли как-то быстро считывать цену из этого куска текста в 500 кб - чтобы поспевать за ценой?


TraderProg ©   (13.02.18 18:54[11]

Может как-то можно из TWebBrowser выгружать нужный участок кода, для экономии времени?


TraderProg ©   (13.02.18 18:59[12]

По второй проблеме (как программно нажать на кнопку) по совету Redmond я через Copy selector получил в буфере обмена следующий текст:

#deal_controls > div > div.deal-form > div.state-block.js_tu_deal_buttons.deal-form__item.deal-form__risk-free > div > div > div.container.-down > button > span.text

Что с этим делать? Как этот "DOM" работает?


Redmond   (13.02.18 20:54[13]

TIdHTTP - это скачивание страницы, оригинального HTML-кода, без дополнительных ресурсов, без отрабатывания JavaScript/событий/AJAX'ов. При таком вот простом скачивании довольно часто нужной информации там может просто физически не быть (зависит от сайта).
Кстати если надо только лишь скачивать файл по ссылке - можно не тянуть весь Indy, а воспользоваться функцией URLDownloadToFile() из модуля Winapi.UrlMon.

TWebBrowser - загружает страницу, загружает ресурсы, генерирует события, выполняет JavaScript'ы. Он хорош тем что скорее всего нужная информация там должна быть и не надо ковырять запросы (которые легко могут однажды взять и измениться полностью).

Первый момент  - не уверен, но вроде бы из TWebBrowser можно доставать не только "текущий DOM", но и "начальный DOM" (то есть фактически то что получаем через TIdHTTP/URLDownloadToFile) - возможно ваш "первый способ" получает как раз "начальный".
Второй момент - надо бы на всякий случай поправить FEATURE_BROWSER_EMULATION, Гугл знает что это.
Третье - почему outerHTML, а не inner, да ещё и от body? Не проще найти элемент поближе к целевому узлу?

Версия Delphi? Версия IE? Если у версии DOM доступен метод querySelectorAll() удобнее будет через него. Вы планируете каждый раз делать Navigate(), или оно там и так само обновляется?


Redmond   (13.02.18 21:21[14]

Наколеночная мини-демонстрация:
Procedure TForm1.Button1Click(Sender: TObject);
Var i: Integer; Doc, List, Node: OleVariant;
Begin
With TButton(Sender) Do
     Begin
     Enabled:=False;
     Caption:='Loading...';
     WB.Navigate(URL);
     While (WB.ReadyState<>READYSTATE_COMPLETE) Do
           Application.ProcessMessages();
     Caption:='Working...';
     Doc:=WB.Document;
     List:=Doc.querySelectorAll('button');
     For i:=0 To (List.length-1) Do
           Begin
           Node:=List.item(i);
           Node.style.border:='solid red 8px';
           End;
     ShowMessage(Format('Найдено и обведено элементов:   %d', [Integer(List.length)]));
     Caption:='Done!';
     Enabled:=True;
     End;
End;


TraderProg ©   (13.02.18 21:28[15]

1. Поизучаю, что такое "DOM"
2. Проверю у себя, позже напишу.
3. По поводу outerHTML и inner брал готовый пример, лишь смутно представляю что там происходит, так как новичок. Попробую поэкспериментировать, только не пойму как попасть поближе к целевому узлу для сокращения объема и соответственно повышения скорости.

Версия Delphi - 10.2. Версия IE - 11.

Нет, Navigate() выполняется единократно при загрузке веб-страницы в TWebBrowser, а далее он пашет сам - цена движется сама, можно мышкой покликать по кнопкам "Выше", "Ниже" например, то есть ведет себя как полноценный браузер (хотя я может вопрос неправильно понял). только как это сделать, чтобы не урками по кнопкам сайта клацать, а автоматом шло, то есть как заставить выполняться скрипт прописанный в коде веб-страницы из под Delphi.


ухты ©   (14.02.18 00:55[16]


>  В крайнем случае на C#
тогда все проще, пишите маленькую сборочку, и все дела)


TraderProg ©   (14.02.18 18:47[17]

Ура, есть первые успехи! Получилось кликать по необходимым кнопкам. Спасибо, Redmond, за пример кода - именно он мне помог найти верное направление.
Вот  рабочий код (сама страница цеж ранее загружена в WebBrowser):
procedure TForm1.Button8Click(Sender: TObject);
Var  Doc, List, Node: OleVariant;
Begin
 Doc:=WebBrowser1.Document;
 List:=Doc.querySelectorAll('button');
 Node:=List.item(23);
 //23 - для кнопки "ВВЕРХ", 24 - "ВНИЗ"
 Node.click;
 //23 - вверх, 24 - вниз
end;

Коды 23 и 24 нашел методом перебора. Может конечно более "элегантно" как-то их находить без применения кодов 23 и 24 (на случай если веб-страницу изменят авторы), но уж ладно, главное что заработало

Теперь осталось как-то быстро находить цену, отфильтровав лишнее без полной загрузки всего HTML-кода. Буду теперь думать какой теперь тип использовать, кнопки нашлись по типу "button"


TraderProg ©   (14.02.18 19:00[18]

Copy selector для текста с ценой выдает такую иерархию:

#chart > div > svg > g > g.cutoffG > text


TraderProg ©   (14.02.18 19:25[19]

Итак, с ценой тоже вышло по индексу "6". Вот код:

procedure TForm1.Button8Click(Sender: TObject);
Var i: Integer; Doc, List, Node: OleVariant;
Begin
 Doc:=WebBrowser1.Document;
 List:=Doc.querySelectorAll('text');
 Node:=List.item(6);
 Memo1.Lines.Clear;
 Memo1.Lines.Add(Node.innerHTML);
end;

Только одно маленькое "НО" осталось: в WebBrowser цена сама меняется - мне программно для этого даже делать ничего не надо. Но как оно происходит? Наверно генерируется какое-то событие и цена в нем обновляется? Если это так то какое это событие?
Можно конечно повесить таймер и обновлять периодически цену. Но может можно обойтись без этого и обновлять цену в Memo1 лишь тогда, когда она изменяется в WebBrowser? Есть идеи как это сделать?


TraderProg ©   (14.02.18 20:56[20]

Похоже я обрадовался преждевременно. Захожу значит через полчаса и уже в плане цены не 11 элементов, а уже 13 (видать вебстраница слегка изменилась) и соответственно цена уже идет не по индексу 6, а  по индексу 8. А если бы это произошло во время торговли? Последствия могли бы быть печальными. Как же быть, чтобы искать не по конкретным цифрам по индексу, а как-то более надежно?


Redmond   (14.02.18 21:12[21]

Да, привязываться к индексу плохая идея. Да и обращаться к List.item(23) не проверив что их там есть столько - тоже. Может List вообще пустой. :3

А чего если?:
List:=Doc.querySelectorAll('#chart > div > svg > g > g.cutoffG > text');
ну или?:
List:=Doc.querySelectorAll('#chart > div');

JavaScript меняет текст. Мало ли как и откуда он его берёт и по каким внутренним событиям/таймерам срабатывает. Проще - тоже таймером.
А чего, запоминать где-то последнее значение и сравнивать с только что полученным. Изменилось - значит изменилось, тогда что-то делаем.


Redmond   (14.02.18 21:19[22]

А на случай если веб-страницу изменят авторы - параметры для querySelectorAll() можно вынести во внешний файл. Типа файл с настройками. Что-то вроде *.ini / *.json / *.xml.


TraderProg ©   (14.02.18 21:52[23]

Спасибо еще раз. Работает. Проверил вариант:
List:=Doc.querySelectorAll('#chart > div > svg > g > g.cutoffG > text');

Второй вариант не стал проверять.
А что если   #chart > div > svg > g > g.cutoffG > text   тоже сменится неожиданно, в процессе работы программы?

По поводу таймера: убедили :)


Redmond   (14.02.18 22:23[24]

Тогда видимо querySelectorAll() ничего не найдёт и вернёт пустой List.
If (List.length=0) Then
     {Error};


TraderProg ©   (15.02.18 05:09[25]

Да, отличная идея с проверкой длины. А вот если Doc, List, Node - вынести за рамки, то есть сделать их глобальными, чтобы определить их в самом начале при старте всего приложения, а потом лишь вызывать Node.innerHTML для чтения цены или Node.click для кнопок, будет ли в этом случае работать, то есть продолжит ли работу, в случае изменения вебстраницы?
Или:
Doc:=WebBrowser1.Document;
List:=Doc.querySelectorAll('#chart > div > svg > g > g.cutoffG > text');
надо повторять при каждом такте таймера?


Redmond   (15.02.18 13:27[26]

Зависит от того что именно там мутит JavaScript. Но в общем случае полагаю надёжность может понизится...
Если скрипт пересоздаст элементы - глазами можно не заметить, а элемент уже по факте новый другой. Как определить что "ссылка" на элемент уже не валидна?
гм... Хотя она же "интерфейсная"... Может оно вообще останется валидным и продолжит существовать как бы все DOM. Но нам такая тем более не подойдёт. Можно понатыкать Try/Except, но от неактуальности не спасёт.
Зависит от сайта короче. Не уверен как надёжно проверять актуальность содержимого переменной. На полную пустоту проверять примерно этим (нужен модуль System.Variants):Function CheckVariant(Variable: OleVariant): BooLean;
Begin
Result:=Not (VarIsNull(Variable) Or VarIsEmpty(Variable));
End;


Только не глобальными, а в поля формы:
Type
     TForm1 = Class(TForm)
           ...
     Private
           NodePrice, ButtonUp, ButtonDown, ... : OleVariant;
     Public
     End;

А переменные Doc, List, Node лучше оставить локальными и использовать только для поиска/навигации.


Redmond   (15.02.18 13:31[27]

Досадные опечатки...

> по факту

> как бы вне


Redmond   (15.02.18 15:35[28]

Ну вот «"потыкал" я "палочкой"» элементы/узлы документа - после удаления они остаются вполне действующими.
Придётся всё же как-то проверять перед работой (и если что - обновлять). Например:Procedure TForm1.UpdateNodePrice(Doc: OleVariant);
Begin
... // Алгоритм поиска для NodePrice (в переданном Doc)
NodePrice:= ... ;
End;

Procedure TForm1.UpdateButtonUp(Doc: OleVariant);
Begin
... // Алгоритм поиска для ButtonUp (в переданном Doc)
ButtonUp:= ... ;
End;

Procedure TForm1.UpdateButtonDown(Doc: OleVariant);
Begin
... // Алгоритм поиска для ButtonDown (в переданном Doc)
ButtonDown:= ... ;
End;

... // Остальные переменные по аналогии

Procedure TForm1.CheckAll(WB: TWebBrowser);
Var Doc: OleVariant;
Begin
Doc:=WB.Document;
If CheckNode(NodePrice) Then
     UpdateNodePrice(Doc);
If CheckNode(UpdateButtonUp) Then
     UpdateButtonUp(Doc);
If CheckNode(UpdateButtonDown) Then
     UpdateButtonDown(Doc);
... // Остальные переменные по аналогии
End;

Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
// Найдём (или проверим актуальность) все элементы:
CheckAll(WebBrowser1);
... // Пользуемся ими - получаем innerHTML или click или ещё что там надо
End;
Осталось придумать как сделать функцию проверки CheckNode()...
Возможно получится проверять у целевого Node - а задан ли parentNode (или parentElement). Если нету, то возможно его удалили из DOM...


TraderProg ©   (15.02.18 15:55[29]

Спасибо большое, Redmond. Без этих подсказок я бы так и не решил проблему - где бы в инете не лазил - везде одна и та же скудная инфа. А как Вы (не знаю как лучше на Вы или на ты :) )  изучили эту тему с DOM? Посоветуете что почитать, с примерами, чтобы я сам начал разбираться в этом вопросе?

Решил поначалу сделать первый вариант, где будет каждый раз пр новом такте заново присваиваться Doc, List, Node и с проверкой на равенство List.length нулю, а уже потом буду параллельно делать второй вариант как в примере постом выше этого, если конечно придумаю как сделать CheckNode().

Тут еще мысля опосля пришла - нужно же как-то проверять периодически соединение с сайтом. Это можно сделать в самом WebBrowser или лучше пытаться парсить сайт (в нем есть мигающий зеленый кружок и надпись "online")?


TraderProg ©   (15.02.18 21:15[30]

Еще один вопрос появился. При загрузке страницы в WebBrowser она отображается излишне крупно. Можно как-то масштаб уменьшить программно, чтобы больше влазило в видимую область?


Redmond   (15.02.18 22:58[31]

В смысле есть ли интернет и доступен ли сайт? хм...Ну тут уже возможно удобнее на TIdHTTP свалить работу...

Чёткие корректные термины это совершенно не моё. С:
WB.Document это что-то типа "ссылка на интерфейс ActiveX компонента Internet Explorer'а, реализующий модель DOM" - https://www.w3schools.com/JSREF/dom_obj_document.asp
С терминами наверняка накосячил, поправьте кто-то... :3

гм... Масштабирование бывает у самого браузера (не задумывался даже как там может быть реализовано) - зажимаем Ctrl и колесом мышки. А бывает и у элементов (появилось в CSS3). Возможно первое и реализовано как-то через второе, тут я без понятия.
Сделать через CSS3 - просто и не потребует вытрясания Души из Гугла - надо просто добавить к стилям html стиль transform с масштабированием:Doc.documentElement.style.transform:='scale(0.6)';
Doc.documentElement.style.transformOrigin:='top';
Но при рассмотрении это чем-то всё же отличается от Ctrl+колесо... А вот как программно вызывать аналог Ctrl+колесо Гугл мне что-то и под пытками не сознался...


TraderProg ©   (18.02.18 18:10[32]

Привет. Думал уж что почти все проблемы решил. Перекинул значит я прогу на VPS (выделенный персональный сервер) для круглосуточной работы. А WebBrowser в ней не работает - пишет: "Проводятся технические работы.

Пожалуйста, подождите несколько минут и повторите попытку"

Причем браузер InternetExplorer выдает тоже самое, а в Яндекс-браузере загрузка страницы происходит нормально.

Скорее всего надо в настройках IE где-то покопаться, галочки куда надо проставить, только ума не приложу где именно


TraderProg ©   (18.02.18 20:23[33]

Главное другие сайты загружаются в TWebBrowser и ИЕ на ВПСе нормально, а страница торговой платформы Олимптрейда не хочет включаться там. Первоначальная старница Олимптрейда до авторизации тоже загружается нормально. Дома вообще все без проблем, а вот на ВПСе беда. Из дома запускать конечно можно - но после работы немного времени, а если круглосуточно то жалко железо, эл. энергию, да и вообще больший риск пожароопасности без присмотра. Специально взял ВПС, а на нем не работает (((


Дмитрий Белькевич ©   (18.02.18 23:45[34]

Можешь хромиум попробовать. Возможно будет стабильнее по разным компам.

гуглить:
delphi chromium click button
delphi chromium get html

ну и остальное что нужно.


TraderProg ©   (19.02.18 07:44[35]

На Хромиуме скорее всего запустится, но в этом случае опять приду к тому с чего начал, без подсказок опытных программистов не обойтись, так как в инете одна и та же скудная инфа, повторяющаяся на множестве сайтов.


TraderProg ©   (19.02.18 21:28[36]

Установил на Delphi компонент Хромиум, пока не разобрался как его использовать под свои задачи. Решил попробовать купить другой VPS - в нем уже открывается окно плаформы в Internet Explorer, НО НЕ ХОТЯТ выполняться сценарии, которые привязаны к кнопкам "ВЫШЕ" и "НИЖЕ". Облазил и перетыкал большинство настройки бразуера но так и не работает. Причем дома все ОК, а на ВПСах такая беда. не могу понять в чем дело? Может что установить дополнительно надо?


Redmond   (20.02.18 00:34[37]

> Причем браузер InternetExplorer выдает тоже самое

TWebBrowser это фактически и есть Internet Explorer. Они и должны одинаково работать. Как вариант обратиться в техподдержку сайта который не открывается. Мол - "Вот, не работает!" (с)

> НО НЕ ХОТЯТ выполняться сценарии, которые

Молча? Что показывают проверки? На каком этапе и что не находится? Сообщения об ошибках ловятся?

> Второй момент - надо бы на всякий случай поправить FEATURE_BROWSER_EMULATION, Гугл знает что это.

Это делаете? Это кстати если что надо делать ещё до "инициализации" TWebBrowser.


TraderProg ©   (20.02.18 06:19[38]

Нет, не молча. Я бы скрин показал, если бы тут можно было добавить, а если по тексту то особо ничего не написано, то что ошибка сценария, веб-адрес и все. а последующие попытки вообще без ругани - просто молча


TraderProg ©   (20.02.18 15:56[39]

Текст сообщения такой:
Ошибка сценария
! На этой странице произошла ошибка сценария
Строка: 0
Символ: 0
Ошибка: script error
Код: 0
URL: https://cdn1.olymptrade.com/p_920b9108d816/public/js/vendors.dll.js

Вы хотите продолжить выполнение сценариев на этой странице?
Да    Нет


TraderProg ©   (21.02.18 08:58[40]

Форум был недоступен долго (((

В общем вчера намучился в том числе пытался разные варианты  FEATURE_BROWSER_EMULATION пробовать, но так и не заработало на 2-м ВПС - то есть платформа видна, цена движется, нажимаются вспомогательные кнопки, но самые главные на отрез не хотят нажиматься. Похоже блокируется закачка JavaScript или их исполнение, хотя в настройках IE их исполнение разрешил - поставил галочку в настройках. По 1-му ВПСу тоже лучше не стало - страница так и не хочет загружаться.


Redmond   (21.02.18 11:06[41]

гм... гм... Если например обновить IE? Какая там версия-то?


TraderProg ©   (21.02.18 11:23[42]

в обоих ВПСах 11-ая, а какая именно подверсия позже могу сказать.


TraderProg ©   (21.02.18 15:52[43]

В 1-м ВПСе (где вообще страница с платформой не открывается):
Версия: 11.0.9600.18053
Версия обновления: 11.0.24 (KB3093983)

Во 2-м ВПСе (где только скрипты на главных кнопках не работают):
Версия: 11.0.9600.18861
Версия обновления: 11.0.49 (KB4052978)

На домашнем компе (где все нормально работает на данный момент):
Версия: 11.248.16299.0
Версия обновления: 11.0.51 (KB4074736)

У обоих ВПСов: Windows Server 2012 R2
У меня винда - 10-ка.

Может действительно дело в обновлении. Как обновлять браузер IE? Я ни разу в своей жизни его не обновлял, какая система бы не стояла - как то так обходился.


TraderProg ©   (21.02.18 16:23[44]

2-й сервак обновил - установилось только Силверлайт. Не помогло.

А как-то можно не с самим компонентом-браузером в программе работать, а непосредственно с установленным браузером (Хром, Яндекс-браузер или Мозилла) - также читать цену и воздействовать на кнопки в открытой странице?


TraderProg ©   (21.02.18 20:40[45]

В общем установил все возможные обновления на оба сервера - без результата.
Вижу пока 2 пути в каком направлении копать, если отбросить настройку IE:
1. Все таки попробовать TChromium, на нем без проблем можно исполнять яваскрипты, но невозможно получить объекты DOM (исходя из пролистывания сайтов по этой теме), а так как невозможно получить объекты DOM, то непонятно как считывать цену и нажимать на кнопки.
2. Писать расширение (плагин) для браузера Chrome на чистом Javascript (файлы json), там вроде как возможна работа с объектами DOM, но это уже не под Delphi, и даже не под любой другой IDE с графическим интерфейсом. Только блокнот, только хардкор.

Поправьте меня, если я все неправильно понял и наговорил крамольных мыслей.


TraderProg ©   (21.02.18 21:20[46]

Еще одно интересное наблюдение: запустил на 2-м ВПСе параллельно браузер Хром и мою прогу с TWebBrowser. Нажимаю руками кнопки "Выше", "Ниже", и в этот момент в моей программе ни с того ни с чего генерируется та же самая ошибка сценария. это при том что программа просто стояла и не выполняла никаких действий - просто был включен компонент TWebBrowser c загруженной страницей платформы.


ухты ©   (21.02.18 21:52[47]

прикольная тема))

за это время уже можно было либо наваять бот на том же шарпе, либо взять что то типа электрона и на скриптах с хрониумом (не трогая делфи), либо уже наконец прочитать как дебажить скрипты в браузерах, потом понять что не хватает и починить то что уже наваяли.
хотя зачем лозе баян, то есть боту браузер так и не понятно..

продолжаем кушать попкорн))


TraderProg ©   (22.02.18 05:09[48]

Вот и тролли подятнулись. Я не проф. прог-т, а новичок, так что многое непонятно и скорее всего что-то не так делаю и поэтому прошу помощи в решении вопроса. А если ты не тролль и видишь как решить проблему то пож-та помоги.

P.S. у Олимптрейда есть только Веб-платформа, так что без браузера не обойтись. Был бы у них Metetrader 4 или 5 я бы сюда вообще не писал.


TraderProg ©   (22.02.18 05:11[49]

В плане C# - выйдет тоже самое так как он использует тот же компопнент WebBrowser, базирующийся на IE. А IE упорно не хочет работать как надо на VPS


ухты ©   (22.02.18 13:32[50]

Новичку надо читать и учиться, а вы пишите какуюто ерунду которую даже комментировать не интересно.
Что бы вам помочь надо чтобы и вы помогли. Я может быть и поковырялся у них и может быть помог вам, но там надо регаться, а мне это не к чему. Вам бы сделать тестовый аккаунт, для людей. Так и с показом ошибок, прицепились к картинкам, вы кому проще делаете себе или тем кто может помочь? ну раз вам в лом, то и другим особо не интересно.


TraderProg ©   (22.02.18 15:18[51]

ухты, я бы с радостью подучился, подскажи что читать, где искать? а то в инете ищу и везде одна и та же скопипастенная инфа скудного содержания. Создам тестовый аккаунт сегодня чуть позже и выложу сюда.

Про картинки не понял - тут вроде нет возможности их добавить


Redmond   (22.02.18 16:46[52]

Надо разобраться что не нравится IE. Пока это не станет понятно TWebBrowser колупать бесполезно.
Техподдержка сайта на это что говорит-то?

Про TChromium не помню. Если там и можно делать аналогичные действия - то точно не так же как в TWebBrowser. Но увы не подскажу.

Ещё был TGeckoBrowser, но он кажется давно сдох. Но откапать сей сторонний компонент и протестировать сайт на нём думаю возможно.


TraderProg ©   (22.02.18 18:23[53]

В техподдержку пока не писал - сомневаюсь что смогут помочь.
Сейчас вожусь с Tchromium.
Нашел как в нем работать с Cookies (он в отличие от ВебБраузера не умеет автоматом запоминать учетные данные). Эта новая проблема решена.

Сейчас думаю как сделать querySelectorAll();
Там есть только Node:= Document.GetElementById('id элемента');

Node и Document в разделе var:
 Document: ICefDomDocument;
 Node: ICefDomNode;

Проблема в том что id у нужных элементов нет, а метода querySelectorAll как в WebBrowser не существует


TraderProg ©   (22.02.18 18:35[54]

Еще в Хромиуме работает такая команда:
code:='alert("Hello!");';
Chromium1.Browser.GetMainFrame.ExecuteJavaScript(code,'',0);

То есть исполнение яваскрипта заданного строкой. Только как выцедить сам яваскрипт, работающий при нажатии кнопки?
Это как вариант нажатия кнопок без использования DOM


TraderProg ©   (22.02.18 19:34[55]

Таак. Пол-дела можно сказать сделано. Разобрался как в TChromium нажать на кнопку.
Вот код:
procedure TForm1.Button4Click(Sender: TObject);
var
 CodeStr: string;
begin
  if Assigned(Chromium1.Browser) and Assigned(Chromium1.Browser.Mainframe) then
  begin
     CodeStr := 'document.querySelectorAll("#deal_controls > div > div.deal-form > div.state-block.js_tu_deal_buttons.deal-form__item.deal-form__risk-free > div > div > div.container.-up > button > span.text").item(0).click();';
     Chromium1.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
   end;
end;


TraderProg ©   (22.02.18 19:36[56]

Теперь надо понять как цену считывать в TChromium, Пока что проблема что Chromium1.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0) не возвращает элемент DOM чтобы прочитать innerHTML   ....


TraderProg ©   (22.02.18 20:44[57]

Похоже опять зашел в тупик. Думал вся сложность будет с нажатием кнопок, а нет получить innerHTML содержащую цену посредством процедуры ExecuteJavaScript вообще не знаю как. Иными словами ищем элемент DOM с помощью внутреннего javascript, а вот как у этого "встроенного" в javascript DOM-элемента получить строку innerHTML ? Да уж. загадка  (((

Всех читающих ветку с наступающим 23 февраля !!!


Styx ©   (22.02.18 21:17[58]

В CEF4Delphi есть пример работы с DOM


TraderProg ©   (22.02.18 22:16[59]

Styx, можешь сузить круг поиска в CEF4Delphi, где примерно искать, в контексте выше-приведенных задач?

У меня установлен CEF3Delphi (3-я версия), не знал что уже есть 4-ая.

В принципе только что решил и 2-ю проблему "костылями" посредством транслирования значения в консоль как в этом примере: http://www.cyberforum.ru/delphi-networks/thread1222757.html

Но может быть есть более элегантное решение? Был бы там доступен метод querySelectorAll непосредственно для Node, а также селекторы для класса и тэгов, была бы тогда вообще КРАСОТА.

Как мне в Delphi заменить 3-ю версию на 4-ую чтобы не возникло никаких ошибок?


Styx ©   (22.02.18 22:30[60]

Несмотря на четвёрку в названии, CEF4Delphi тоже использует CEF3 - это просто другой компонент. Я его не пользовал, но в интернетах говорят, что в нём реализован доступ к DOM. Пример должен быть тут: https://github.com/salvadordf/CEF4Delphi/tree/master/demos/DOMVisitor


TraderProg ©   (23.02.18 21:03[61]

Спасибо Styx. Интересно, а для C# на VisualStudio помимо того же самого WebBrowser существуют компоненты аналогичные дельфийному Tchromium ?


Styx ©   (23.02.18 22:51[62]

Да, конечно. Например, https://archive.codeplex.com/?p=awesomium


TraderProg ©   (24.02.18 07:39[63]

Благодарю, Styx. После того как доделаю на Delphi, попробую тоже самое на C# c awesomium. Посмотрю какой будет меньше оперативки кушать - на ВПС это важно так как там ее немного на более менее дешевых тарифах.


TraderProg ©   (28.02.18 16:42[64]

Заметил что из-за Chromiuma с течением времени возрастает нагрузка на ЦП - за несколько часов с 15% до 45%. В чем может быть причина и как с этим бороться?


ку ку   (07.03.18 12:16[65]

возьми selenium web driver.

он хоть и для тестов но здесь подойдет как раз.
и элемент в доме найти не проблема и заполнить его и кнопку нажать и все остальное.

к тому же делфи можно будет оставить за скобками.


ухты ©   (07.03.18 14:29[66]


> Заметил что из-за Chromiuma с течением времени возрастает
> нагрузка на ЦП - за несколько часов с 15% до 45%. В чем
> может быть причина и как с этим бороться?
потому что он для бота как корове седло


TraderProg ©   (08.03.18 21:13[67]

Спасибо КУ КУ. Как резервный вариант пойдет. Пока что довольствуюсь Хромиумом, просто периодически перезапускаю.


TraderProg ©   (08.03.18 21:14[68]

ухты, а ты что предлагаешь?


ухты ©   (09.03.18 02:43[69]

Я уже тут предлагал и не раз, только вам оно зачем? ))


TraderProg ©   (12.03.18 22:09[70]

Добавил новую тему, частично похожую на эту, по авторизации у брокера Alpari.
Кому интересно - здесь: http://www.delphimaster.ru/cgi-bin/forum.pl?id=1520881607&n=4


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо