网页图片下载

生成一个批量下载网页图片的按钮,点击后直接下载。目前支持网站:1. 微信公众号网页 2. 微博网页 3.其他网页使用通用方法下载

当前为 2024-10-28 提交的版本,查看 最新版本

// ==UserScript==
// @name         网页图片下载
// @version      v1.5
// @description  生成一个批量下载网页图片的按钮,点击后直接下载。目前支持网站:1. 微信公众号网页 2. 微博网页 3.其他网页使用通用方法下载
// @author       nixingshiguang
// @match        http*://*/*
// @exclude      http*://www.xiaohongshu.com/*
// @exclude      *127.0.0.1*
// @icon         https://cftc.160621.xyz/file/8d23583061c79384c94e0.png
// @grant        GM_download
// @namespace https://greasyfork.org/users/943170
// ==/UserScript==

(function () {
    'use strict';

    /**
     * 附加功能,隐藏滚动条
     */
    // 获取页面上的样式表
    var style = document.createElement('style');
    document.head.appendChild(style);
    var sheet = style.sheet;

    // 添加自定义滚动条样式
    sheet.insertRule('::-webkit-scrollbar { display: none; }', 0);

    /**
     * 网页图片下载功能
     */
    window.onload = function () {
        // 创建一个按钮
        var dlb = document.createElement('button');

        //设置按钮内容和样式
        dlb.innerHTML = '下载图片';
        dlb.style.position = 'fixed';
        dlb.style.top = '100px';
        dlb.style.color = 'black';
        dlb.style.right = '10px';
        dlb.style.zIndex = '9999';
        dlb.style.borderRadius = '10px';
        dlb.style.padding = '10px';
        dlb.style.border = '0';
        dlb.style.backgroundColor = 'white';
        dlb.style.boxShadow = '0 0 5px 5px skyblue ';
        dlb.style.opacity = '0.5';

        // 将按钮添加到页面中
        document.body.appendChild(dlb);

        // 提前声明图片元素变量
        var imgElements;

        // 获取当前日期
        var today = new Date();

        // 格式化日期为 "aaaa-aa-aa"
        var year = today.getFullYear();
        var month = ('0' + (today.getMonth() + 1)).slice(-2);
        var day = ('0' + today.getDate()).slice(-2);
        var formattedDate = year + '-' + month + '-' + day;

        // 生成随机字符串
        function random_string(length) {
            let result = '';
            const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
            const charactersLength = characters.length;
            for (let i = 0; i < length; i++) {
                result += characters.charAt(Math.floor(Math.random() * charactersLength));
            }
            return result;
        }

        // 通用下载代码
        function universal() {
            // 给按钮绑定点击事件
            dlb.addEventListener('click', function () {
                // 获取页面上所有的img元素
                imgElements = document.querySelectorAll('img');
                //执行下载
                download();
            });
        }

        // 微信公众号下载代码
        function wxggh() {
            //给按钮绑定点击事件
            dlb.addEventListener('click', function () {
                // 判断是图文链接、还是图片文字链接
                // 获取用于判断的元素
                var diff = document.querySelector("#js_article");

                // 判断
                if (diff) {
                    if (diff.classList.contains('share_content_page')) {
                        // 获取页面上所有的img元素
                        imgElements = document.querySelectorAll('.swiper_item img');
                    } else {
                        // 获取页面上所有的img元素
                        imgElements = document.querySelectorAll('#img-content img');
                    }
                }

                //执行下载
                download();
            })
        };

        // 微博下载代码
        function weibo() {
            //给按钮绑定点击事件
            dlb.addEventListener('click', function () {
                console.clear();
                console.group("微博图片下载");
                // 获取底部图片元素
                imgElements = document.querySelectorAll(".Viewer_prevItem_McSJ4 img");
                var count = 1;
                //替换字符,生成原图url
                imgElements.forEach(function (img) {
                    console.log("下载第" + count + "张图片");
                    count++;
                    var src = img.getAttribute("src");
                    var real_src = src.replace("orj360", "large");

                    // 创建一个 XMLHttpRequest 对象
                    var xhr = new XMLHttpRequest();
                    xhr.open('GET', real_src, true);
                    xhr.responseType = 'blob';

                    xhr.onload = function () {
                        if (xhr.status === 200) {
                            var blob = xhr.response;

                            // 创建一个 <a> 标签
                            var link = document.createElement('a');
                            link.style.display = 'none';
                            document.body.appendChild(link);

                            // 创建一个 URL 对象
                            var url = window.URL.createObjectURL(blob);

                            // 设置 <a> 标签的 href 属性为 Blob URL
                            link.href = url;

                            // 设置下载图片的文件名
                            link.download = formattedDate + '.jpg'; // 可以根据需要修改文件名

                            // 模拟点击下载
                            link.click();

                            // 释放 URL 对象
                            window.URL.revokeObjectURL(url);

                            // 移除 <a> 标签
                            document.body.removeChild(link);
                        }
                    };

                    xhr.send();
                });
                console.log("下载完成");
                console.groupEnd();
            });
        }

        // 手机版网页微博下载代码
        function weiboMobie() {
            //给按钮绑定点击事件
            dlb.addEventListener('click', function () {
                console.clear();
                console.group("微博手机版图片下载");
                // 获取底部图片元素
                imgElements = document.querySelectorAll("img[data-v-5deaae85]");
                var count = 1;
                //替换字符,生成原图url
                imgElements.forEach(function (img) {
                    console.log("下载第" + count + "张图片");
                    count++;
                    var src = img.getAttribute("src");
                    var real_src = src.replace("orj360", "large");

                    // 创建一个 XMLHttpRequest 对象
                    var xhr = new XMLHttpRequest();
                    xhr.open('GET', real_src, true);
                    xhr.responseType = 'blob';

                    xhr.onload = function () {
                        if (xhr.status === 200) {
                            var blob = xhr.response;

                            // 创建一个 <a> 标签
                            var link = document.createElement('a');
                            link.style.display = 'none';
                            document.body.appendChild(link);

                            // 创建一个 URL 对象
                            var url = window.URL.createObjectURL(blob);

                            // 设置 <a> 标签的 href 属性为 Blob URL
                            link.href = url;

                            // 设置下载图片的文件名
                            link.download = formattedDate + '.jpg'; // 可以根据需要修改文件名

                            // 模拟点击下载
                            link.click();

                            // 释放 URL 对象
                            window.URL.revokeObjectURL(url);

                            // 移除 <a> 标签
                            document.body.removeChild(link);
                        }
                    };

                    xhr.send();
                });
                console.log("下载完成");
                console.groupEnd();
            });
        }

        // 下载按钮点击事件的通用代码
        function download() {
            // // 清空控制台内容
            // console.clear();
            console.group("图片下载脚本");
            // 存储所有img元素的data-src属性值
            var imageUrls = [];
            // 声明计数变量
            var count = 1;
            imgElements.forEach(function (img) {
                var dataSrc = img.getAttribute('data-src');
                var Src = img.getAttribute('src');
                if (dataSrc) {
                    console.log('从dataSrc获取的第' + count + '张的图片链接');
                    imageUrls.push(dataSrc);
                } else {
                    console.log("从src获取的第" + count + "张的图片链接");
                    imageUrls.push(Src);
                }
                count += 1;
            });
            console.log("下载开始");
            console.log(imageUrls);
            imageUrls.forEach(function (url) {
                GM_download({
                    url: url,
                    name: formattedDate + random_string(4) + '.jpg'
                    // name: url.substring(url.lastIndexOf('/') + 1)
                });
            });
            console.log("下载结束");
            console.groupEnd();
        }

        // 通过判断当前网址来执行不同的下载获取图片代码
        // 获取当前网页url
        var currentUrl = window.location.href;

        // 使用Switch匹配执行代码
        switch (true) {
            //匹配微信公众号推文:mp.weixin.qq.com/s/
            case currentUrl.includes("mp.weixin.qq.com/s/"):
                wxggh();
                break;
            //匹配微博原图:https://weibo.com/*?layerid=
            case currentUrl.includes("https://weibo.com/"):
                weibo();
                break;
            //匹配微博手机版原图:https://m.weibo.cn/
            case currentUrl.includes("https://m.weibo.cn/"):
                weiboMobie();
                break;
            // 使用通用下载代码
            default:
                universal();
        }
    }
})();