// ==UserScript==
// @name         JD SKU商品名图片单独文件夹下载
// @namespace    jd-sku-folder-img
// @version      8.0
// @match        *://*.jd.com/*
// @grant        GM_download
// ==/UserScript==

(function () {
    'use strict';

    function safeName(str) {
        return String(str || "")
            .trim()
            .replace(/[\\/:*?"<>|]/g, "_")
            .replace(/\s+/g, " ")
            .slice(0, 120);
    }

    function cleanImg(url) {
        if (!url) return "";

        url = url.trim();

        if (url.startsWith("//")) {
            url = "https:" + url;
        }

        return url
            .replace(/s\d+x\d+_/, "")
            .replace(".avif", "")
            .replace(".webp", "");
    }

    function getImg(item) {
        let img = item.querySelector(".jPic img") || item.querySelector("img");
        if (!img) return "";

        return img.getAttribute("data-src")
            || img.getAttribute("data-lazy-img")
            || img.getAttribute("src")
            || "";
    }

    function getTitle(item) {
        return item.querySelector(".jDesc a")?.innerText?.trim()
            || item.querySelector(".p-name a")?.innerText?.trim()
            || item.querySelector("a")?.innerText?.trim()
            || "";
    }

    function downloadImg(url, sku, title) {
        let folderName = safeName(sku) + "----" + safeName(title);

        GM_download({
            url: url,
            name: folderName + "/" + "主图.jpg",
            saveAs: false,
            onerror: function (e) {
                console.log("下载失败:", folderName, url, e);
            }
        });
    }

    function waitForGoods(callback) {
        let timer = setInterval(function () {
            let items = document.querySelectorAll("#J_GoodsList .gl-item");

            console.log("检测商品数量:", items.length);

            if (items.length > 0) {
                clearInterval(timer);
                callback(items);
            }
        }, 1000);
    }

    function run(items) {
        let count = 0;

        items.forEach(function (item) {
            let sku = item.querySelector("[data-sku]")?.getAttribute("data-sku");
            if (!sku) return;

            let title = getTitle(item);
            if (!title) return;

            let img = cleanImg(getImg(item));
            if (!img) return;

            downloadImg(img, sku, title);

            console.log("SKU:", sku);
            console.log("商品名:", title);
            console.log("文件夹:", sku + "----" + title);
            console.log("图片:", img);

            count++;
        });

        alert("完成下载:" + count + " 张图片");
    }

    let btn = document.createElement("button");
    btn.innerText = "单独文件夹下载";
    btn.style.cssText = `
        position:fixed;
        right:20px;
        top:120px;
        z-index:999999;
        padding:10px 14px;
        background:red;
        color:white;
        border:none;
        border-radius:4px;
        cursor:pointer;
        font-size:14px;
    `;

    btn.onclick = function () {
        waitForGoods(run);
    };

    document.body.appendChild(btn);

})();


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。