Простой скрипт массовой загрузки JavaScript для библиотеки Humble Bundle возвращает только последний элемент - PullRequest
0 голосов
/ 06 ноября 2018

Пытаюсь создать небольшой JavaScript, который загрузит все мои электронные книги (например) на Humble Bundle. Я понимаю, что нечто подобное уже было сделано ранее, но все решения, с которыми я сталкивался до сих пор, работают в разделе закупки , а не в библиотеке . Я также понимаю, что Humble Bundle в какой-то момент добавил кнопку «массовая загрузка» на каждой странице покупки электронной книги, что сделало вышеупомянутые решения устаревшими.

Я предпочитаю не просить помощи, но сейчас я просто хочу, чтобы мой сценарий работал и узнал, почему это не так. Я не хочу выбирать легкий путь, используя сторонние надстройки или приложения (например, менеджеры загрузки). Я пробовал это и в jQuery, но получил те же результаты, что и ниже. Хотелось бы сделать это в Vanilla JS, но приветствую любые полезные предложения!

Вот мой код:

var domItem = document.querySelectorAll("div.selector-content div.text-holder h2"), domItemName, domItemDownload;
domItem.forEach(function(itemBtn) {
  itemBtn.click();
  domItemName = document.querySelector("div.details-holder div.details-heading div.text-holder h2");
  domItemDownload = document.querySelectorAll("div.details-holder div.js-button-holder div.js-download-button h4");
  domItemDownload.forEach(function(downloadBtn) {
    console.log(domItemName.innerText + ": " + downloadBtn.innerText);
    downloadBtn.click();
  });
});

То, что я ожидаю получить для каждой электронной книги, - это вывод имени электронной книги и типа загружаемой е-книги книги (PDF и т. Д.), А затем переход к URL-адресу, полученному путем нажатия на кнопку загрузки. , Пример URL здесь: https://dl.humble.com/torrents/unixpowertools.mobi.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx.

Это работает, как и ожидалось, до момента, когда он загружает все торрент-файлы: в журнале консоли браузера будет указано, что он перешел на каждый URL-адрес, чтобы загрузить нужный файл, но только последняя запись загружается . Например, скажем, у меня есть три электронные книги, и у каждой из них есть торрент-файл PDF, сценарий будет щелкать все, как ожидалось, и браузер скажет что-то вроде следующего:

CSS Refactoring: PDF main.min.js:10:15514
CSS: The Definitive Guide: PDF main.min.js:10:15514 
D3 Data-Driven Documents Pocket Primer: PDF main.min.js:10:15514     
Navigated to https://dl.humble.com/torrents/cssrefactoring.pdf.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx
Navigated to https://dl.humble.com/torrents/css_thedefinitiveguide.pdf.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx
Navigated to https://dl.humble.com/torrents/d3datadrivendocuments_pocketprimer.pdf.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx

Однако я получу торрент-файл только для этой последней записи. Неважно, что это за электронная книга: прямая загрузка или торрент-файл, независимо от того, где я запускаю и заканчиваю цикл, или использую ли я Chrome или Firefox, я всегда загружаю только файл последней записи.

Итак, увидев, что я могу получить URL для загрузки электронных книг, нажав на кнопки загрузки, я попробовал случайные из них прямо в браузере и смог загрузить каждую из них по отдельности, так что я знаю, что URL работают как и ожидалось. Чтобы получить ожидаемый результат, я скопировал все URL-адреса в журнале консоли и поместил их в массив. Затем я перебрал массив с помощью следующего скрипта, но все равно получил тот же результат:

var urls = [
  'https://dl.humble.com/torrents/cssrefactoring.pdf.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx',
  'https://dl.humble.com/torrents/css_thedefinitiveguide.pdf.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx',
  'https://dl.humble.com/torrents/d3datadrivendocuments_pocketprimer.pdf.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx'
];

for (var i = 0; i < urls.length; i++) {
  document.location.href = urls[i];
};

Судя по моим исследованиям, это звучит как проблема закрытия . Однако использование методов, подобных тем, которые можно найти в https://dzone.com/articles/why-does-javascript-loop-only-use-last-value, не решило проблему. Кроме того, я понимаю, что проблема с закрытием заключается в том, что я не должен видеть, что браузер "перемещается" по каждому URL, а вместо этого ожидаю, что он скажет, что он много раз переходил на один и тот же URL.

Я также подумал, что, возможно, это связано с тем, что браузер слишком быстро загружает слишком много файлов с сервера, поэтому я попытался реализовать ожидание тремя способами: setTimeout, setInterval и написал функцию для пока не истечет указанное время (плохо, я знаю). Это все равно дало тот же результат, но медленнее.

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

Это мой первый пост, поэтому я ценю ваше время, прочитав его, и дайте мне знать, если вам нужна дополнительная информация или мне нужно исправить свой пост.

1 Ответ

0 голосов
/ 06 ноября 2018

Это не связано с замыканиями. Когда вы нажимаете на ссылку, браузер закрывает текущую страницу и открывает новую. Если вы нажмете другую ссылку, когда страница откроется, страница прервет процесс загрузки страницы и откроет новую. Вы получите то же поведение с .click(), которое вызовет перенаправление, которое отменяет предыдущие, поэтому последняя страница открывается.

Вместо этого вы можете открыть каждую ссылку в новой вкладке:

 for (var i = 0; i < urls.length; i++) {
   window.open(urls[i], "download");
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...