mirror of
https://github.com/peter-tanner/AliExpress-Invoice-Downloader.git
synced 2024-11-30 11:30:17 +08:00
Add userscript
This commit is contained in:
parent
cbcc667426
commit
c968c7d4b9
140
AliExpress-Invoice-Downloader.user.js
Normal file
140
AliExpress-Invoice-Downloader.user.js
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
// ==UserScript==
|
||||||
|
// @name AliExpress Invoice Downloader
|
||||||
|
// @namespace https://www.aliexpress.com
|
||||||
|
// @version 1.0
|
||||||
|
// @description Adds download buttons to the Aliexpress order page (https://www.aliexpress.com/p/order/index.html) and a bulk download button to download all invoices on the order page to save time.
|
||||||
|
// @match https://www.aliexpress.com/p/order/index.html*
|
||||||
|
// @grant GM_download
|
||||||
|
// @author Peter Tanner
|
||||||
|
// @namespace https://github.com/peter-tanner/AliExpress-Invoice-Downloader/
|
||||||
|
// @supportURL https://github.com/peter-tanner/AliExpress-Invoice-Downloader/issues
|
||||||
|
// @updateURL https://github.com/peter-tanner/AliExpress-Invoice-Downloader/AliExpress-Invoice-Downloader.user.js
|
||||||
|
// @license GPL-3.0
|
||||||
|
// @website https://www.petertanner.dev/
|
||||||
|
// ==/UserScript==
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
let orderIds = [];
|
||||||
|
|
||||||
|
function handleDownloadOrNavigate(link, orderId, name) {
|
||||||
|
const downloadButton = document.createElement("button");
|
||||||
|
downloadButton.textContent = "Download Invoice";
|
||||||
|
downloadButton.className = "aliexpress-invoice-download-button";
|
||||||
|
downloadButton.style.marginLeft = "10px";
|
||||||
|
downloadButton.addEventListener("click", () => {
|
||||||
|
downloadInvoice(orderId, name);
|
||||||
|
});
|
||||||
|
|
||||||
|
link.parentNode.appendChild(downloadButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadInvoice(orderId, name) {
|
||||||
|
const sanitizedFileName = sanitizeFileName(name);
|
||||||
|
const url = `https://trade.aliexpress.com/ajax/invoice/invoiceExportAjax.htm?orderId=${orderId}&name=${sanitizedFileName}`;
|
||||||
|
GM_download({
|
||||||
|
url: url,
|
||||||
|
name: `invoice_${orderId}_${sanitizedFileName}.pdf`,
|
||||||
|
onerror: function (error) {
|
||||||
|
console.error("Error downloading:", error);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function sanitizeFileName(name) {
|
||||||
|
const sanitized = name.replace(/[^\x00-\x7F]/g, "").replace(/\s+/g, "_");
|
||||||
|
return sanitized.substring(0, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
function addDownloadAllButton() {
|
||||||
|
const downloadAllButton = document.createElement("button");
|
||||||
|
downloadAllButton.textContent = "Download All Invoices";
|
||||||
|
downloadAllButton.className = "aliexpress-download-all-button";
|
||||||
|
downloadAllButton.style.position = "fixed";
|
||||||
|
downloadAllButton.style.bottom = "10px";
|
||||||
|
downloadAllButton.style.left = "10px";
|
||||||
|
downloadAllButton.style.zIndex = "1000";
|
||||||
|
downloadAllButton.style.backgroundColor = "red";
|
||||||
|
downloadAllButton.style.color = "white";
|
||||||
|
downloadAllButton.style.padding = "10px";
|
||||||
|
downloadAllButton.style.border = "none";
|
||||||
|
downloadAllButton.style.cursor = "pointer";
|
||||||
|
downloadAllButton.addEventListener("click", () => {
|
||||||
|
orderIds.forEach((order) => {
|
||||||
|
downloadInvoice(order.orderId, order.name);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.body.appendChild(downloadAllButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createDownloadButtons() {
|
||||||
|
const invoiceItems = document.querySelectorAll("div.order-item");
|
||||||
|
invoiceItems.forEach((item) => {
|
||||||
|
const nameElement = item.querySelector(
|
||||||
|
"div.order-item-content-info-name"
|
||||||
|
);
|
||||||
|
const name = nameElement ? nameElement.textContent.trim() : "";
|
||||||
|
const link = item.querySelector(
|
||||||
|
"div.order-item-header > div.order-item-header-right > a"
|
||||||
|
);
|
||||||
|
if (link) {
|
||||||
|
const href = link.getAttribute("href");
|
||||||
|
if (href) {
|
||||||
|
const url = new URL(href, window.location.href);
|
||||||
|
const orderId = url.searchParams.get("orderId");
|
||||||
|
if (orderId) {
|
||||||
|
orderIds.push({ orderId: orderId, name: name });
|
||||||
|
handleDownloadOrNavigate(link, orderId, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const observerCallback = (mutationsList) => {
|
||||||
|
for (let mutation of mutationsList) {
|
||||||
|
if (mutation.type === "childList") {
|
||||||
|
const addedNodes = mutation.addedNodes;
|
||||||
|
addedNodes.forEach((node) => {
|
||||||
|
if (node.matches && node.matches("div.order-item")) {
|
||||||
|
const nameElement = node.querySelector(
|
||||||
|
"div.order-item-content-info-name"
|
||||||
|
);
|
||||||
|
const name = nameElement ? nameElement.textContent.trim() : "";
|
||||||
|
const link = node.querySelector(
|
||||||
|
"div.order-item-header > div.order-item-header-right > a"
|
||||||
|
);
|
||||||
|
if (link) {
|
||||||
|
const href = link.getAttribute("href");
|
||||||
|
if (href) {
|
||||||
|
const url = new URL(href, window.location.href);
|
||||||
|
const orderId = url.searchParams.get("orderId");
|
||||||
|
if (orderId) {
|
||||||
|
orderIds.push({ orderId: orderId, name: name });
|
||||||
|
handleDownloadOrNavigate(link, orderId, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const startObserverWhenReady = () => {
|
||||||
|
const targetNode = document.querySelector("div.comet-checkbox-group");
|
||||||
|
if (targetNode) {
|
||||||
|
const observer = new MutationObserver(observerCallback);
|
||||||
|
const config = { childList: true, subtree: true };
|
||||||
|
observer.observe(targetNode, config);
|
||||||
|
} else {
|
||||||
|
setTimeout(startObserverWhenReady, 100);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
startObserverWhenReady();
|
||||||
|
addDownloadAllButton();
|
||||||
|
createDownloadButtons();
|
||||||
|
})();
|
Loading…
Reference in New Issue
Block a user