[Урок 15] . Загрузка файлов в iMacros+JS стандартным менеджером Firefox с отображением прогресса

Давненько не было уроков, но я наконец избавился от офисного рабства и теперь у меня появилось время. Боты крутятся — бабки мутятся. Сегодня я расскажу, как организовать загрузку любых файлов через стандартный менеджер загрузки Firefox или Palemoon. Речь пойдет о панели браузера «Загрузки». Как обычно, мы будем использовать iMacros и Javascript.  Мы не будем использовать всякие функции, типа XMLHttpRequest, только нативка, только хардкор.
Почти всегда, я узнаю что-то новое в iMacros, когда у меня появляется необходимость написать того или иного бота. Зимой я стал счастливым обладателем Oculus Rift CV1 и мне понадобился бот, который ежедневно мониторит пару сайтов с отборным VR-поревом под Oculus Rift и автоматически скачивает новые ролики:) Меня сложно назвать ноулайфером, но если вы купили окулусы и ни разу ни смотрели в них порево, то вы зря выкинули свои деньги. У меня даже создается впечатление, что их изобретатель именно с этой целью их и создавал. Ну что же, он большой молодец. Приступим!

Сразу говорю, что весь код тестируется на Firefox 35 и iMacros 8.9.7.
Девятая версия — кусок говна и для серьезной разработки никуда не годится. На форумах многие «знатоки» с боевых диванов пишут, что она круче, так как поддерживает «мультипроцессорность», однако, это самое маленькое и самое неважное отличие, как будет время, напишу в чем корень зла девятой версии и почему я разрабатываю под восьмую.

Модули Downloads.jsm и Task.jsm

Для управления закачками, нам понадобится подключить два встроенных модуля Firefox. Модуль Task.jsm предназначен для более удобной работы с асинхронными функциями и «генераторами». Это очень клевые фичи из современного Javascript(ES6). По факту, сегодня в коде мы будем использовать много современных фич, которые тем не менее поддерживаются и нашей несупер-новой версией Firefox.

Модуль Downloads.jsm нужен для взаимодействия и контроля над менеджером закачки Firefox.  С его помощью мы сможем добавлять, удалять и запускать закачки. И появляться они будут ни где-нибудь, а там же, куда попадают файлы, когда вы качаете их обычном способом.

Стрелочные функции, Промисы, Генераторы

Если коротко, то понимание этих вещей, необходимо, чтобы досконально разобраться в коде, который я представлю ниже. Это не самые простые темы и разбирать их в рамках урока я не хочу, это займет кучу времени и текста. К тому же, есть замечательные статьи на эту тему у Ильи Кантора.  Многие посетители моего сайта любят тупо копипастить работающие примеры и клепать из таких кусков настоящих монстров, хоть и слегка уродливых.

Для тех, кто привык досконально разбираться во всех деталях и хочет стать ниндзей, рекомендую досконально изучить следующие ссылки:

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

Загрузка видео при помощи iMacros+JS

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

Полный код макроса(расширение .js должно быть):

iimPlayCode('TAB CLOSEALLOTHERS');
iimPlayCode('SET !EXTRACT_TEST_POPUP NO');
iimPlayCode('SET !ERRORIGNORE YES');
iimPlayCode('SET !TIMEOUT_STEP 0');

Components.utils.import("resource://gre/modules/Downloads.jsm");
Components.utils.import("resource://gre/modules/Task.jsm");


/**
 * Функция для загрузки файлов
 * 
 * @param  {String} source  Ссылка на файл для скачивания
 * @param  {String} target  Имя файла для сохранения
 */
var download = function (source, target) {

	// Создаем задачу на загрузку файла
	Task.spawn( function * () {

		// Получаем объект со списокм загрузок
		var list = yield Downloads.getList(Downloads.ALL);

		// Создаем специальный объект-наблюдатель, который будет мониторить состояние загрузок
		var view = {

			onDownloadAdded: download => {/* тут можно выполнять какие-либо действия при добавлении файла в очередь*/},

			onDownloadChanged: download  => {
				var msg = "Загрузка: " + 
					(download.currentBytes/1024).toFixed(1) + "Kb/" + 
					(download.totalBytes/1024).toFixed(1) + "Kb [ " + download.progress + "% ]\r\n " +
					"File:: " + download.source.url;	

				iimDisplay(msg);
			},

			onDownloadRemoved: download => {/* тут можно выполнять какие-либо действия при удалении файла из очереди*/}
		};

		// Добавляем к менеджеру загрузок нашу функцию-наблюдатель
		yield list.addView(view);

		// Создаем новую закачку
		var download = yield Downloads.createDownload({
			source: source,
			target: target
		});

		// Добавляем новую закачку в список загрузок
		list.add(download);
	
		// Начинаем загрузку
		download.start().then(function () {
			iimDisplay("Загрузка завершена: " + download.source.url);			
		}).catch(function () {
			iimDisplay("Ошибка закачки файла:" + download.source.url);				
		});	

	}).then(function () {
		// Удаляем файл из панели загрузок(не с диска)
		list.removeView(view);
		list.remove(download); 
	}, Components.utils.reportError);


}


// Запускаем функцию закачки
download("https://dv.phncdn.com/videos/201611/02/94802391/1080P_3556k_94802391.mp4?ttl=1503278653&ri=51200000&rs=400000&hash=297d5122b37e538f1e51e0b6909724ec", "c:\\BOTS\\test.mp4");

Не забываем сохранять файл в кодировке «UTF-8 with BOM». Иначе вместо русских символов будут кракозябры.

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

Если тема будет интересна, сделаю еще один урок по полному циклу мониторинга и загрузки контента и видео-контента с разных сайтов.

Как обычно, ваши вопросы и пожелания пишите в комментарии.

14 комментариев

  1. У меня Imacros выдает ошибку -1001 о том, что загрузка капчи в фаерфоксе не поддерживаеться? Как решить проблему?

    Ответить
    • Другую версию макроса скачай. В идеале это 35-й фаерфокс или, ещё лучше пулмун, и макрос 9.8.7
      если не ошибаюсь.

      Ответить
      • это вроде как и в самом посте написано, про версии и т.д., если пациент не умеет читать, то это не лечится

        Ответить
  2. Настройки читает, но не сохраняет… не подскажите в чем ошибка?
    ‘C:\\Users\\’+
    Components.classes[«@mozilla.org/process/environment;1»].getService(Components.interfaces.nsIEnvironment).get(‘USERNAME’)+
    ‘\\Documents\\iMacros\\Macros\\ui.json’

    Ответить
  3. Что делать если например FRAME F= любое значение принимает при каждой перезагрузки страницы? Как поставить постоянное значение?

    Ответить
  4. Когда я нажимаю на рекапчу у меня возникает всегда разное значение F=(число) я попробовал Ваш вариант не получилось, можете ещё посоветовать решение этой проблемы?

    Ответить
    • поищи на форуме мозиллы, там отдельная тема по капче, решений масса, в том числе и правильное применение метода описанного мной
      я не работаю с капчей, так что конкретики не посоветую

      Ответить

Оставить комментарий