Download All Images from Pixabay

Download all images from Pixabay

// ==UserScript==
// @name         Download All Images from Pixabay
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Download all images from Pixabay
// @author       @themrsami
// @match        *://*.pixabay.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Function to download images
    function downloadImages() {
        let images = document.images;
        let imageNames = [];

        for (let i = 0; i < images.length; i++) {
            let src = images[i].src;
            let url = new URL(src);
            let pathname = url.pathname.substring(1);
            let parts = pathname.split('/');
            let filename = parts[parts.length - 1];
            let [name, extension] = filename.split('.');

            if (extension === 'png' || extension === 'jpg' || extension === 'jpeg') {
                name = name.split('_')[0];
                filename = `${name}.${extension}`;
                imageNames.push(filename);
            }
        }

        imageNames = [...new Set(imageNames)];
        let baseUrl = 'https://pixabay.com/images/download/';

        for (let imageName of imageNames) {
            let downloadUrl = baseUrl + imageName;

            fetch(downloadUrl)
                .then(response => {
                    let contentLength = response.headers.get('Content-Length');

                    if (contentLength !== null) {
                        let sizeInBytes = Number(contentLength);
                        let sizeInKB = sizeInBytes / 1024;

                        if (sizeInKB > 100) {
                            return response.blob();
                        } else {
                            throw new Error('Image is less than 100 KB');
                        }
                    } else {
                        throw new Error('Could not determine image size');
                    }
                })
                .then(blob => {
                    let url = window.URL.createObjectURL(blob);
                    let a = document.createElement('a');
                    a.href = url;
                    a.download = imageName;
                    document.body.appendChild(a);
                    a.click();
                    document.body.removeChild(a);
                })
                .catch(error => console.error('Error:', error));
        }

        alert('Images are being downloaded!');
    }

    // Create a card
    let card = document.createElement('div');
    card.style.position = 'fixed';
    card.style.top = '10px';
    card.style.left = '10px';
    card.style.zIndex = '9999';
    card.style.padding = '20px';
    card.style.borderRadius = '5px';
    card.style.backgroundColor = '#333';
    card.style.boxShadow = '0 2px 5px rgba(0, 0, 0, 0.3)';
    card.style.color = '#fff';
    card.style.width = '500px';
    card.style.transition = '0.3s';

    // Create tabs
    let tabs = document.createElement('div');
    tabs.style.display = 'flex';
    tabs.style.justifyContent = 'space-between';
    tabs.style.marginBottom = '20px';

    // Create tab labels
    let tabLabels = ['Home', 'Instructions', 'Author Info'];

    // Create tabs
    let tabElements = tabLabels.map(label => {
        let tab = document.createElement('div');
        tab.innerHTML = label;
        tab.style.cursor = 'pointer';
        tab.style.padding = '10px';
        tab.style.backgroundColor = '#555';
        tab.style.borderRadius = '5px';
        tab.style.transition = '0.3s';
        tab.onmouseover = function() {
            this.style.backgroundColor = '#777';
        };
        tab.onmouseout = function() {
            this.style.backgroundColor = (tab === activeTab) ? '#777' : '#555';
        };
        tab.addEventListener('click', () => setActiveTab(tab));
        return tab;
    });

    // Set active tab
    let activeTab = tabElements[0];
    activeTab.style.backgroundColor = '#777';

    // Add tabs to the tabs container
    tabElements.forEach(tab => tabs.appendChild(tab));

    // Create content container
    let content = document.createElement('div');

    // Create download button
    let button = document.createElement('button');
    button.innerHTML = 'Download All Images';
    button.style.padding = '10px 20px';
    button.style.fontSize = '16px';
    button.style.borderRadius = '5px';
    button.style.border = 'none';
    button.style.backgroundColor = '#4CAF50';
    button.style.color = 'white';
    button.style.cursor = 'pointer';

    // Add click event listener to the button
    button.addEventListener('click', downloadImages);

    // Create instructions text
    let instructions = document.createElement('p');
    instructions.innerHTML = `
        <h3>Enable Parallel Downloading in Chrome Flags</h3>
        <ul>
            <br>
            <li>Open Chrome and navigate to <br><code>chrome://flags/#enable-parallel-downloading</code></li><br>
            <li>Select <strong>Enabled</strong> from the dropdown next to "Enable parallel downloading"</li><br>
            <li>Click on the <strong>Relaunch</strong> button at the bottom to apply the changes</li><br>
        </ul>
    `;

    // Create author info text
    let authorInfo = document.createElement('p');
    authorInfo.innerHTML = `
        <h3 style="text-align: center;">Author Information</h3>
        <div style="display: flex; gap: 10px; justify-content: center;">
            <a href="https://www.youtube.com/@themistersami" target="_blank" rel="noopener noreferrer">
                <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="40" width="40" version="1.1" id="Layer_1" viewBox="0 0 461.001 461.001" xml:space="preserve">
                    <g>
                        <path style="fill:#F61C0D;" d="M365.257,67.393H95.744C42.866,67.393,0,110.259,0,163.137v134.728   c0,52.878,42.866,95.744,95.744,95.744h269.513c52.878,0,95.744-42.866,95.744-95.744V163.137   C461.001,110.259,418.135,67.393,365.257,67.393z M300.506,237.056l-126.06,60.123c-3.359,1.602-7.239-0.847-7.239-4.568V168.607   c0-3.774,3.982-6.22,7.348-4.514l126.06,63.881C304.363,229.873,304.298,235.248,300.506,237.056z"/>
                    </g>
                </svg>
            </a>
            <a href="https://www.github.com/themrsami" target="_blank" rel="noopener noreferrer">
                <svg xmlns="http://www.w3.org/2000/svg" width="40px" height="40px" viewBox="0 -3.5 256 256" preserveAspectRatio="xMinYMin meet">
                    <g fill="#161614">    
                    <path d="M127.505 0C57.095 0 0 57.085 0 127.505c0 56.336 36.534 104.13 87.196 120.99 6.372 1.18 8.712-2.766 8.712-6.134 0-3.04-.119-13.085-.173-23.739-35.473 7.713-42.958-15.044-42.958-15.044-5.8-14.738-14.157-18.656-14.157-18.656-11.568-7.914.872-7.752.872-7.752 12.804.9 19.546 13.14 19.546 13.14 11.372 19.493 29.828 13.857 37.104 10.6 1.144-8.242 4.449-13.866 8.095-17.05-28.32-3.225-58.092-14.158-58.092-63.014 0-13.92 4.981-25.295 13.138-34.224-1.324-3.212-5.688-16.18 1.235-33.743 0 0 10.707-3.427 35.073 13.07 10.17-2.826 21.078-4.242 31.914-4.29 10.836.048 21.752 1.464 31.942 4.29 24.337-16.497 35.029-13.07 35.029-13.07 6.94 17.563 2.574 30.531 1.25 33.743 8.175 8.929 13.122 20.303 13.122 34.224 0 48.972-29.828 59.756-58.22 62.912 4.573 3.957 8.648 11.717 8.648 23.612 0 17.06-.148 30.791-.148 34.991 0 3.393 2.295 7.369 8.759 6.117 50.634-16.879 87.122-64.656 87.122-120.973C255.009 57.085 197.922 0 127.505 0"/>
                    <path d="M47.755 181.634c-.28.633-1.278.823-2.185.389-.925-.416-1.445-1.28-1.145-1.916.275-.652 1.273-.834 2.196-.396.927.415 1.455 1.287 1.134 1.923M54.027 187.23c-.608.564-1.797.302-2.604-.589-.834-.889-.99-2.077-.373-2.65.627-.563 1.78-.3 2.616.59.834.899.996 2.08.36 2.65M58.33 194.39c-.782.543-2.06.034-2.849-1.1-.781-1.133-.781-2.493.017-3.038.792-.545 2.05-.055 2.85 1.07.78 1.153.78 2.513-.019 3.069M65.606 202.683c-.699.77-2.187.564-3.277-.488-1.114-1.028-1.425-2.487-.724-3.258.707-.772 2.204-.555 3.302.488 1.107 1.026 1.445 2.496.7 3.258M75.01 205.483c-.307.998-1.741 1.452-3.185 1.028-1.442-.437-2.386-1.607-2.095-2.616.3-1.005 1.74-1.478 3.195-1.024 1.44.435 2.386 1.596 2.086 2.612M85.714 206.67c.036 1.052-1.189 1.924-2.705 1.943-1.525.033-2.758-.818-2.774-1.852 0-1.062 1.197-1.926 2.721-1.951 1.516-.03 2.758.815 2.758 1.86M96.228 206.267c.182 1.026-.872 2.08-2.377 2.36-1.48.27-2.85-.363-3.039-1.38-.184-1.052.89-2.105 2.367-2.378 1.508-.262 2.857.355 3.049 1.398"/>
                    </g>
                </svg>
            </a>
            <a href="https://www.instagram.com/themrsami" target="_blank" rel="noopener noreferrer">
                <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="40" width="40" version="1.1" id="Layer_1" viewBox="0 0 551.034 551.034" xml:space="preserve">
                    <g id="XMLID_13_">
                            <linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="275.517" y1="4.5714" x2="275.517" y2="549.7202" gradientTransform="matrix(1 0 0 -1 0 554)">
                            <stop offset="0" style="stop-color:#E09B3D"/>
                            <stop offset="0.3" style="stop-color:#C74C4D"/>
                            <stop offset="0.6" style="stop-color:#C21975"/>
                            <stop offset="1" style="stop-color:#7024C4"/>
                        </linearGradient>
                        <path id="XMLID_17_" style="fill:url(#XMLID_2_);" d="M386.878,0H164.156C73.64,0,0,73.64,0,164.156v222.722   c0,90.516,73.64,164.156,164.156,164.156h222.722c90.516,0,164.156-73.64,164.156-164.156V164.156   C551.033,73.64,477.393,0,386.878,0z M495.6,386.878c0,60.045-48.677,108.722-108.722,108.722H164.156   c-60.045,0-108.722-48.677-108.722-108.722V164.156c0-60.046,48.677-108.722,108.722-108.722h222.722   c60.045,0,108.722,48.676,108.722,108.722L495.6,386.878L495.6,386.878z"/>
                            <linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="275.517" y1="4.5714" x2="275.517" y2="549.7202" gradientTransform="matrix(1 0 0 -1 0 554)">
                            <stop offset="0" style="stop-color:#E09B3D"/>
                            <stop offset="0.3" style="stop-color:#C74C4D"/>
                            <stop offset="0.6" style="stop-color:#C21975"/>
                            <stop offset="1" style="stop-color:#7024C4"/>
                        </linearGradient>
                        <path id="XMLID_81_" style="fill:url(#XMLID_3_);" d="M275.517,133C196.933,133,133,196.933,133,275.516   s63.933,142.517,142.517,142.517S418.034,354.1,418.034,275.516S354.101,133,275.517,133z M275.517,362.6   c-48.095,0-87.083-38.988-87.083-87.083s38.989-87.083,87.083-87.083c48.095,0,87.083,38.988,87.083,87.083   C362.6,323.611,323.611,362.6,275.517,362.6z"/>
                            <linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="418.306" y1="4.5714" x2="418.306" y2="549.7202" gradientTransform="matrix(1 0 0 -1 0 554)">
                            <stop offset="0" style="stop-color:#E09B3D"/>
                            <stop offset="0.3" style="stop-color:#C74C4D"/>
                            <stop offset="0.6" style="stop-color:#C21975"/>
                            <stop offset="1" style="stop-color:#7024C4"/>
                        </linearGradient>
                        <circle id="XMLID_83_" style="fill:url(#XMLID_4_);" cx="418.306" cy="134.072" r="34.149"/>
                    </g>
                </svg>
            </a>
        </div>
    `;

    // Add content to the content container
    content.appendChild(button);
    content.appendChild(instructions);
    content.appendChild(authorInfo);

    // Add content to the card
    card.appendChild(tabs);
    card.appendChild(content);

    // Append the card to the body
    document.body.appendChild(card);

    // Helper function to set active tab
    function setActiveTab(tab) {
        activeTab.style.backgroundColor = '#555';
        tab.style.backgroundColor = '#777';
        activeTab = tab;
        updateContent();
    }

    // Helper function to update content based on active tab
    function updateContent() {
        button.style.display = (activeTab === tabElements[0]) ? 'block' : 'none';
        instructions.style.display = (activeTab === tabElements[1]) ? 'block' : 'none';
        authorInfo.style.display = (activeTab === tabElements[2]) ? 'block' : 'none';
    }

    // Initialize content based on the active tab
    updateContent();
})();

QingJ © 2025

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