// ==UserScript== // @name 图片下载器 // @namespace http://tampermonkey.net/ // @version 3.5.1 // @description 批量下载图片,一个可扩展的图片下载器。 // @author Gscsd // @include * // @icon data:image/jpeg;base64,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 // @grant GM_xmlhttpRequest // @grant GM_download // @grant GM_setValue // @grant GM_log // @grant GM_notification // @grant GM_registerMenuCommand // @connect * // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js // @require https://cdn.bootcdn.net/ajax/libs/jszip/3.7.1/jszip.js // @run-at document-end // @noframes // @compatible Chrome // @compatible Edge // @downloadURL none // ==/UserScript== (function () { 'use strict'; function depthTest(fa, a) { let sum = 0; while (1) { if (a === fa) break; a = $(a).parent()[0]; sum++; } return sum } function FindBrothers(a) { let par = $(a).parent()[0], sea = $(par).find('img').toArray(); if (sea.length === 1) return FindBrothers(par) else { let depth = depthTest(par, getimg), sea1 = []; sea.forEach((item) => { if (depthTest(par, item) === depth) sea1.push(item) }) sea = sea1; if (sea.length === 1) return FindBrothers(par); return sea } } class TaskQueue { downloadIndex = 0; retryIndex = 0; results = []; transfer = []; error = []; //0未下载 1下载排队中 2下载排队完成,等待中 3下载成功 4下载失败 5下载完成 downloadStatus = 0 /** * @description 图片下载类 * @class * @constructor * @param {Object} o 配置对象 * @param {Array} o.imglist 图片下载链接列表 * @param {number=} [o.thread=20] 启用下载线程数 * @param {number=} [o.retryNum = 3] 下载出错,重试次数 * @param {Object=} [o.headers = {}] 图片请求头 * @param {string=} [o.downloadMode = "Zip"] 下载模式,Epub下载需配置扩展名白名单 * @param {string=} [o.author ="佚名"] 作者,生成Epub会用到 * @param {string=} o.filename 文件名,不包含拓展名 * @param {number=} o.timeout 请求超时,默认1min * @param {Boolean=} [o.autoRetry = false] 自动重试 * @param {Boolean=} [o.autoDownload = false] 重试失败后自动下载 * @param {?Function=} [o.onload = null] 成功回调 * @param {?Function=} [o.onerror = null] 失败回调 * @return {null} */ constructor(o) { if ($('#v_bar').length) { GM_notification({text: '下载中,请稍等...', timeout: 3000}) return } ({ imglist: this.queue = [], thread: this.thread = 20, retryNum: this.retryNum = 3, headers: this.headers = {}, downloadMode: this.downloadMode = "Zip", author: this.author = "佚名", filename: this.filename = document.title.replace(/- .*?$/, '').trim(), timeout: this.timeout = 60 * 1000, autoRetry: this.autoRetry = false, autoDownload: this.autoDownload = false, onload: this.onload = null, onerror: this.onerror = null } = o); this.progressList = Array(this.queue.length) $('body').append(`