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

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мб). В логах пишет : результалт ОК

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

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

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
Всем добрый вечер,

Неполучается закончить макрос для скачивание файлов. Сперва пробовал указать папку для загрузки файлов, и скачать напрямую, в окне браусера - все скачается, только файлы бывает разные, от 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 мбит, примерно такая картина



Менее чем за час забил под 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 отчаянно и успешно выполняет ваши таски. Место резервируется перед скачиванием на диске, поэтому не торопитесь прерывать все потоки обновляя информацию о размере папки которая будет не изменой из-за резервации места. В любом случае стоит ограничение на попытки скачивания одного файла и таймауты разумные, все потоки должны добежать до финала.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 373
Благодарностей
3 297
Баллы
113

Olegazzz

Client
Регистрация
09.01.2014
Сообщения
16
Благодарностей
1
Баллы
3
А как прикрутить Referer к снипету запуска aria2c???
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
А как прикрутить 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;
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
А не доводилось ли данной тулзой, скачивать файл в многопотоке, с разных ресурсов одновременно?
Давно пытался, но видимо, что-то не так делал.:(
доводилось, с разных ресурсов - имеется 2+ линка с одинаковым файлом?

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

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

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