【最新可用】小红书无水印下载图片视频笔记

小红书无水印下载图片视频笔记

目前为 2024-10-25 提交的版本。查看 最新版本

// ==UserScript==
// @name         【最新可用】小红书无水印下载图片视频笔记
// @namespace    teacher_dog
// @version      0.1.2
// @description  小红书无水印下载图片视频笔记
// @author       teacherDog
// @match        https://www.xiaohongshu.com/explore*
// @icon         https://vitejs.dev/logo.svg
// @grant             unsafeWindow
// @grant             GM_xmlhttpRequest
// @grant             GM_setClipboard
// @grant             GM_setValue
// @grant             GM_getValue
// @grant             GM_deleteValue
// @grant             GM_openInTab
// @grant             GM_registerMenuCommand
// @grant             GM_unregisterMenuCommand
// @grant             GM.getValue
// @grant             GM.setValue
// @grant             GM_info
// @grant             GM_notification
// @grant             GM_getResourceText
// @grant             GM_openInTab
// @grant             GM_addStyle
// @grant             GM_download
// @license           Apache
// ==/UserScript==

(function() {
    //'use strict';

    /**
     * 使用方法:
     * 点击页面上的:下载笔记图片 蓝色按钮,点击下载图片,即可完成下载。
     */

    var document = window.document;
    let getPageDatadiv = document.createElement('div');
    getPageDatadiv.setAttribute('onclick', 'return window;');


    function getPageData() {
        let rootWindow = getPageDatadiv.onclick();
        return rootWindow ? rootWindow.__INITIAL_STATE__ : null;
    }


    var selectedImg = [];

    var dialog = document.createElement("dialog");
    dialog.setAttribute('id', 'wsyImgsBox');
    dialog.setAttribute('style', "width:80%;height:80%;padding: 0;border: none;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);border-radius: 5px;overflow: hidden;background: white;display:flex;flex-direction: column;");

    var dialogTitle = document.createElement("div");
    dialogTitle.setAttribute('style', "box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);font-size:22px;font-weight: bold;padding:6px 12px;");
    dialogTitle.innerText = "标题";
    dialog.appendChild(dialogTitle);

    var dialogMain = document.createElement("div");
    dialogMain.innerText = "内容";
    dialogMain.setAttribute('style', "width: 100%;flex: 1;padding:6px 12px;overflow-y:auto;display: flex;flex-direction: row;justify-content: space-evenly;flex-wrap: wrap;");
    dialog.appendChild(dialogMain);

    var dialogFooter = document.createElement("div");
    dialogFooter.setAttribute('style', "padding:6px 12px;display: flex;flex-direction: row;justify-content: center;");
    var dialogFooterCancelBt = document.createElement("div");
    dialogFooterCancelBt.innerText = "关闭";
    dialogFooterCancelBt.setAttribute('style', "color: #333;font-size: 16px;padding: 10px 20px;background-color: #f0f0f0;border: none;border-radius: 5px;cursor: pointer;margin: 0 12px;");
    dialogFooterCancelBt.addEventListener("click", function () {
        dialog.close();
    });
    var dialogFooterCancelOk = document.createElement("div");
    dialogFooterCancelOk.innerText = "下载图片";
    dialogFooterCancelOk.setAttribute('style', "color: #ffffff;font-size: 16px;padding: 10px 20px;background-color: #409EFF;border: none;border-radius: 5px;cursor: pointer;margin: 0 12px;");
    dialogFooterCancelOk.addEventListener("click", function () {
        if (!selectedImg || selectedImg.length === 0) {
            alert("请先选中图片");
            return;
        }
        for (let i = 0; i < selectedImg.length; i++) {
            let item = selectedImg[i];
            let imgUrl = item.url;
            let name = item.name;
            let imgEl = item.imgEl;
            fetch(imgUrl).then(async res=>{
                if (!res.ok) {
                    throw new Error('Network response was not ok');
                }
                //let type = res.headers.get("Content-Type");
                let blob = await res.blob();
                let type = blob.type;
                if (type === "image/webp") {
                    const url = URL.createObjectURL(blob);
                    const img = new Image();
                    img.onload = function() {
                        const canvas = document.createElement('canvas');
                        const ctx = canvas.getContext('2d');
                        canvas.width = img.width;
                        canvas.height = img.height;
                        ctx.drawImage(img, 0, 0);
                        canvas.toBlob(function(transBlob) {
                            triggerDownload(transBlob, name + '.jpg');
                        }, 'image/jpeg');
                        URL.revokeObjectURL(url);
                    };
                    img.src = url;
                } else if (type === "image/png") {
                    triggerDownload(blob, name + '.png');
                } else if (type === "image/jpg" || type === "image/jpeg") {
                    triggerDownload(blob, name + '.jpg');
                } else if (type === "image/gif") {
                    triggerDownload(blob, name + '.gif');
                } else {
                    triggerDownload(blob, name + '.jpg');
                }

            }).catch(e=>{
                console.error("下载错误", e);
            });
        }

    });
    dialogFooter.appendChild(dialogFooterCancelOk);
    dialogFooter.appendChild(dialogFooterCancelBt);
    dialog.appendChild(dialogFooter);

    document.getElementsByTagName("body")[0].appendChild(dialog);

    var control = document.createElement("div");
    control.innerText = "下载笔记图片";
    control.setAttribute('style', 'position:fixed; top:60px; left:24px; padding:6px 12px; background-color:#409EFF;color:#ffffff;z-index:99999999;border-radius: 12px;cursor: pointer;');
    // 初始化变量
    // 初始化变量
    var posX = 0, posY = 0, posInitX = 0, posInitY = 0;
    var isActive = false;

    // 拖动开始事件
    control.onmousedown = function(e) {
        e.preventDefault(); // 阻止默认事件
        e.stopPropagation(); // 阻止事件冒泡


        //console.log("指针点下", isActive);
        // 获取鼠标点击的初始位置
        posInitX = e.clientX;
        posInitY = e.clientY;

        // 添加事件监听器以处理拖动和释放
        document.onmousemove = dragMouseMove;
        document.onmouseup = dragMouseUp;
    };

    // 拖动事件
    function dragMouseMove(e) {
        //console.log("控件拖动", isActive);
        isActive = true; // 激活拖动状态
        if (isActive) {
            e.preventDefault(); // 阻止默认事件
            // 计算新位置
            posX = posInitX - e.clientX;
            posY = posInitY - e.clientY;

            // 设置div新位置
            control.style.top = (control.offsetTop - posY) + "px";
            control.style.left = (control.offsetLeft - posX) + "px";

            // 更新初始位置
            posInitX = e.clientX;
            posInitY = e.clientY;
        }
    }

    // 停止拖动事件
    function dragMouseUp() {
        //console.log("停止拖动", isActive)
        if (isActive) {
            isActive = false; // 停止拖动状态
            document.onmousemove = null; // 移除mousemove事件监听器
            document.onmouseup = null; // 移除mouseup事件监听器
        } else {
            isActive = false;
            // 处理点击事件
            showImgsBox();
            document.onmousemove = null; // 移除mousemove事件监听器
            document.onmouseup = null; // 移除mouseup事件监听器
        }
    }


    function showImgsBox(){
        if (isActive) {
            return;
        }
        let pageData = getPageData();
        if (!pageData) {
            alert("请先点击一篇笔记呀!");
            return;
        }
        let noteData = JSON.parse(JSON.stringify(pageData.note));
        let currentNoteId = noteData.currentNoteId._value;
        //console.log("currentNoteId", currentNoteId);
        if (!currentNoteId) {
            alert("请先点击一篇笔记呀!");
            return;
        }
        dialog.showModal();
        let noteDetail = noteData.noteDetailMap[currentNoteId];
        let note = noteDetail.note;
        let title = note.title;
        let imageList = note.imageList;
        let imageSize = imageList.length;


        dialogTitle.innerText = "(" + imageSize + "p)" + title;

        dialogMain.innerHTML = '';
        selectedImg = [];
        for (let i = 0; i < imageList.length; i++) {
            let item = imageList[i];
            let url = item.urlDefault;
            let imgItemBox = document.createElement("div");
            imgItemBox.setAttribute('style', "width:180px;height:fit-content;margin-right: 12px;margin-bottom: 12px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);border: 1px solid #f0f0f0;position: relative;display: block;");
            let imgEl = document.createElement("img");
            imgEl.setAttribute('style', "width:100%;height:auto;display: block;");
            imgEl.setAttribute("src", url);
            imgItemBox.appendChild(imgEl);
            dialogMain.appendChild(imgItemBox);

            let imgData = {
                url: url,
                imgEl: imgEl,
                name: "小红书-"+title+"["+(i+1)+"]"
            }
            selectedImg.push(imgData);
        }

    }



    document.getElementsByTagName("body")[0].appendChild(control);






    function triggerDownload(blob, filename) {
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = filename || 'downloaded';
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }













    // Your code here...
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址