您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
add download button in mangarawjp
当前为
// ==UserScript== // @name download mangarawjp // @namespace download-mangarawjp // @version 0.1 // @description add download button in mangarawjp // @author JaHIY // @license GNU GPLv3 // @match https://mangarawjp.one/* // @icon https://mangarawjp.one/favicon.ico // @require https://cdn.jsdelivr.net/npm/@zip.js/[email protected]/dist/zip.min.js // @grant GM_xmlhttpRequest // @connect * // ==/UserScript== (function() { 'use strict'; function createIconElement(iconName) { const span = document.createElement('span'); const i = document.createElement('i'); i.classList.add('fa', `fa-${iconName}`); i.ariaHidden = 'true'; span.classList.add('icon', 'is-size-6'); span.append(i); return span; } function createDownloadElement(pageLink, name) { const btn = document.createElement('button'); const downloadIcon = createIconElement('download'); downloadIcon.dataset.pageLink = pageLink; downloadIcon.dataset.name = name; downloadIcon.classList.add('download-manga'); btn.type = 'button'; btn.classList.add('button', 'is-small'); btn.append(downloadIcon); return btn; } async function findImageLinks(pageLink) { const parser = new DOMParser(); const resp = await fetch(pageLink); const text = await resp.text(); const doc = parser.parseFromString(text, 'text/html'); const images = Array.from(doc.querySelectorAll('.container-chapter-reader .card-wrap img')); const imageLinks = images.map(img => img.dataset.src); return imageLinks; } async function downloadSingleImage(imageLink, pageLink) { const resp = await GM.xmlHttpRequest({ url: imageLink, headers: { referer: pageLink, }, responseType: 'blob', }).catch(e => console.error(e)); const blob = await resp.response; return blob; } async function downloadManga(el) { const clickedElement = el.target.parentNode; if (clickedElement && clickedElement.matches('.download-manga') && clickedElement.dataset.pageLink) { console.log(clickedElement); const pageLink = clickedElement.dataset.pageLink; const name = clickedElement.dataset.name; const imageLinks = await findImageLinks(pageLink); console.log(imageLinks); const imageBlobs = await Promise.all(imageLinks.map(async (imageLink) => await downloadSingleImage(imageLink, pageLink))); const blobWriter = new zip.BlobWriter("application/zip"); const zipWriter = new zip.ZipWriter(blobWriter); const targetLength = imageLinks.length.toString().length; await Promise.all(Array.from(imageBlobs.entries()).map(async ([i, blob]) => { console.log(i, blob); const filename = `${i.toString().padStart(targetLength,'0')}.jpg`; await zipWriter.add(filename, new zip.BlobReader(blob)); })); const zipFile = await zipWriter.close(); const blobURL = URL.createObjectURL(zipFile); const anchor = document.createElement("a"); anchor.download = `${name}.zip`; console.log(anchor.download); anchor.href = blobURL; document.body.appendChild(anchor); anchor.click(); document.body.removeChild(anchor); } } function addClickButton(el) { const anchor =el.querySelector('a.text-info'); const pageLink = anchor.href; const name = anchor.title.replaceAll(/[\\\/:*?"<>|]/g, " ").trim(); const downloadElement = createDownloadElement(pageLink, name); el.append(downloadElement); return el; } document.querySelectorAll('.list-scoll th').forEach(addClickButton); document.querySelector('.list-scoll').addEventListener('click', downloadManga); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址