リンクのPDFファイルをzipしてダウンロード
by
Lhankor_Mhy
01/30 [2025/01/30 12:15:30]
ページ内にある~.PDFというリンクすべてからPDFファイルを取得して、zipして一括ダウンロードします(ドメインの壁は越えられません)。保存名はファイル名またはリンクテキスト.pdfの選択です。
@@ -1,6 +1,6 @@
/*
* @title リンクのPDFファイルをzipしてダウンロード
- * @description ページ内にある~.PDFというリンクすべてからPDFファイルを取得して、zipして一括ダウンロードします。
+ * @description ページ内にある~.PDFというリンクすべてからPDFファイルを取得して、zipして一括ダウンロードします。保存名はファイル名またはリンクテキスト.pdfの選択です。
* @include http://*
* @license MIT License
* @javascript_url
@@ -8,43 +8,34 @@
(async () => {
- function _import(s) {
- return new Promise(function (resolve) {
- const script = document.createElement('script');
- script.src = s;
- script.onload = function () {
- resolve();
- };
- document.head.appendChild(script);
- })
- };
-
const sleep = time => new Promise(resolve => setTimeout(resolve, time));
await import('https://cdnjs.cloudflare.com/ajax/libs/jszip/3.2.0/jszip.min.js');
- await _import('https://cdn.jsdelivr.net/npm/file-saver@2.0.2/dist/FileSaver.min.js');
+ const { default: { saveAs } } = await import('https://cdn.jsdelivr.net/npm/file-saver@2.0.5/+esm');
const zip = new JSZip();
+ const path = 'files' + Number(new Date()) + '/';
+
async function downloader(element) {
const response = await fetch(
element.href,
);
element.style.backgroundColor = 'gray';
const fileName = decodeURIComponent(
- element.href.match(/(?=[^\/]+\.pdf)[^\/]+\.pdf/) ??
- element.textContent.match(/(?=[^\/]+\.pdf)[^\/]+\.pdf/)
+ (isUseFileName ?
+ element.href.match(/(?=[^\/]+\.pdf)[^\/]+\.pdf/) :
+ element.textContent.match(/(?=[^\/]+\.pdf)[^\/]+\.pdf/))
+ ?? element.textContent.trim() + ".pdf"
);
- console.log(fileName);
await sleep(2000);
- let blob = await response.blob();
- blob = blob.slice(0, blob.size, "application/pdf")
- let filename = element.textContent.trim();
- if (zip.file('files/' + filename)) { filename = Number(new Date()) + '_' + filename };
- zip.file('files/' + fileName, blob);
+ if (zip.file(path + fileName)) { fileName = Number(new Date()) + '_' + fileName };
+ zip.file(path + fileName, await response.blob());
};
+ const isUseFileName = confirm('URLのファイル名で保存します')
+
for (let target of document.querySelectorAll('a[href*=".pdf"] ')) { await downloader(target).catch(() => { }) };
for (let target of [...document.querySelectorAll('a:not([href*=".pdf"])')].filter(e => e.textContent.includes('pdf') || e.textContent.includes('PDF'))) { await downloader(target).catch(e => { throw e }) };
const content = await zip.generateAsync({ type: "blob" });
/*
* @title リンクのPDFファイルをzipしてダウンロード
* @description ページ内にある~.PDFというリンクすべてからPDFファイルを取得して、zipして一括ダウンロードします。保存名はファイル名またはリンクテキスト.pdfの選択です。
* @include http://*
* @license MIT License
* @javascript_url
*/
(async () => {
const sleep = time => new Promise(resolve => setTimeout(resolve, time));
await import('https://cdnjs.cloudflare.com/ajax/libs/jszip/3.2.0/jszip.min.js');
const { default: { saveAs } } = await import('https://cdn.jsdelivr.net/npm/file-saver@2.0.5/+esm');
const zip = new JSZip();
const path = 'files' + Number(new Date()) + '/';
async function downloader(element) {
const response = await fetch(
element.href,
);
element.style.backgroundColor = 'gray';
const fileName = decodeURIComponent(
(isUseFileName ?
element.href.match(/(?=[^\/]+\.pdf)[^\/]+\.pdf/) :
element.textContent.match(/(?=[^\/]+\.pdf)[^\/]+\.pdf/))
?? element.textContent.trim() + ".pdf"
);
await sleep(2000);
if (zip.file(path + fileName)) { fileName = Number(new Date()) + '_' + fileName };
zip.file(path + fileName, await response.blob());
};
const isUseFileName = confirm('URLのファイル名で保存します')
for (let target of document.querySelectorAll('a[href*=".pdf"] ')) { await downloader(target).catch(() => { }) };
for (let target of [...document.querySelectorAll('a:not([href*=".pdf"])')].filter(e => e.textContent.includes('pdf') || e.textContent.includes('PDF'))) { await downloader(target).catch(e => { throw e }) };
const content = await zip.generateAsync({ type: "blob" });
saveAs(content, 'files.zip');
})()
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。