Советники: News EA Template without DLL - страница 4

 
Oleg Pavlenko #:

Всем привет!

Адрес "http://ec.forexprostools.com/" перестал работать.



Добрый вечер.

https://ec.forexprostools.com/   работает

 
Oleksii Chepurnyi #:


Добрый вечер.

https://ec.forexprostools.com/   работает

Спасибо!

Что-то я сам не попробовал этот вариант. Наверное "уставший" был.

Спасибо еще раз!

 

Всем привет!

Получал новости с https://ec.forexprostools.com без проблем.

С какого-то времени советник престал получать новости и соответственно перестал их учитывать.

Код получения новостей реализован так:

string headers;

   char post[],result[];

   int res;


   ResetLastError();

   //res = WebRequest("GET", url, NULL, NULL, 5000, post, 0, result, headers); //--- загрузка html-страницы

   res = WebRequest("GET", url, NULL, 5000, post, result, headers); //--- загрузка html-страницы

   

   if (res == -1) {

      Print("Ошибка в WebRequest. Код ошибки  =", GetLastError());

      MessageBox("Необходимо добавить адрес '" + url + "' в список разрешенных URL во вкладке 'Советники'", "Ошибка", MB_ICONINFORMATION);

   } else {

      PrintFormat("Файл успешно загружен, Размер файла =%d байт.",ArraySize(result));

      int filehandle = FileOpen("MyPage.htm", FILE_WRITE|FILE_BIN);

      if (filehandle != INVALID_HANDLE) {

         FileWriteArray(filehandle, result, 0, ArraySize(result));

         FileClose(filehandle);

      } else {

         Print("Ошибка в FileOpen. Код ошибки =",GetLastError());

      }

   }


То что получается в файле  "MyPage.htm" см. во вложении в zip архиве  "MyPage.zip"

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

С любого другого сайта все скачивается и сохраняется в файл без проблем, т.е. код рабочий. Но вот с https://ec.forexprostools.com проблема...

"News EA Template without DLL" - таже самая проблема...

Может кто-то сталкивался с этой проблемой и уже сеть решение?

Буду очень признателен любым идеям!

Заранее благодарю!

Файлы:
MyPage.zip  4 kb
 
Oleg Pavlenko #:

Всем привет!

Получал новости с https://ec.forexprostools.com без проблем.

С какого-то времени советник престал получать новости и соответственно перестал их учитывать.


Там написано черным по белому: Enable JavaScript and cookies to continue.

Веб-реквест умеет сохранять и отдавать куки, а JavaScript - не поддерживает.

Один из выходов - протрейсить работу JavaScript в браузере и повторить её на MQL5.

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

 
Stanislav Korotky #:

Там написано черным по белому: Enable JavaScript and cookies to continue.

Веб-реквест умеет сохранять и отдавать куки, а JavaScript - не поддерживает.

Один из выходов - протрейсить работу JavaScript в браузере и повторить её на MQL5.

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

"... потом взять из него полученные куки и добавить в веб-реквест в эксперте ..." - Можете поподробнее объяснить как вытащить куки, например их Google Chrome, и если их там будет несколько, какие именно использовать?

Можете пример привести с вытаскиванием куки?

 
Oleg Pavlenko #:

"... потом взять из него полученные куки и добавить в веб-реквест в эксперте ..." - Можете поподробнее объяснить как вытащить куки, например их Google Chrome, и если их там будет несколько, какие именно использовать?

Можете пример привести с вытаскиванием куки?

Заходите на страницу сайта, открываете Инструменты разработчика из меню настроек или по нажатию Ctrl+Shift+I. Где-то там (может отличаться в зависимости от производителя и версии браузера) будет перечень куков. Все их пары ключ=значение нужно будет точно перенести в WebRequest.

Куки сайта в браузере

Но нет гарантии, что на сайте нет других защит (проверки по User-Agent (это можно добавить в WebRequest по аналогии с куками) или вычислений ответов на запросы в JavaScript (это можно выяснить только реверс-инжинирингом)).

 
Stanislav Korotky #:

Заходите на страницу сайта, открываете Инструменты разработчика из меню настроек или по нажатию Ctrl+Shift+I. Где-то там (может отличаться в зависимости от производителя и версии браузера) будет перечень куков. Все их пары ключ=значение нужно будет точно перенести в WebRequest.


Но нет гарантии, что на сайте нет других защит (проверки по User-Agent (это можно добавить в WebRequest по аналогии с куками) или вычислений ответов на запросы в JavaScript (это можно выяснить только реверс-инжинирингом)).

Если я правильно понял, то мне нужно добавить в WebRequest все эти выделенные на скриншоте ниже "ключ=значение" ?


Только каким образом это записать в этот код вместо cookie=NULL  ?

Пробовал прописать через & не вышло.

string cookie=NULL,headers;

   char post[],result[];

   string TXT="";

   int res;

   string tmpStr="";

   string google_url="https://ec.forexprostools.com/?columns=exc_currency,exc_importance&category=_employment,_economicActivity,_inflation,_credit,_centralBanks,_confidenceIndex,_balance,_Bonds&importance=1,2,3&countries=25,6,37,72,22,17,39,10,35,43,60,36,110,26,12,4,5&calType=week&timeZone=15&lang=1";

//---

   ResetLastError();

//--- download html-pages

   int timeout=10000;

   res=WebRequest("GET",google_url,cookie,NULL,timeout,post,sizeof(post),result,headers);

Исходник прилагаю

Файлы:
News_EA.mq4  24 kb
 
Oleg Pavlenko #:

Если я правильно понял, то мне нужно добавить в WebRequest все эти выделенные на скриншоте ниже "ключ=значение" ?

Только каким образом это записать в этот код вместо cookie=NULL  ?

Пробовал прописать через & не вышло.


Не надо амперсанд. Вот выжимка по отправке куков.

Cookie: name=value; name2=value2; name3=value3
В использованную в данном коде урезанную версию WebRequest нужно передавать эту строку без заголовка "Cookie: ", или воспользоваться второй версией WebRequest, которая позволяет указать полностью весь http-заголовок (в нем можно другой строкой (через \r\n) и "User-Agent:" указать типа браузера).
Cookie - HTTP | MDN
Cookie - HTTP | MDN
  • 2023.04.10
  • developer.mozilla.org
The HTTP request header contains stored HTTP cookies associated with the server (i.e. previously sent by the server with the header or set in JavaScript using ). The header is optional and may be omitted if, for example, the browser's privacy settings block cookies.
 
Stanislav Korotky #:
User-Agent:

Спасибо за ответ!

Получилось реализовать без использования Cookie так:

string cookie="Content-Type: application/x-www-form-urlencoded\r\nUser-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",

...

string referer="https://mql5.com/";

res=WebRequest("GET",google_url,cookie,referer,timeout,post,sizeof(post),result,headers);

Файл получен и данные с него считываются прекрасно

Если использовать для MT5, то при сохранении / чтении файла нужно прописать FILE_ANSI:

int filehandle=FileOpen("News.html",FILE_WRITE|FILE_BIN|FILE_ANSI); // пишем в файл

int filehandle2=FileOpen("News.html",FILE_READ|FILE_BIN|FILE_ANSI); // читаем из файла

Для совместного доступа к файлу с новостями можно добавить FILE_SHARE_WRITE и FILE_SHARE_READ соответственно.

Ну или кэшировать запросы..

@Stanislav Korotky - Еще раз спасибо за ваши советы!!!

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.10.26
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

Еще забыл сказать, что в случае с Инвестингом (а может и с другими сайтами), для МТ5 нужно делать не GET а POST запрос.

Например так:

string headers,result_headers;

char post[],result[];

string url = urlPar; //-- Valid URL


string payload= "parameterA=testA&parameterB=testB"; //-- Valid Parameters

StringToCharArray(payload,post,0,StringLen(payload),CP_UTF8);

headers = "Content-Type: application/x-www-form-urlencoded\r\nUser-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36";

//--- Reset the last error code

ResetLastError();

int timeout=5000;

//--

int res=WebRequest("POST",url,headers,timeout,post,result,result_headers);

...//--- дальше делаем нужные действия, сохраняем, читаем, парсим и т.д....


Причина обращения: