ctrl+单击图片自动下载

在图片对象上面:1、按ctrl单击图片自动下载(默认转换为JPG格式);2、按alt 单击图片会弹窗选择命名方式(无需刷新网页即可生效),文件名可以根据当前日期时间time、网页域名domain、网页标题title,或用户自定义进行命名。

// ==UserScript==
// @name         ctrl+单击图片自动下载
// @namespace    https://www.techwb.cn/
// @version      1.4
// @description  在图片对象上面:1、按ctrl单击图片自动下载(默认转换为JPG格式);2、按alt 单击图片会弹窗选择命名方式(无需刷新网页即可生效),文件名可以根据当前日期时间time、网页域名domain、网页标题title,或用户自定义进行命名。
// @author       Techwb.cn
// @match        *://*/*
// @grant        GM_download
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// ==/UserScript==

(function() {
  'use strict';
  var clickedImage = null;
  var nameOption = GM_getValue('nameOption', 'time'); //默认命名方式time
  var customName = GM_getValue('customName', '');

  document.addEventListener('mousedown', function(event) {
    var target = event.target;
    if (target.tagName === 'IMG' && event.button === 0) {
      clickedImage = target;
      if (event.ctrlKey) {
        handleDownload();
      } else if (event.altKey) {
        handleNaming();
      }
    }
  });

  function handleDownload() {
    if (!clickedImage) return;
    var imgSrc = clickedImage.src;
    fetch(imgSrc, { mode: 'cors' })
      .then(function(response) {
        return response.blob();
      })
      .then(function(blob) {
        var reader = new FileReader();
        reader.readAsDataURL(blob);
        reader.onloadend = function() {
          var base64data = reader.result;
          var fileName = getFileName();
          downloadImage(base64data, fileName);
        };
      });
  }

  function handleNaming() {
    var dateTime = getDate();
    var domainName = getDomain();
    var titleName = getTitle();
    var defaultName = dateTime + '' + titleName + '' + domainName + '.jpg';

    var optionsHtml = '<option value="time" ' + (nameOption === 'time' ? 'selected' : '') + '>时间命名方式</option>' +
                      '<option value="domain" ' + (nameOption === 'domain' ? 'selected' : '') + '>域名命名方式</option>' +
                      '<option value="title" ' + (nameOption === 'title' ? 'selected' : '') + '>标题命名方式</option>' +
                      '<option value="custom" ' + (nameOption === 'custom' ? 'selected' : '') + '>自定义命名方式</option>';

    var html = '<div><label for="nameOption">命名方式:</label><select id="nameOption">' + optionsHtml + '</select></div>';
    var customNameHtml = '<div style="display:none;">' + // 初始隐藏
               '<label for="customName">请输入文件名:</label>' +
               '<input type="text" id="customName" value="' + customName + '">' +
               '</div>';
    var fileNameHtml = '<div><label for="fileName">文件名:</label><input type="text" id="fileName" value="' + defaultName + '" readonly></div>';

    var dialog = document.createElement('div');
    dialog.innerHTML = html + customNameHtml + fileNameHtml;
    dialog.style.position = 'fixed';
    dialog.style.top = '50%';
    dialog.style.left = '50%';
    dialog.style.transform = 'translate(-50%, -50%)';
    dialog.style.backgroundColor = '#fff';
    dialog.style.padding = '20px';
    dialog.style.borderRadius = '5px';
    dialog.style.boxShadow = '0px 0px 10px rgba(0, 0, 0, 0.5)';
    dialog.style.zIndex = '9999';
    document.body.appendChild(dialog);

    var select = dialog.querySelector('#nameOption');
    var customNameInput = dialog.querySelector('#customName');
    var fileNameInput = dialog.querySelector('#fileName');
    var closeButton = document.createElement('button');
    closeButton.innerText = '关闭';
    closeButton.style.position = 'absolute';
    closeButton.style.top = '2px';
    closeButton.style.right = '2px';
    closeButton.style.padding = '3px 5px';
    closeButton.style.backgroundColor = '#e74c3c';
    closeButton.style.border = 'none';
    closeButton.style.color = '#fff';
    closeButton.style.borderRadius = '3px';
    closeButton.style.cursor = 'pointer';
    closeButton.addEventListener('click', function() {
      document.body.removeChild(dialog);
    });
    dialog.appendChild(closeButton);

    select.addEventListener('change', function() {
      nameOption = select.value;
      updateFileName();
      GM_setValue('nameOption', nameOption);
      if (nameOption === 'custom') {
        customNameInput.parentNode.style.display = 'block'; // 显示
      } else {
        customNameInput.parentNode.style.display = 'none'; // 隐藏
        GM_setValue('customName', '');
      }
    });

    customNameInput.addEventListener('input', function() {
      customName = customNameInput.value;
      updateFileName();
      GM_setValue('customName', customName);
    });

    function updateFileName() {
      var fileName = '';
      if (nameOption === 'time') {
        fileName = '图片_' + getDate() + '.jpg';
      } else if (nameOption === 'domain') {
        fileName = getDomain() + '.jpg';
      } else if (nameOption === 'title') {
        fileName = getTitle() + '.jpg';
      } else {
        fileName = customName + '.jpg';
      }
      fileNameInput.value = fileName;
    }

    updateFileName();
  }

  function getFileName() {
    var fileName = '';
    if (nameOption === 'time') {
      fileName = '图片_' + getDate() + '.jpg';
    } else if (nameOption === 'domain') {
      fileName = getDomain() + '.jpg';
    } else if (nameOption === 'title') {
      fileName = getTitle() + '.jpg';
    } else {
      fileName = customName + '.jpg';
    }
    return fileName;
  }

  function downloadImage(base64data, fileName) {
    var a = document.createElement('a');
    a.href = base64data;
    a.download = fileName;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  }

  function getDate() {
    var now = new Date();
    return now.getFullYear() + '-' + (now.getMonth() + 1).toString().padStart(2, '0') + '-' + now.getDate().toString().padStart(2, '0') + '_' + now.getHours().toString().padStart(2, '0') + now.getMinutes().toString().padStart(2, '0') + now.getSeconds().toString().padStart(2, '0');
  }

  function getDomain() {
    var url = window.location.href;
    var domain = url.split('/')[2];
    domain = domain.replace(/www\./, '');
    return domain;
  }

  function getTitle() {
    var title = document.title;
    return title.substring(0, 10);
  }
})();

QingJ © 2025

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