繁体   English   中英

Humble Bundle库的简单JavaScript批量下载脚本仅返回最后一项

[英]Simple JavaScript bulk-download script for Humble Bundle library is only returning the last item

尝试制作一个小的JavaScript,以将我的所有电子书(例如)下载到Humble Bundle上。 我意识到以前已经做过这样的事情,但是到目前为止,我所遇到的所有解决方案都在“ 购买”部分中进行,而不是在库中进行 我还意识到,Humble Bundle有时会在每个电子书购买页面上添加一个“批量下载”按钮,从而使上述解决方案过时。

我宁愿不寻求帮助,但在这一点上,我只想使我的脚本起作用,并了解为什么不起作用。 我不想使用任何第三方加载项或应用程序(例如下载管理器)采取简单的方法。 我也曾在jQuery中尝试过此方法,但是下面得到了相同的结果。 想在普通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 : https://dl.humble.com/torrents/unixpowertools.mobi.torrent?gamekey=xxxxx&ttl=xxxxx&t=xxxxx

在下载所有 torrent文件之前,此操作均按预期进行:浏览器控制台日志将显示它已导航至每个URL来下载所需的文件,但仅下载了最后一个条目 例如,假设我有三本电子书,每个电子书都有一个PDF torrent文件,脚本将按预期单击所有内容,浏览器将显示类似以下内容:

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

但是,我只会获得最后一个条目的种子文件。 无论是什么类型的电子书,无论是直接下载还是torrent文件,无论我在哪里开始和结束循环,还是使用Chrome或Firefox,我始终只下载最后一个条目的文件。

因此,在看到我可以通过单击下载按钮获得电子书的下载URL之后,我直接在浏览器中尝试了随机的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。

我还认为这可能是浏览器尝试过快地从服务器下载太多文件的问题,因此我尝试通过三种方式实现等待: setTimeoutsetInterval ,并将函数编写为while循环直到指定的时间已经过去了(不好,我知道)。 这仍然给出相同的结果,但速度较慢。

我确信问题很简单,但是之前已经完成并放弃了多次这项特殊任务,所以我只需要一组新鲜的,更有经验的眼睛。

这是我的第一篇文章,非常感谢您阅读本文,并告诉我您是否可能需要其他信息,或者是否需要修正我的文章。

它与闭包无关。 当您单击链接时,浏览器将关闭当前页面并打开一个新页面。 如果在页面打开时单击另一链接,则该页面将中止页面的加载过程,而是打开新的链接。 使用.click()会得到相同的行为,将导致重定向中止先前的重定向,因此将打开最后一页。

相反,您可以在新标签页中打开每个链接:

 for (var i = 0; i < urls.length; i++) {
   window.open(urls[i], "download");
 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM