Скачивание файлов

  • Автор темы Автор темы pavel1977
  • Дата начала Дата начала

pavel1977

Client
Регистрация
05.02.2018
Сообщения
2
Реакции
0
Баллы
1
Всем добрый вечер,

Неполучается закончить макрос для скачивание файлов. Сперва пробовал указать папку для загрузки файлов, и скачать напрямую, в окне браусера - все скачается, только файлы бывает разные, от 10мб до 600мб, их много, нехочу поставить очень длинный timeout.

Почитал здесь в форуме, нашел пример и попробовал через C# Get:
var resultHttpGet = ZennoPoster.HttpGet("https://domain.com:2083/cpsess0166097862/getbackup/backup-2-20-2018.tar.gz", "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 150000,"","",true,1,new[] {""},@"C:\test\");

Файл скачает в C:\test\ неполностью,только 38кб (вместо 20мб). В логах пишет : результалт ОК

Подскажите пожалста, что не так делаю?

Спасибо заранее
 
Всем добрый вечер,

Неполучается закончить макрос для скачивание файлов. Сперва пробовал указать папку для загрузки файлов, и скачать напрямую, в окне браусера - все скачается, только файлы бывает разные, от 10мб до 600мб, их много, нехочу поставить очень длинный timeout.

Почитал здесь в форуме, нашел пример и попробовал через C# Get:
var resultHttpGet = ZennoPoster.HttpGet("https://domain.com:2083/cpsess0166097862/getbackup/backup-2-20-2018.tar.gz", "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 150000,"","",true,1,new[] {""},@"C:\test\");

Файл скачает в C:\test\ неполностью,только 38кб (вместо 20мб). В логах пишет : результалт ОК

Подскажите пожалста, что не так делаю?

Спасибо заранее

Встречал подобную проблему что со стандартным экшеном. что через сниппеты.

Во первых проверьте, скачивается ли файлы у вас просто в брузере полностью, с учетом тех же настроек а именно vpn/прокси/dns.

Во вторых решил проблему проще и куда производительней, используя снипет для вызова cmd. Поищи на форуме топик с мануалом и примером как использовать curl через c#.
Замени curl.exe и в сниппете вызов на aria2c
https://aria2.github.io/

использую в аргументах следующую конструкцию
Код:
Развернуть Свернуть Копировать
-c -d {-Project.Directory-}\FolderToSave http://{-Variable.url-}
где
докачивать если был не скачан полностью
-d директория в которую сохранить скачиваемый файл
Имя файла будет таким-же как и храниться на сервере. В случае совпадения добавляется индекс 1... к названию (причем если файл "дубликат" он будет докачивать. если они совпадают названиями будут скачены 2)
Конечный аргумент у это ссылка на файл: http://{-Variable.url-}, причем в случае требования http(s) подключения, aria2c переключиться на требуемое (юзерам wget должна быть знакома проблема, у curl есть опция "L" при которой откинуть http(s):// и просто указывать ссылки с доменом)

Также можно добавить различный опций которые можно глянуть aria2c --help.

Результат всей конструкции показал отличный результат.
Тестировалось на списке в 35.000 файлов. размерами от килобайта до 32 гигабайт.
При 50 потоках на курпных файлах упиралось все в канал (и наличие свободного места на диске xD )
На маленьких спокойно пускал в 200 потоков (можно и больше, но у меня список рандомный был)

Канал 200 мбит, примерно такая картина

Oymh0QG.jpg


Менее чем за час забил под 300 гигабайт диск

Снипет запуска aria2c, аргументы в переменной ARGUMENTS
Код:
Развернуть Свернуть Копировать
System.Diagnostics.ProcessStartInfo processStartInfo = new System.Diagnostics.ProcessStartInfo();
processStartInfo.CreateNoWindow = true;
processStartInfo.FileName = project.Directory + "\\aria2c.exe";
processStartInfo.Arguments = project.Variables["ARGUMENTS"].Value.Trim();
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardOutput = true;

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = processStartInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd().Trim();
process.WaitForExit();
if (process.ExitCode != 0)
{
    throw new Exception("ERROR");
}

return output;

Из плюшек имеем отличный стабильный даунлоадер, с параллелизация и многопоточностью.
P.s. Если очень большие файлы, иногда может показаться что потоки зависли, но на деле aria2c отчаянно и успешно выполняет ваши таски. Место резервируется перед скачиванием на диске, поэтому не торопитесь прерывать все потоки обновляя информацию о размере папки которая будет не изменой из-за резервации места. В любом случае стоит ограничение на попытки скачивания одного файла и таймауты разумные, все потоки должны добежать до финала.
 
А как прикрутить Referer к снипету запуска aria2c???
 
А как прикрутить Referer к снипету запуска aria2c???

--referer=<REFERER>
Задать HTTP источник запроса (Referer). Влияет на все HTTP/HTTPS-загрузки. Если задано *, то URI загрузки будет также использован как источник запроса. Это может быть полезно при использовании вместе с параметром --parameterized-uri.




C#:
Развернуть Свернуть Копировать
string customReferrer = project.Variables["YOU_REFERER"].Value;

System.Diagnostics.ProcessStartInfo processStartInfo = new System.Diagnostics.ProcessStartInfo();
processStartInfo.CreateNoWindow = true;
processStartInfo.FileName = project.Directory + "\\aria2c.exe";
processStartInfo.Arguments = $" --referer=\"{customReferrer}\" {project.Variables["ARGUMENTS"].Value.Trim()}";
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardOutput = true;

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = processStartInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd().Trim();
process.WaitForExit();
if (process.ExitCode != 0)
{
    throw new Exception("ERROR");
}

return output;
Как-то так в переменной YOU_REFERER.
Либо глобальный конфиг aria2c в директории юзера, можно задать глобально

Или вариант с Referer как url загрузки (не тестил)
C#:
Развернуть Свернуть Копировать
System.Diagnostics.ProcessStartInfo processStartInfo = new System.Diagnostics.ProcessStartInfo();
processStartInfo.CreateNoWindow = true;
processStartInfo.FileName = project.Directory + "\\aria2c.exe";
processStartInfo.Arguments = " --referer=* "+ project.Variables["ARGUMENTS"].Value.Trim();
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardOutput = true;

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = processStartInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd().Trim();
process.WaitForExit();
if (process.ExitCode != 0)
{
    throw new Exception("ERROR");
}

return output;
 
А не доводилось ли данной тулзой, скачивать файл в многопотоке, с разных ресурсов одновременно?
Давно пытался, но видимо, что-то не так делал.:(
доводилось, с разных ресурсов - имеется 2+ линка с одинаковым файлом?

пробовал, есть конечно в этом профит, когда download предельно печален =) но не сказать прям уж в N раз увеличивает. + мне кажется еще будет завесить от allocation метода, как припомню в винде довольно скудный выбор или вообще один всего (мб один адекватный).

wget2 нормально так грызет, используя рационально доступную ширину link'а, особенно на рекурсии =)
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)