Давненько не было уроков, но я наконец избавился от офисного рабства и теперь у меня появилось время. Боты крутятся — бабки мутятся. Сегодня я расскажу, как организовать загрузку любых файлов через стандартный менеджер загрузки 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. С его помощью мы сможем добавлять, удалять и запускать закачки. И появляться они будут ни где-нибудь, а там же, куда попадают файлы, когда вы качаете их обычном способом.
Стрелочные функции, Промисы, Генераторы
Если коротко, то понимание этих вещей, необходимо, чтобы досконально разобраться в коде, который я представлю ниже. Это не самые простые темы и разбирать их в рамках урока я не хочу, это займет кучу времени и текста. К тому же, есть замечательные статьи на эту тему у Ильи Кантора. Многие посетители моего сайта любят тупо копипастить работающие примеры и клепать из таких кусков настоящих монстров, хоть и слегка уродливых.
Для тех, кто привык досконально разбираться во всех деталях и хочет стать ниндзей, рекомендую досконально изучить следующие ссылки:
- Стрелочные функции(=>) — https://learn.javascript.ru/es-function и https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_functions
- Промисы(promise) — https://learn.javascript.ru/promise и https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise
- Генераторы(yield) — https://learn.javascript.ru/generator и https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Iterators_and_Generators
Это очень важные разделы, это кубики, без которых почти нереально писать хороший асинхронный код.
Загрузка видео при помощи 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». Иначе вместо русских символов будут кракозябры.
Я не стал выкладывать бота по мониторингу и скачиванию новых видео с интересного вам сайта, чтобы не загромождать код. Думаю, данного примера хватит, чтобы разобраться и сотворить свой чудесный загрузчик контента.
Если тема будет интересна, сделаю еще один урок по полному циклу мониторинга и загрузки контента и видео-контента с разных сайтов.
Как обычно, ваши вопросы и пожелания пишите в комментарии.
Как всегда круто и познавательно. Спасибо.
Очень интересно, спасибо.
У меня Imacros выдает ошибку -1001 о том, что загрузка капчи в фаерфоксе не поддерживаеться? Как решить проблему?
а зачем ее качать? ее скринить надо и отправлять на разгадывание
Другую версию макроса скачай. В идеале это 35-й фаерфокс или, ещё лучше пулмун, и макрос 9.8.7
если не ошибаюсь.
это вроде как и в самом посте написано, про версии и т.д., если пациент не умеет читать, то это не лечится
можно удалить, не в ту ветвь откоментировал
Task.spawn — где почитать про это? Что эта строчка делает?
Настройки читает, но не сохраняет… не подскажите в чем ошибка?
‘C:\\Users\\’+
Components.classes[«@mozilla.org/process/environment;1»].getService(Components.interfaces.nsIEnvironment).get(‘USERNAME’)+
‘\\Documents\\iMacros\\Macros\\ui.json’
К 16 уроку ссори
Что делать если например FRAME F= любое значение принимает при каждой перезагрузки страницы? Как поставить постоянное значение?
попробуй так: FRAME NAME=undefined
Когда я нажимаю на рекапчу у меня возникает всегда разное значение F=(число) я попробовал Ваш вариант не получилось, можете ещё посоветовать решение этой проблемы?
поищи на форуме мозиллы, там отдельная тема по капче, решений масса, в том числе и правильное применение метода описанного мной
я не работаю с капчей, так что конкретики не посоветую