Bulk Export Dropbox Image URLs (2024)

Extracts image URLs from a Dropbox page and copies them to the clipboard when a button is clicked.

// ==UserScript==
// @name         Bulk Export Dropbox Image URLs (2024)
// @version      3.1.2
// @description  Extracts image URLs from a Dropbox page and copies them to the clipboard when a button is clicked.
// @author       sharmanhall
// @supportURL   https://github.com/tyhallcsu/dropbox-image-url-extractor/issues/new
// @namespace    https://github.com/tyhallcsu/dropbox-image-url-extractor
// @homepageURL  https://github.com/tyhallcsu/dropbox-image-url-extractor
// @license      MIT
// @connect      greasyfork.org
// @connect      sleazyfork.org
// @connect      github.com
// @connect      openuserjs.org
// @match        https://www.dropbox.com/*
// @match        *://*.dropbox.com/*
// @grant        GM_setClipboard
// @grant        GM_log
// @compatible   chrome
// @compatible   firefox
// @compatible   edge
// @compatible   opera
// @compatible   safari
// @run-at       document-idle
// @icon         https://cfl.dropboxstatic.com/static/metaserver/static/images/favicon-vfl8lUR9B.ico
// ==/UserScript==

// NEW CONTRIBUTOR: [pixelsilo](https://www.dropboxforum.com/t5/user/viewprofilepage/user-id/1795103)
// SOURCE: https://www.dropboxforum.com/t5/View-download-and-export/Export-Bulk-Dropbox-Image-Folder-URLs/m-p/744340/highlight/true#
// -------------
// This updated script adds a button to the page labeled "Convert Links and Download."
// When the button is clicked, the script scrolls to the bottom of the page to load more links, converts the links to direct download links, and adds a textarea to the page with the list of links.
// The links are also formatted with `wget` so that they can be used in the command line. The button is temporarily disabled after the links are converted and re-enabled after a few seconds.
// Please note that this script is designed to work on Dropbox pages that match the URL pattern specified in the `@match` directive (`*://*.dropbox.com/*`).
// If you encounter any issues, please make sure that the script is running on the appropriate Dropbox page.

(function() {
    'use strict';
 
    const SECONDS_TO_WAIT_FOR_SCROLL = 1; // adjust as needed
    //const DOWNLOAD_URL_REPLACEMENT = '?dl=1';
    const DOWNLOAD_URL_REPLACEMENT = '?raw=1';
 
    // DELETED: MODIFIED BELOW || function to get all image link elements
    //function getImageLinks() {
    //    const imageLinks = document.querySelectorAll('a.dig-Link.sl-link--file[href*="dl=0"]');
    //    return Array.from(imageLinks).map(link => link.getAttribute('href').replace(/\?dl=0$/, DOWNLOAD_URL_REPLACEMENT));
    //}

    function getImageLinks() {
    // Update the selector to match the Dropbox page structure
    const imageLinks = document.querySelectorAll('a.dig-Link._sl-file-name_1iaob_86.dig-Link--primary[href*="dl=0"]');
    return Array.from(imageLinks).map(link => link.getAttribute('href').replace(/\?dl=0$/, DOWNLOAD_URL_REPLACEMENT));
    }
 
    // function to scroll to the bottom of the page and wait for new images to load
    async function waitForImagesToLoad() {
        window.scrollTo(0, document.body.scrollHeight);
        await new Promise(resolve => setTimeout(resolve, SECONDS_TO_WAIT_FOR_SCROLL * 5000));
    }
 
    // create an array to hold the image URLs
    let imageUrls = [];
 
    // add a button to the page that will copy the image URLs to the clipboard when clicked
    const copyButton = document.createElement('button');
    copyButton.classList.add('dig-Button', 'dig-Button--primary', 'dig-Button--standard', 'copy-urls-button');
    copyButton.textContent = 'Copy all URLs';
    copyButton.style.position = 'fixed';
    copyButton.style.bottom = '20px';
    copyButton.style.right = '20px';
    copyButton.style.zIndex = '9999';
    document.body.appendChild(copyButton);
 
    // add a click event listener to the button
    copyButton.addEventListener('click', async function() {
        let finished = false;
        let numUrls = 0;
        while (!finished) {
            // scroll to the bottom of the page and wait for new images to load
            await waitForImagesToLoad();
 
            // get the newly loaded image URLs
            const newImageUrls = getImageLinks().filter(url => !imageUrls.includes(url));
            imageUrls.push(...newImageUrls);
 
            // check if all images have been loaded
            finished = newImageUrls.length === 0;
 
            numUrls += newImageUrls.length;
        }
 
        // join the image URLs into a string separated by newlines
        const imageUrlString = imageUrls.join('\n');
 
        // copy the image URL string to the clipboard
        GM_setClipboard(imageUrlString, 'text');
 
        // disable the button and change the text to indicate that the URLs have been copied
        copyButton.disabled = true;
        copyButton.textContent = `${numUrls} URL(s) copied to clipboard`;
 
        // enable the button again after 3 seconds
        setTimeout(function() {
            imageUrls = [];
            copyButton.disabled = false;
            copyButton.textContent = 'Copy all URLs';
        }, 3000);
    });
})();