Перейти к содержанию

Программа-загрузчик(1)


Рекомендуемые сообщения

Итак, нужно написать программку, которая будет скачивать определенный файл с определенного линка.

Линк файла будет меняться в программе, т.е. vk.com/video1 - скачали - записали на диск - дальше уже будет vk.com/video2 эта цифра должна автоматически прибавляться по еденичке.

При этом, она будет менять его расширение (не конвертировать, а просто менять расширение с .ts на .avi)

И переименовывать. Имя будет задаваться путем номера скачиваемого файла. Т.е. качаю второй файл - изменить название файла на 2.avi  (к примеру)

 

Как я представляю себе работу программы:

1. Берем линк, например, vk.com/video1 и проверяем его на существование. 

2. Линк существует, качаем видео по этому линку (vk.com/video1)

3. Скачали, меняем его имя на его порядковый номер (vk.com/video1) + .avi (меняем формат и имя)  = 1.avi 

4. Записываем получившееся на диск в заранее заданную папку. Любую.

5. Прибавляем счетчик загруженных файлов. vk.com/video1 -> vk.com/video2 (прибавляем счетчик на одну цифру)

 

Собственно, всё. Это уже получился цикл. Он завершится тогда, когда от нового значение счетчика не придет ложь (первый пункт "проверка на существование" вернет false).

Возможно ли такое написать?

P.s. линк vk.com/video произвольный и не является реальной ссылкой.

Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

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

Линк = http://cloud.foxford.ru/hls/webinar-23801.mp4/123.ts (жирные цифры - те, которые будут меняться при загрузке.

P.s. модеры добавьте это в шапку

Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

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

 

P.s. модеры добавьте это в шапку

Что в твоем понимании "облачный" сервак?

Ссылка на комментарий
Поделиться на другие сайты

Любой линк, в названии которого есть "cloud". 

У меня плохие новости для тебя.

Почитай, хотя бы что такое "облако".

https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BB%D0%B0%D1%87%D0%BD%D0%BE%D0%B5_%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BB%D0%B0%D1%87%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F

-----

По поводу выдергивания видео со страницы, ты можешь хорошенько изучить структуру сайта (исходный код страниц, js код) и наверняка найдешь там, способ получения видео.

Ссылка на комментарий
Поделиться на другие сайты

winhttp заюзай. там примеров на С++ море. а можно готовое заюзать - wget +cmd винды..

Эм... а что такое "wget + cmd винды"?

Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

Если не брезгуешь C#, то вот пример скачивания аватары через .bat файл (сохранить как *.bat , разрешить фаерволлу или антивирю запустить)

 

 

1. Не нужна среда разработки, не нужно устанавливать компилятор

2. Похож на C++

3. Код короткий, описания и примеры на MSDN

Поменяй код под свою задачу, чтобы по циклу скачивал и сохранял, и дело в шляпе.

/*@echo off && cls && echo Loading... && echo.set WinDirNet=%WinDir%\Microsoft.NET\Frameworkif exist "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"if exist "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"if exist "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe"if "%csc%" == "" ( echo .NET Framework not found! && echo. && pause && exit )%csc% /nologo /out:"%~dpnx0.exe" "%~dpnx0"if not "%ERRORLEVEL%" == "0" ( echo. && pause && exit )cls"%~dpnx0.exe" %*del "%~dpnx0.exe"exit*/using System;using System.Net;using System.Net.Sockets;public class Example{    public static void Main()    {        string remoteUri = @"http://forum.gamehacklab.ru/uploads/profile/";        string fileName = "photo-1.jpg", myStringWebResource = null;        WebClient myWebClient = new WebClient();        myStringWebResource = remoteUri + fileName;        Console.WriteLine(myStringWebResource);        myWebClient.DownloadFile(new Uri(myStringWebResource), fileName);        Console.WriteLine(fileName, myStringWebResource);    }}
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

У большинства облачных хранилищ есть свое API и даже SDK.
Ну, а то, что в API для облака есть метод загрузки файла можно и не сомневаться, а потом просто переименовать скаченный файл.

Ссылка на комментарий
Поделиться на другие сайты

Если не брезгуешь C#, то вот пример скачивания аватары через .bat файл (сохранить как *.bat , разрешить фаерволлу или антивирю запустить)

 

 

1. Не нужна среда разработки, не нужно устанавливать компилятор

2. Похож на C++

3. Код короткий, описания и примеры на MSDN

Поменяй код под свою задачу, чтобы по циклу скачивал и сохранял, и дело в шляпе.

 

Я не умею писать на с#, только на c++. 

/*@echo off && cls && echo Loading... && echo.set WinDirNet=%WinDir%\Microsoft.NET\Frameworkif exist "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"if exist "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"if exist "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe"if "%csc%" == "" ( echo .NET Framework not found! && echo. && pause && exit )%csc% /nologo /out:"%~dpnx0.exe" "%~dpnx0"if not "%ERRORLEVEL%" == "0" ( echo. && pause && exit )cls"%~dpnx0.exe" %*del "%~dpnx0.exe"exit*/using System;using System.Net;using System.Net.Sockets;public class Example{    public static void Main()    {        string remoteUri = @"http://forum.gamehacklab.ru/uploads/profile/";        string fileName = "photo-1.jpg", myStringWebResource = null;        WebClient myWebClient = new WebClient();        myStringWebResource = remoteUri + fileName;        Console.WriteLine(myStringWebResource);        myWebClient.DownloadFile(new Uri(myStringWebResource), fileName);        Console.WriteLine(fileName, myStringWebResource);    }}
Ссылка на комментарий
Поделиться на другие сайты

если ссылки прямые, то можно не изобретать велосипед и зделать как советуют "профи":

доворачиваем для работоспособности дерективы:

С путями:

Написано "на коленке" и не в коем случаи не притендует на полную работоспособность. Предаставлен в качестве алгоритма действий)

NullAlex: Большой код принято оборачивать в спойлер. Читай FAQ по тегу.

bool DownloadFile(char* szUrl, char* szPath){	HINTERNET hOpen = NULL;	HINTERNET hFile = NULL;	HANDLE hOut = NULL;	char* lpBuffer = NULL;	DWORD dwBytesRead = 0;	DWORD dwBytesWritten = 0;	hOpen = InternetOpen("MyAgent", NULL, NULL, NULL, NULL);	if (!hOpen) return false;	hFile = InternetOpenUrl(hOpen, szUrl, NULL, NULL, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, NULL);	if (!hFile) {		InternetCloseHandle(hOpen);		return false;	}	char sz_velikost[50];	//DWORD dwBytesRead = 0;	DWORD dwTOTALSize = sizeof(sz_velikost);	BYTE buffer[2048];		/*dwTOTALSize =*/ HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dwTOTALSize, 0);	int temp = atoi((LPCTSTR)sz_velikost);	sprintf(Info_Key, "%d", temp);	MessageBoxA(0, Info_Key, 0, 0);//Info_Key	hOut = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);	if (hOut == INVALID_HANDLE_VALUE)	{		InternetCloseHandle(hFile);		InternetCloseHandle(hOpen);		return false;	}		do {		lpBuffer = new char[2000];		ZeroMemory(lpBuffer, 2000);		InternetReadFile(hFile, (LPVOID)lpBuffer, 2000, &dwBytesRead);		WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL);		delete[] lpBuffer;		lpBuffer = NULL;	} while (dwBytesRead);	CloseHandle(hOut);	InternetCloseHandle(hFile);	InternetCloseHandle(hOpen);	return true;}
#include <wininet.h>#pragma comment(lib,"wininet")
DownloadFile("http://*************/files/starter/File.rar", "File.rar");
start:int i = 0;char Path[MAX_SIZE];char strURL[MAX_SIZE];sprintf_s(Path,"SaveFile_%i.avi",i);sprintf_s(strURL,"http://*************/files/VideoFile_%i.avi",i);if(DownloadFile(strURL, Path)){i++;      goto start;//если любитель АСМ то можеша красиво оформить  _asm jmp start}
Ссылка на комментарий
Поделиться на другие сайты

Написано "на коленке" и не в коем случаи не притендует на полную работоспособность. Предаставлен в качестве алгоритма действий)

NullAlex: Совсем необязательно цитировать большое сообщение полностью. Устное предупреждение.

Выдает оочень много ошибок. Поменял на мультибайтовую кодировку - ничего. И вот тут: char Path[MAX_SIZE]; жирный шрифт не определен

lJZkykQ.png

Ссылка на комментарий
Поделиться на другие сайты

Выдает оочень много ошибок. Поменял на мультибайтовую кодировку - ничего. И вот тут: char Path[MAX_SIZE]; жирный шрифт не определен

ОК))

Смотри:

Создаю проект(Win32 - Консоль), прописываю туда код, который предоставил выше. Дабавляю немного визуализации и логгирования(по минимуму). ЗАливаю файл на Rghost.ru (Ссылка) (для тестирования, так как этот сервис отдает прямые ссылки). Получаем(Ниже спойлер):

 

 

Я не учитывал некоторые моменты, но алгоритм рабочий... дальше сам))

 

oaMto5u.png

 

 

 

 

 

ЗЫ: Где прочитать про теги и BB-коды?

#include #include #include #include #pragma comment(lib,"wininet")int i = 0;bool DownloadFile(char* szUrl, char* szPath){HINTERNET hOpen = NULL;HINTERNET hFile = NULL;HANDLE hOut = NULL;char* lpBuffer = NULL;DWORD dwBytesRead = 0;DWORD dwBytesWritten = 0;hOpen = InternetOpen("MyAgent", NULL, NULL, NULL, NULL);if (!hOpen) return false;hFile = InternetOpenUrl(hOpen, szUrl, NULL, NULL, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, NULL);if (!hFile) {InternetCloseHandle(hOpen);return false;}hOut = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);if (hOut == INVALID_HANDLE_VALUE){InternetCloseHandle(hFile);InternetCloseHandle(hOpen);return false;}do {lpBuffer = new char[2000];ZeroMemory(lpBuffer, 2000);InternetReadFile(hFile, (LPVOID)lpBuffer, 2000, &dwBytesRead);WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL);delete[] lpBuffer;lpBuffer = NULL;} while (dwBytesRead);CloseHandle(hOut);InternetCloseHandle(hFile);InternetCloseHandle(hOpen);return true;}int Start(){start:char Path[MAX_PATH];char strURL[MAX_PATH] = "http://rghost.ru/download/68vBbLW9C/19ac08e7d180849ffcf9ea77b4fbf4c5ea812587/Dx11_ModelLogger%20x64.dll";sprintf_s(Path, "Dx11_ModelLogger__%i.dll", i);//sprintf_s(strURL, "http://*************/files/VideoFile_%i.avi",i);if (DownloadFile(strURL, Path)){i++;printf("SaveFile::%s \n", Path);_asm jmp start}elsereturn 0;}int main(){SetConsoleTitle("[DEMO]RockHammer");Start();getch();return 0;}
Изменено пользователем Xipho
Заголовок у спойлера тоже указывать обязательно.
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Смотри:

Создаю проект(Win32 - Консоль), прописываю туда код, который предоставил выше. Дабавляю немного визуализации и логгирования(по минимуму). ЗАливаю файл на Rghost.ru (Ссылка) (для тестирования, так как этот сервис отдает прямые ссылки). Получаем(Ниже спойлер):

Всё теже ошибки... Похоже, что функции внутри библиотеки wininet не распознаются. И sprintf_s функция отсутствует (подключил iostream, всё равно)

Конкретно, не распознаются функции:

1. InternetOpen

2. InternetOpenUrl

3. InternetCloseHandle

4. HttpQueryInfoW

5. Info_Key

6. InternetReadFile

7. sprintf_s  (писал выше)

 

Все ошибки, которые выскакивают - находятся внутри бибилотеки wininet.

Делал всё по инструкции. 100%.

P.s. У тебя слегка битый код под спойлером. Всё отрывочно... Или так задумано?) 

Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

Все ошибки, которые выскакивают - находятся внутри бибилотеки wininet. Делал всё по инструкции. 100%. P.s. У тебя слегка битый код под спойлером. Всё отрывочно... Или так задумано?)

 

 

незнаю как прекрепить фаилы к сообщение, поэтому внешняя ссылка на полный проект:

Скачать (в архиве нету исполняемых фаилов)

 

 

Если так же будут ошибки, то смотри в сторону комплекта своего MS SDK.

Ссылка на комментарий
Поделиться на другие сайты

незнаю как прекрепить фаилы к сообщение, поэтому внешняя ссылка на полный проект:

Скачать (в архиве нету исполняемых фаилов)

 

 

Если так же будут ошибки, то смотри в сторону комплекта своего MS SDK.

Спасибо, заработало :)

Правда до сих пор не пойму как... Ведь тоже самое было... Может быть студия слегка приболела.

 

Образовалась новая проблемка))

Нужно преобразовать это:

http://cloud.foxford.ru/hls/webinar-23801.mp4/119.ts

В это:

char strURL[MAX_PATH] = "http://cloud.foxford.ru/hls/webinar-23801.mp4/" + i + ".ts";

Где i = порядковому номеру загрузки. Дело в том, что этих .ts файлов там дофигища, начиная с первого. нужно все их загрузить. 

Можно ли так сделать со ссылкой, чтобы редактировать её внутри программы?

Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

char strURL[MAX_SIZE];sprintf_s(strURL,"http://cloud.foxford.ru/hls/webinar-23801.mp4/%i.ts",i);

Нет, не в логах, а в ссылке самой.

Просто сайт, который я хочу "обмануть" разбил один видео файл на кучу маленьких.  Нужно все эти маленькие файлы скачать, благо они расположены по одному адресу, только номер файла меняется (это самый конец ссылки)

Ссылка на комментарий
Поделиться на другие сайты

char strURL[MAX_SIZE];

sprintf_s(strURL,"http://cloud.foxford.ru/hls/webinar-23801.mp4/%i.ts",i);

2 IntelliSense: идентификатор "MAX_SIZE" не определен -> исправил на MAX_PATH, заиграло.

 

P.s. как ограничить это всё? Тоесть сделать условие цикла, чтоли: загрузка продолжается, пока ссылка рабочая. Т.е. я не знаю конечную цифру загрузки: может быть это будет 1000, а может 1543.

Сейчас прога очень хорошо загружает, но нужно чтобы она это загрузила и выкинула сообщение что завершила работу, т.е. типо всё, приехали.

Или делать чек: если загружаемый файл меньше либо равно 2 кб - то не загружать его, или удалять.
Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

А на C# код очень простой. Грузит последовательно до 1КК файлов до первой ошибки. Опять же если не брезгуешь, *,bat, C#. Всего лишь запустить батник из папки и в неё все закачается до первой ошибки. Анивирь или фаервол отключить либо заранее, либо добавить в разрешение во время работы.

 

 

* Перед применением скрипта стоит обратить внимание на условия пользовательского соглашения (я уже не помню ссылку на него). Копирование данных запрещено этим способом. Хотя ссылки на медиа файлы публичные и постоянны, что странно.

 

Также код выше подходит для многих сайтов, которые разбивают видео файлы на куски. Если известная хотя бы одна из ссылок, то можно скачать все последовательно.

/*@echo off && cls && echo Loading... && echo.set WinDirNet=%WinDir%\Microsoft.NET\Frameworkif exist "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"if exist "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"if exist "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe"if "%csc%" == "" ( echo .NET Framework not found! && echo. && pause && exit )%csc% /nologo /out:"%~dpnx0.exe" "%~dpnx0"if not "%ERRORLEVEL%" == "0" ( echo. && pause && exit )cls"%~dpnx0.exe" %*del "%~dpnx0.exe"exit*/using System;using System.Net;using System.Net.Sockets;public class Example{    public static void Main()    {        string remoteUri = @"http://cloud.foxford.ru/hls/webinar-23801.mp4/";        string fileNameMask = "{0}.ts", myStringWebResource = null;        WebClient myWebClient = new WebClient();		int countError = 0;				for(var i=0; i<=1000000; i++)		{			try			{				var fileName = string.Format(fileNameMask, i);				myStringWebResource = remoteUri + fileName;				Console.WriteLine(myStringWebResource);				myWebClient.DownloadFile(new Uri(myStringWebResource), fileName);				Console.WriteLine(fileName, myStringWebResource);			}			catch			{				countError++;			}						if(countError > 0)				break;		}    }}
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.