// ==UserScript== // @name Alist直链导出Excel工具 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 导出Alist直链Excel工具,支持多选导出,支持导出文件夹内所有文件直链,支持导出文件夹内所有文件夹直链, // @author 稀饭 // @match https://改成你的Alist域名/* // @grant none // @require https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.mini.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.2/FileSaver.min.js // ==/UserScript== (function () { "use strict"; let base_url = "https://alist.xifan.fun/"; function debounce(func, wait) { let timeout; return function () { let context = this; let args = arguments; clearTimeout(timeout); timeout = setTimeout(function () { func.apply(context, args); }, wait); }; } function exportExcelUi() { let centerToolbar = document.querySelector(".center-toolbar"); if (centerToolbar) { let div = centerToolbar.querySelector("div"); let excelBtn = ` `; let parser = new DOMParser(); let svgElement = parser.parseFromString( excelBtn, "image/svg+xml" ).documentElement; let tooltip = document.createElement("div"); tooltip.style.display = "none"; tooltip.style.position = "absolute"; tooltip.style.background = "#333"; tooltip.style.color = "#fff"; tooltip.style.padding = "5px"; tooltip.style.borderRadius = "5px"; tooltip.style.fontSize = "13px"; tooltip.textContent = "导出直链"; let style = document.createElement("style"); style.innerHTML = ` #tooltip::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #333 transparent transparent transparent; } `; document.head.appendChild(style); tooltip.id = "tooltip"; svgElement.addEventListener( "mouseover", debounce(function (event) { let rect = svgElement.getBoundingClientRect(); tooltip.style.display = "block"; tooltip.style.left = window.scrollX + rect.left + rect.width / 2 - 30 + "px"; tooltip.style.top = window.scrollY + rect.top - 32 + "px"; }, 10) ); svgElement.addEventListener( "mouseout", debounce(function () { tooltip.style.display = "none"; }, 10) ); let sixthElement = div.children[5]; if (sixthElement) { div.insertBefore(svgElement, sixthElement); } else { div.appendChild(svgElement); } document.body.appendChild(tooltip); svgElement.addEventListener("click", function () { let list = Array.from(document.querySelectorAll(".list-item")); let checkedList = list.filter((item) => { let checkbox = item.querySelector('input[type="checkbox"]'); return checkbox && checkbox.checked; }); let result = []; for (let item of checkedList) { let nameElement = item.querySelector("p.name"); if (nameElement.textContent.includes(".")) { result.push({ 标题: nameElement.textContent, 直链: item.href.replace( base_url, `${base_url}d/` ), }); } else { alert(`${nameElement.textContent} 不是文件,无法导出直链}`); } } if (result.length > 0) { let worksheet = XLSX.utils.json_to_sheet(result); let workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1"); let excelBuffer = XLSX.write(workbook, { type: "array", bookType: "xlsx", }); let excelBlob = new Blob([excelBuffer], { type: "application/xlsx" }); saveAs(excelBlob, "直链.xlsx"); alert("导出成功"); } }); } } var callback = function (mutationsList, observer) { for (let mutation of mutationsList) { if (mutation.type === "childList") { for (let node of mutation.addedNodes) { if ( node.nodeType === Node.ELEMENT_NODE && node.matches(".center-toolbar") ) { exportExcelUi(); } } } } }; var observer = new MutationObserver(callback); var config = { childList: true, subtree: true }; observer.observe(document.body, config); })();