Greasy Fork 还支持 简体中文。

WebDAV Image Saver

通过右键菜单保存图片到WebDAV服务器

  1. // ==UserScript==
  2. // @name WebDAV Image Saver
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description 通过右键菜单保存图片到WebDAV服务器
  6. // @author YourName
  7. // @match *://*/*
  8. // @grant GM_xmlhttpRequest
  9. // @grant GM_registerMenuCommand
  10. // @grant GM_getValue
  11. // @grant GM_setValue
  12. // @grant GM_notification
  13. // @license MI
  14. // ==/UserScript==
  15.  
  16. (function() {
  17. 'use strict';
  18.  
  19. let lastImageSrc = null;
  20.  
  21. // 监听右键菜单事件,记录最后选中的图片
  22. document.addEventListener('contextmenu', function(e) {
  23. const target = e.target;
  24. if (target.tagName === 'IMG' && target.src) {
  25. lastImageSrc = target.src;
  26. } else {
  27. lastImageSrc = null;
  28. }
  29. });
  30.  
  31. // 注册右键菜单命令
  32. GM_registerMenuCommand('保存图片到WebDAV', saveImageToWebDAV);
  33. GM_registerMenuCommand('配置WebDAV设置', configureWebDAV);
  34.  
  35. // 配置WebDAV参数
  36. function configureWebDAV() {
  37. const webdavUrl = prompt('请输入WebDAV URL:', GM_getValue('webdavUrl', ''));
  38. const username = prompt('请输入用户名:', GM_getValue('username', ''));
  39. const password = prompt('请输入密码:', GM_getValue('password', ''));
  40. const savePath = prompt('请输入保存路径(以/结尾):', GM_getValue('savePath', '/'));
  41.  
  42. if (webdavUrl && username && password) {
  43. GM_setValue('webdavUrl', webdavUrl);
  44. GM_setValue('username', username);
  45. GM_setValue('password', password);
  46. GM_setValue('savePath', savePath || '/');
  47. alert('配置已保存!');
  48. }
  49. }
  50.  
  51. // 保存图片到WebDAV
  52. function saveImageToWebDAV() {
  53. if (!lastImageSrc) {
  54. alert('请先右键选中要保存的图片!');
  55. return;
  56. }
  57.  
  58. const webdavUrl = GM_getValue('webdavUrl');
  59. const username = GM_getValue('username');
  60. const password = GM_getValue('password');
  61. const savePath = GM_getValue('savePath', '/');
  62.  
  63. if (!webdavUrl || !username || !password) {
  64. alert('请先配置WebDAV参数!');
  65. return configureWebDAV();
  66. }
  67.  
  68. // 获取文件名
  69. const fileName = lastImageSrc.split('/').pop().split('?')[0];
  70. const fullUrl = webdavUrl.replace(/\/$/, '') + savePath.replace(/\/$/, '') + '/' + fileName;
  71.  
  72. // 下载图片
  73. GM_xmlhttpRequest({
  74. method: 'GET',
  75. url: lastImageSrc,
  76. responseType: 'blob',
  77. onload: function(response) {
  78. if (response.status !== 200) {
  79. return alert('图片下载失败!');
  80. }
  81.  
  82. // 上传到WebDAV
  83. GM_xmlhttpRequest({
  84. method: 'PUT',
  85. url: fullUrl,
  86. headers: {
  87. 'Authorization': 'Basic ' + btoa(username + ':' + password)
  88. },
  89. data: response.response,
  90. onload: function(res) {
  91. if (res.status === 201 || res.status === 204) {
  92. GM_notification({
  93. text: '图片保存成功!',
  94. title: 'WebDAV上传',
  95. timeout: 3000
  96. });
  97. } else {
  98. alert(`上传失败:${res.status} ${res.statusText}`);
  99. }
  100. },
  101. onerror: function(err) {
  102. alert('网络请求失败,请检查配置!');
  103. console.error(err);
  104. }
  105. });
  106. },
  107. onerror: function(err) {
  108. alert('图片下载失败!');
  109. console.error(err);
  110. }
  111. });
  112. }
  113. })();