您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Manga downloader for jumptoon.com
当前为
// ==UserScript== // @name JumptoonDownloader // @namespace https://github.com/Timesient/manga-download-scripts // @version 0.1 // @license GPL-3.0 // @author Timesient // @description Manga downloader for jumptoon.com // @icon https://jumptoon.com/favicon.ico // @supportURL https://github.com/Timesient/manga-download-scripts/issues // @match https://jumptoon.com/* // @require https://unpkg.com/[email protected]/dist/axios.min.js // @require https://unpkg.com/[email protected]/dist/jszip.min.js // @require https://unpkg.com/[email protected]/dist/FileSaver.min.js // @require https://update.gf.qytechs.cn/scripts/451810/1293977/ImageDownloaderLib.js // @grant GM_xmlhttpRequest // @grant GM_info // ==/UserScript== (async function(axios, JSZip, saveAs, ImageDownloader) { 'use strict'; // reload page when enter or leave chapter const re = /https:\/\/jumptoon\.com\/series\/.*\/episodes\/.*/; const oldHref = window.location.href; const timer = setInterval(() => { const newHref = window.location.href; if (newHref === oldHref) return; if (re.test(newHref) || re.test(oldHref)) { clearInterval(timer); window.location.reload(); } }, 200); // return if not reading chapter now if (!re.test(oldHref)) return; // get episode content unsafeWindow.__userscript_temp__ = []; const functionBodyString = Array .from(document.querySelectorAll('script')) .filter(element => element.textContent.includes('seriesEpisodeContent')) .pop() .textContent .replace('self.__next_f.push', 'window.__userscript_temp__.push'); new Function(functionBodyString)(); const contentString = unsafeWindow.__userscript_temp__.pop().pop(); const content = JSON.parse(contentString.slice(contentString.indexOf('[['))).shift().pop().seriesEpisodeContent; // get title & pages & seed const title = `${content.seriesEpisodeEdge.node.notation}${content.seriesEpisodeEdge.node.title ? ' ' + content.seriesEpisodeEdge.node.title : ''}`; const pages = content.pageList; const seed = `${content.seriesId}:${content.number}`.split('').reduce((acc, cur) => acc + cur.codePointAt(0), 0); // setup ImageDownloader ImageDownloader.init({ maxImageAmount: pages.length, getImagePromises, title }); // add style patch const downloadBtn = document.getElementById('ImageDownloader-DownloadButton'); if (downloadBtn) downloadBtn.style.textAlign = 'center'; // collect promises of image function getImagePromises(startNum, endNum) { return pages .slice(startNum - 1, endNum) .map(page => getDecryptedImage(page) .then(ImageDownloader.fulfillHandler) .catch(ImageDownloader.rejectHandler) ); } // get decrypted image function getDecryptedImage(page) { return new Promise(async resolve => { const imageArrayBuffer = await axios.get(page.imageUrl, { responseType: 'arraybuffer' }).then(res => res.data); const image = document.createElement('img'); image.src = 'data:image/jpg;base64,' + window.btoa(new Uint8Array(imageArrayBuffer).reduce((data, byte) => data + String.fromCharCode(byte), '')); image.onload = function () { // create canvas const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.width = page.width; canvas.height = page.height; // get coords const coords = getCoords(seed, this.width, this.height); // draw pieces for (const coord of coords) { ctx.drawImage(this, ...coord); } canvas.toBlob(resolve); } }); } // seed, scrambledImage.width, scrambledImage.height function getCoords(e, i, t) { const X = (e) => ({ next: () => e = (1664525 * e + 1013904223) % 4294967296 }); const G = (e, i, t) => { let s = Array.from({ length: i}, (e, i) => i) , r = i; 0 !== t && r--; let a = X(e); for (let e = r; e > 1; e--) { let i = a.next() % e; [s[i],s[e - 1]] = [s[e - 1], s[i]] } return s; } let s = Math.floor(i / 21) , r = i % 21 , a = G(e, s, r) , n = Array.from({ length: s }) , l = []; for (let e of a) n[a[e]] = e; for (let e = 0; e < s; e++) { let i = 21 * n[e] + 3 , s = 12 * e; l.push([i, 0, 12, t, s, 0, 12, t]) } if (r) { let e = 21 * s + 3 , i = 12 * s; l.push([e, 0, r, t, i, 0, r, t]) } return l; } })(axios, JSZip, saveAs, ImageDownloader);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址