Не получается загрузить файл. Прошу помощи.

 

Хочу загрузить файл новостей на следующую неделю с http://www.dailyfx.com/calendar, пользуюсь статьей https://www.mql5.com/ru/articles/34, но не получается скачать файл.

Все заканчивается на строке

hURL=InternetOpenUrlW(hInternetSession,addr,"",0,0,0);
#import "wininet.dll"
int InternetAttemptConnect(int x);
int InternetOpenW(string sAgent,int lAccessType,
                  string sProxyName="",string sProxyBypass="",
                  int lFlags=0);
int InternetOpenUrlW(int hInternetSession,string sUrl,
                     string sHeaders="",int lHeadersLength=0,
                     int lFlags=0,int lContext=0);
int InternetCloseHandle(int hInet);
#import

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
   string addr="http://www.dailyfx.com/files/Calendar-08-11-2013.csv";
   int rv = InternetAttemptConnect(0);
   if(rv!=0) {
      Print("DOWNLDR_ERR_CALLINTERNENATTEMPCONNECT");
      return;
   }
   int hInternetSession=InternetOpenW("Microsoft Internet Explorer",0,"","",0);
   if(hInternetSession<=0) {
      Print("DOWNLDR_ERR_CALLINTERNETNOPENW");
      return;
   }
   int hURL=InternetOpenUrlW(hInternetSession,addr,"",0,0,0);
   if(hURL<=0) {
      Print("DOWNLDR_ERR_CALLINTERNETOPENURLW");
      InternetCloseHandle(hInternetSession);
      return;
   }
   Print("OK");
   InternetCloseHandle(hInternetSession);
}
Forex Economic Calendar @ DailyFX
  • www.dailyfx.com
Date Time Currency Event Importance Actual Forecast Previous Notes
 
Talex:

Хочу загрузить файл новостей на следующую неделю с http://www.dailyfx.com/calendar, пользуюсь статьей https://www.mql5.com/ru/articles/34, но не получается скачать файл.

Все заканчивается на строке

Доступ к файлу вроде получен и его можно попробовать прочитать. Посмотрите вот здесь примеры по этой теме: http://www.rsdn.ru/article/inet/inetapi.xml.

Если получится, покажите потом, что Вы сделали. Интересно.

 
tol64:

Доступ к файлу вроде получен.

Вот, как раз доступ к файлу и не могу получить, строка

InternetOpenUrlW(hInternetSession,addr,"",0,0,0);

возвращает 0.

 

Почитал про InternetOpenUrl (http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098%28v=vs.85%29.aspx)

Return value

Returns a valid handle to the URL if the connection is successfully established, or NULL if the connection fails. To retrieve a specific error message, call GetLastError. To determine why access to the service was denied, call InternetGetLastResponseInfo.

Переделал скрипт

#import "wininet.dll"
int InternetAttemptConnect(int x);
int InternetOpenW(string sAgent,int lAccessType,string sProxyName="",string sProxyBypass="",int lFlags=0);
int InternetOpenUrlW(int hInternetSession,string sUrl,string sHeaders="",int lHeadersLength=0,int lFlags=0,int lContext=0);
int InternetCloseHandle(int hInet);
bool InternetGetLastResponseInfoW(int& lpdwError,string& lpszBuffer,int& lpdwBufferLength);
#import "Kernel32.dll"
        int GetLastError(int);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
   string addr="http://www.dailyfx.com/files/Calendar-08-11-2013.csv";
   int rv = InternetAttemptConnect(0);
   if(rv!=0) {
      Print("DOWNLDR_ERR_CALLINTERNENATTEMPCONNECT");
      return;
   }
   int hInternetSession=InternetOpenW("Microsoft Internet Explorer",0,"","",0);
   if(hInternetSession<=0) {
      Print("DOWNLDR_ERR_CALLINTERNETNOPENW");
      return;
   }
   int hURL=InternetOpenUrlW(hInternetSession,addr,"",0,0,0);
   if(hURL<=0) {
      Print("DOWNLDR_ERR_CALLINTERNETOPENURLW");
      int lpdwError=0;
      string lpszBuffer="0123456789";
      int lpdwBufferLength=10;
      if(InternetGetLastResponseInfoW(lpdwError,lpszBuffer,lpdwBufferLength)) {
         Print("Error=",lpdwError);
         Print(lpszBuffer);
         Print("buflen=",lpdwBufferLength);
      }
      else {
         int err=0;
         err=GetLastError(err);
         Print("err=",err);
      }
      InternetCloseHandle(hInternetSession);
      return;
   }
   Print("OK");
   InternetCloseHandle(hURL);
   InternetCloseHandle(hInternetSession); }

Вот лог:


OG    0    07:59:46    test (EURUSD,H1)    DOWNLDR_ERR_CALLINTERNETOPENURLW
FS    0    07:59:46    test (EURUSD,H1)    Error=0
IS    0    07:59:46    test (EURUSD,H1)   
RF    0    07:59:46    test (EURUSD,H1)    buflen=0

Не работает и не понятно почему.

Может быть доступ к файлу *.csv можно (надо) получать другим способом?

P.S. Если путь к файлу http://www.dailyfx.com/files/Calendar-08-11-2013.csv вставить в строку браузера и нажать ENTER, все прекрасно скачивается.

InternetOpenUrl function (Windows)
  • msdn.microsoft.com
Opens a resource specified by a complete FTP or HTTP URL. Syntax Parameters hInternet [in] The handle to the current Internet session. The handle must have been returned by a previous call to InternetOpen. lpszUrl [in] A pointer to a null-terminated string variable that specifies the URL to begin reading. Only URLs beginning with ftp...
 
Talex:

Вот, как раз доступ к файлу и не могу получить, строка

возвращает 0.

А у меня вот такой результат получается:

2013.08.12 10:50:53     ScriptTEST (EURUSD,W1) OK
2013.08.12 10:50:53     ScriptTEST (EURUSD,W1) hURL: 13369360
2013.08.12 10:50:51     ScriptTEST (EURUSD,W1) hInternetSession: 13369352
 Но файл при этом тоже не скачивается.
 
tol64:

А у меня вот такой результат получается:

 Но файл при этом тоже не скачивается.
Чудеса, да и только, сейчас у меня тоже результат как у Вас получается. А файл скачиваться не должен, мы только получили доступ к файлу.
 
Talex:
Чудеса, да и только, сейчас у меня тоже результат как у Вас получается. А файл скачиваться не должен, мы только получили доступ к файлу.

А не подскажите, с помощью какой функции можно скачать файл на диск?

Попробовал функцию GetURLPageAndStoreToDisk(), как это описывалось по ссылке, которую приводил выше, но получаю сообщение, что этой функции в wininet.dll нет.

2013.08.12 14:46:10     ScriptTEST (EURUSD,W1)  unresolved import function call
2013.08.12 14:46:10     ScriptTEST (EURUSD,W1)  Cannot find 'GetURLPageAndStoreToDisk' in 'wininet.dll'
2013.08.12 14:46:10     ScriptTEST (EURUSD,W1)  hURL: 13369372
2013.08.12 14:46:10     ScriptTEST (EURUSD,W1)  hInternetSession: 13369364
 
tol64:

А не подскажите, с помощью какой функции можно скачать файл на диск?

Попробовал функцию GetURLPageAndStoreToDisk(), как это описывалось по ссылке, которую приводил выше, но получаю сообщение, что этой функции в wininet.dll нет.

Да, похоже, что в wininet.dll такой функции нет, проверить можно здесь(http://msdn.microsoft.com/en-us/library/windows/desktop/aa385473%28v=vs.85%29.aspx) Скачать файл можно с помощью InternetReadFile, но лучше сначала ознакомиться со статьями

https://www.mql5.com/ru/articles/73

https://www.mql5.com/ru/articles/276

https://www.mql5.com/ru/articles/34

https://www.mql5.com/ru/code/82

 
Talex:

Да, похоже, что в wininet.dll такой функции нет, проверить можно здесь(http://msdn.microsoft.com/en-us/library/windows/desktop/aa385473%28v=vs.85%29.aspx) Скачать файл можно с помощью InternetReadFile, но лучше сначала ознакомиться со статьями

...

Спасибо! То что надо.
 
Там файл можно скачать только датой выпадающей не воскресный день. Вы пробуете скачать любой другой день кроме воскресения. Потому, я полагаю, у Вас и не получается.
Причина обращения: