ChimpTrader Ответов: 2

WebClient в аутохотки-AutoHotkey


Эта работа:
URLDownloadToFile, https://www.nseindia.com/content/historical/EQUITIES/2016/JAN/cm01JAN2016bhav.csv.zip, C:\Users\Dave\Desktop\Happy.zip

Но я не понимаю, почему это не так, даже если синтаксис URL-адреса или формат одинаковы:
URLDownloadToFile, https://www.nseindia.com/content/historical/EQUITIES/2015/DEC/cm31DEC2015bhav.csv.zip, C:\Users\Dave\Desktop\Sad.zip


Что я уже пробовал:

Я нашел приведенный ниже метод, написанный на C# из соц.- узел MSDN по той же причине, но мои навыки АХК очень ограничены. Не могли бы вы помочь преобразовать приведенный ниже C# В AHK?
WebClient objWebClient = new WebClient();
Uri uriWebClient = new Uri(url);
objWebClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
objWebClient.Headers.Add("Content-Type", "application / zip, application / octet - stream");
objWebClient.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
objWebClient.Headers.Add("Referer", "http://Something");
objWebClient.Headers.Add("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
objWebClient.DownloadFile(uriWebClient, filepath);

2 Ответов

Рейтинг:
2

ChimpTrader

Спасибо Ричард,
Я нашел это Страница StackOverflow.
Используя метод загрузки и Ваше предложение, можно получить желаемый результат.

Download( UrlToFile, SaveFileAs:="", Overwrite := True, headers := "", method := "GET", postData := "")
{
	 MsgBox, %headers%
     WinHttpObj := ComObjCreate( "WinHttp.WinHttpRequest.5.1" )
     WinHttpObj.Open( method, UrlToFile )
     For header, value in headers 
         WinHttpObj.SetRequestHeader( header, value )
     WinHttpObj.Send( postData )

     ADODBObj := ComObjCreate( "ADODB.Stream" )
     ADODBObj.Type := 1
     ADODBObj.Open()
     ADODBObj.Write( WinHttpObj.ResponseBody )
     If !SaveFileAs
	 {
         urlSplitArray := StrSplit( UrlToFile, "/" )
         SaveFileAs := urlSplitArray[ urlSplitArray.MaxIndex() ]
     }        
     ADODBObj.SaveToFile( SaveFileAs, Overwrite ? 2:1 )
     ADODBObj.Close()
}

customHeaders := { "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
				 ,"Content-Type": "application / zip, application / octet - stream""application / zip, application / octet - stream"
				 ,"Accept-Encoding": "gzip,deflate,sdch"
				 ,"Referer": "https://www.nseindia.com/products/content/equities/equities/archieve_eq.htm"
				 ,"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }

Download( "https://www.nseindia.com/content/historical/EQUITIES/2015/DEC/cm31DEC2015bhav.csv.zip", "C:\Users\Dave\Desktop\Happy.zip", True, customHeaders )


Рейтинг:
14

Richard Deeming

Потому что возвращается второй URL - адрес 403: Forbidden.

Этот статус ответа означает, что вам не разрешено загружать этот файл, даже если вы прошли проверку подлинности.

Список кодов состояния HTTP - Википедия[^]
HTTP 403 - Википедия[^]

РЕДАКТИРОВАТЬ: Похоже, что сервер проверяет заголовок реферера. Измените его на:

objWebClient.Headers.Add("Referer", "https://www.nseindia.com/products/content/equities/equities/archieve_eq.htm");


ChimpTrader

Спасибо за проявленный интерес!
Однако я могу загрузить файл с веб-сайта вручную.
Ссылка: NSE - Национальная фондовая биржа Индии Ltd.
Дата(ДД-ММ-гггг): 12-31-2015

Цель состоит в том, чтобы загрузить и собрать такие CSV-файлы за каждый день последних 10 лет. Поэтому я не хочу использовать IE COM, так как это сделает скрипт чрезвычайно медленным.

А как иначе, Ричард? Спасибо снова....

С. П.
Пожалуйста посетить
https://social.msdn.microsoft.com/Forums/vstudio/en-US/31a7deb0-b135-4163-b884-3efa35ba6994/webclient-403-forbidden?forum=csharpgeneral

Код-C#, есть ли способ получить тот же результат в AHK?

Richard Deeming

Похоже, что сервер проверяет заголовок реферера. Вам нужно изменить его на:

objWebClient.Headers.Add("Referer", "https://www.nseindia.com/products/content/equities/equities/archieve_eq.htm");