download_pic.js 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // ==UserScript==
  2. // @name 图片下载器
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.1
  5. // @description 尝试在页面顶部添加一个按钮,点击后下载页面所有图片
  6. // @author Jack
  7. // @match *://*/*
  8. // @grant GM_download
  9. // @grant GM_addStyle
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.5.0/jszip.min.js
  11. // ==/UserScript==
  12. (function () {
  13. 'use strict';
  14. // 添加样式以确保按钮在页面加载时可见
  15. GM_addStyle(`
  16. .download-pic-button {
  17. position: fixed;
  18. top: 5%; /* 默认位置 */
  19. left: 50%;
  20. transform: translateX(-50%);
  21. z-index: 10000;
  22. border: none;
  23. background-color: transparent; /* 背景颜色设置为透明 */
  24. color: rgb(113, 100, 156); /* 字体颜色设置为指定的 RGB 值 */
  25. cursor: pointer;
  26. font-size: 15px;
  27. padding: 0;
  28. }
  29. `);
  30. // 创建按钮并添加到页面顶部的中间
  31. var downloadButton = document.createElement("button");
  32. downloadButton.textContent = "New Btn";
  33. downloadButton.className = 'download-pic-button';
  34. document.body.appendChild(downloadButton);
  35. // 点击按钮时执行的函数
  36. downloadButton.onclick = function () {
  37. // 将NodeList转换为数组
  38. var images = Array.prototype.slice.call(document.querySelectorAll('img'));
  39. var zip = new JSZip();
  40. var imageDownloads = images.map(function (img, index) {
  41. var src = img.src; // 获取图片的src属性
  42. var filename = img.alt || 'image_' + index; // 使用alt属性作为文件名,如果没有alt则使用图片索引
  43. var extensionMatch = src.match(/\.([^.]+)$/); // 正则表达式匹配文件扩展名
  44. var extension = extensionMatch ? extensionMatch[1].toLowerCase() : 'jpg';
  45. // 检查扩展名是否是图片格式
  46. var validExtensions = ['jpg', 'jpeg', 'png', 'gif', 'svg', 'bmp', 'webp'];
  47. if (validExtensions.includes(extension)) {
  48. // 返回一个Promise,用于获取图片数据
  49. return fetch(src).then(response => {
  50. if (!response.ok) {
  51. throw new Error('Network response was not ok for ' + src);
  52. }
  53. return response.blob();
  54. }).then(blob => {
  55. // 将blob添加到zip文件中
  56. zip.file(filename + '.' + extension, blob);
  57. }).catch(error => {
  58. console.error('Error fetching the image:', error);
  59. });
  60. }
  61. // 如果不是图片格式或者不包含有效的src属性,不返回Promise,这样就不会影响Promise.all
  62. });
  63. // 使用filter去除那些非图片格式或不包含有效src的Promise
  64. var validPromises = imageDownloads.filter(p => p);
  65. // 等待所有有效的图片都添加到zip中
  66. Promise.all(validPromises).then(() => {
  67. // 生成zip文件并下载
  68. zip.generateAsync({ type: 'blob' }).then(function (content) {
  69. var filename = 'images_' + new Date().toISOString() + '.zip'; // 使用时间戳生成唯一的文件名
  70. var eleLink = document.createElement('a');
  71. eleLink.download = filename;
  72. eleLink.style.display = 'none';
  73. eleLink.href = URL.createObjectURL(content);
  74. document.body.appendChild(eleLink);
  75. eleLink.click();
  76. document.body.removeChild(eleLink);
  77. }).catch(error => {
  78. console.error('Error generating the zip file:', error);
  79. });
  80. });
  81. };
  82. }
  83. )();