图片采集下载工具

测试一下

  1. // ==UserScript==
  2. // @name 图片采集下载工具
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.1
  5. // @description 测试一下
  6. // @grant GM_setValue
  7. // @grant GM_getValue
  8. // @grant GM_listValues
  9. // @grant GM_deleteValue
  10. // @grant GM_download
  11. // @author yinyi
  12. // @include *
  13. // ==/UserScript==
  14. (function() {
  15. //全局变量
  16. var ci = 0
  17. var time = 0
  18. var huan = 0
  19. var time1 = 0
  20. var dian = 0
  21. var myVar;
  22. var zifuchangdu;
  23. var img_src = new Array();
  24. var img_name = new Array();
  25.  
  26. //检测为分页采集模式跳转
  27. if(GM_getValue("moshi") == 2 && GM_getValue("caijixia") !== undefined && GM_getValue("caijitu") !== undefined && GM_getValue("zhuti") !== undefined){
  28. img_src=GM_getValue("imgurl");
  29. img_name=GM_getValue("imgname");
  30. zifuchangdu=GM_getValue("zifucd");
  31. console.log(GM_getValue("imgurl"));
  32. console.log(GM_getValue("imgname"));
  33. console.log(GM_getValue("caijixia"));
  34. jiansuo();
  35.  
  36. var tiaozhuan = document.evaluate(GM_getValue("caijixia"), document).iterateNext();
  37. if(tiaozhuan){
  38. console.log(tiaozhuan)
  39. if(tiaozhuan.href.substring(tiaozhuan.href.length-1) == "#"){
  40. tiaozhuan.href = tiaozhuan.href.substring(0,tiaozhuan.href.length-1)
  41. }
  42. if(tiaozhuan.href && tiaozhuan.href !== window.location.href){
  43. console.log("有href"+tiaozhuan.href +"||"+ window.location.href)
  44. setTimeout(function(){ GM_setValue("winurl",window.location.href);tiaozhuan.click(); }, 300);
  45. }else{
  46. console.log("无href")
  47. if(tiaozhuan.parentNode.href){
  48. console.log("上层有"+tiaozhuan.parentNode)
  49. setTimeout(function(){ GM_setValue("winurl",window.location.href);tiaozhuan.parentNode.click(); }, 300);
  50. }else{
  51. console.log("结束")
  52. xiazai();
  53. qingchu();
  54. }
  55. }
  56. }else{
  57. console.log("Xpath 的规则无法定位,尝试测算url 进行下一页跳转")
  58. var qwin = GM_getValue("winurl")
  59. console.log(qwin)
  60. console.log(qwin[0]+"||"+window.location.host)
  61. console.log(qwin[1]+"||"+window.location.pathname)
  62.  
  63. if(qwin !== window.location.href){
  64. var zurl = "";
  65.  
  66. zurl = zifu(qwin,window.location.href)
  67.  
  68. console.log(zurl)
  69. $.ajax({
  70. url: zurl,
  71. type: 'GET',
  72. complete: function(response) {
  73. if(response.status == 200) {
  74. setTimeout(function(){ GM_setValue("winurl",window.location.href);window.open(zurl,"_self"); }, 300);
  75. } else {
  76. console.log("测算uel无效,终止")
  77. xiazai()
  78. qingchu();
  79. }
  80. }
  81. });
  82. }
  83.  
  84. }
  85. }
  86. function qingchu(){
  87. GM_deleteValue("moshi")
  88. GM_deleteValue("caijixia")
  89. GM_deleteValue("caijitu")
  90. GM_deleteValue("winurl")
  91. GM_deleteValue("zhuti")
  92. GM_deleteValue("imgurl")
  93. GM_deleteValue("imgname")
  94. }
  95.  
  96. //测算url 的字符处理模块
  97. function zifu(q,d){
  98. var qi = "";
  99. var hi = "";
  100. var qn = 0;
  101. for(var i = 0;i<d.length;i++){
  102. if(q.substring(0,i+1) == d.substring(0,i+1)){
  103. qn = i;
  104. qi = d.substring(0,i+1)
  105. }
  106. if(q.substring(q.length-i,q.length) == d.substring(d.length-i,d.length)){
  107. console.log(q.substring(q.length-i,q.length) +"||"+ d.substring(d.length-i,d.length))
  108. hi = d.substring(d.length-i,d.length)
  109. }
  110. }
  111. //console.log(qi+"||"+hi)
  112. //console.log(d.substring(qn+1,d.lastIndexOf(hi)))
  113. var ye = d.substring(qn+1,d.lastIndexOf(hi))
  114. ye = Number(ye)+1
  115. var hurl = qi+ye+hi
  116. return hurl
  117. }
  118. //定位元素 Xpath 的规则模块
  119. // function readXPath(element) {
  120. // if (element.id !== "") {return '//*[@id=\"' + element.id + '\"]';}
  121. // if (element == document.body) {return '/html/' + element.tagName.toLowerCase();}
  122. // var ix = 1,
  123. // siblings = element.parentNode.childNodes;
  124.  
  125. // for (var i = 0, l = siblings.length; i < l; i++) {
  126. // var sibling = siblings[i];
  127. // if (sibling == element) {
  128. // return arguments.callee(element.parentNode) + '/' + element.tagName.toLowerCase() + '[' + (ix) + ']';
  129. // } else if (sibling.nodeType == 1 && sibling.tagName == element.tagName) {
  130. // ix++;
  131. // }
  132. // }
  133. // };
  134. //////////
  135. function readXPath(element) {
  136. if (element.id!==""){
  137. return '//*[@id=\"'+element.id+'\"]';
  138. }
  139.  
  140. if (element.getAttribute("class")!==null){
  141. return '//*[@class=\"'+element.getAttribute("class")+'\"]';
  142. }
  143.  
  144. if (element==document.body){
  145. return '/html/'+element.tagName;
  146. }
  147.  
  148.  
  149. var ix= 0,
  150. siblings= element.parentNode.childNodes;
  151.  
  152. for (var i= 0,l=siblings.length; i<l; i++) {
  153. var sibling= siblings[i];
  154. if (sibling==element){
  155. return arguments.callee(element.parentNode)+'/'+element.tagName+((ix+1)==1?'':'['+(ix+1)+']');
  156. }else if(sibling.nodeType==1 && sibling.tagName==element.tagName){
  157. ix++;
  158. }
  159. }
  160. };
  161.  
  162.  
  163.  
  164. //检测设置快捷键
  165. if(!GM_getValue("kuaijiejian")){
  166. alert("检测到第一次运行故做以下提示:/n 1:默认快捷键【Esc】,如需自定快捷键,可以在关闭本提示之后,长按3秒当前设定的快捷键进行更改.")
  167. GM_setValue("kuaijiejian",27)
  168. }
  169.  
  170. //快捷键验证模块
  171. function yanzheng(event) {
  172. var e = event || window.event || arguments.callee.caller.arguments[0];
  173. //快捷键替换
  174. if(huan == 1){
  175. huan = 0;
  176. GM_setValue("kuaijiejian",e.keyCode);
  177. alert("快捷键替换完成");
  178. return;
  179. }
  180.  
  181. if(e && e.keyCode==GM_getValue("kuaijiejian")){return 1;}else{return 0;}}
  182.  
  183.  
  184. //快捷键按下
  185. document.onkeydown=function(event){
  186. var an = yanzheng(event)
  187. if(an == 1 && ci == 0){ci = 1;time = new Date().getTime();}
  188. }
  189.  
  190.  
  191. //快捷键抬起
  192. document.onkeyup=function(event){
  193. if(ci == 1){
  194. ci = 0;
  195. time = new Date().getTime()-time;
  196.  
  197. if(time > 1200){
  198. huan = 1;
  199. alert("在关闭本提示之后,单击需要设定为快捷键的按键,请注意避免与其他软件或脚本快捷键冲突,不支持组合键")
  200. return;
  201. }else{
  202. GM_setValue("moshi",1)
  203. time1 = new Date().getTime()-time1
  204.  
  205. if (time1 < 450){
  206. myStopFunction()
  207. GM_setValue("moshi",2)
  208. }else{
  209. GM_setValue("moshi",1)
  210. time1 = new Date().getTime()
  211. }
  212. myFunction()
  213. }
  214. }
  215.  
  216. }
  217.  
  218.  
  219. function myFunction(){myVar=setTimeout(function(){zhixing()},500);}
  220. function myStopFunction(){clearTimeout(myVar);}
  221.  
  222. //绑定鼠标点击执行模块
  223. function zhixing(){
  224. document.addEventListener('click', link, true);
  225. console.log(GM_getValue("moshi"))
  226. GM_deleteValue("caijixia")
  227. GM_deleteValue("caijitu")
  228. GM_deleteValue("zhuti")
  229. GM_deleteValue("imgurl")
  230. GM_deleteValue("imgname")
  231. }
  232.  
  233.  
  234. //点击触发功能
  235. function link(event) {
  236. event.preventDefault();
  237. event.stopPropagation();
  238.  
  239. //moshi2触发Xpath 定位规则采集
  240. if(event.target.tagName !== "IMG" && GM_getValue("moshi") == 2){
  241. var inpt = prompt(" 请输入【下一页】按钮的Xpath定位",readXPath(event.target));
  242. if(inpt){
  243. //var data = document.evaluate(inpt, document).iterateNext();
  244. //console.log(data)
  245. GM_setValue("caijixia",inpt)
  246. console.log(GM_getValue("caijixia"));
  247. }
  248. }
  249.  
  250. //对图片特征规则采集
  251. if(event.target.tagName == "IMG"){
  252. var inus = event.target.src.substring(event.target.src.indexOf("\."), event.target.src.lastIndexOf("\/")+1);
  253. zifuchangdu = event.target.src.substring(event.target.src.lastIndexOf("\/")+1,event.target.src.length).length;
  254. console.log(zifuchangdu)
  255. GM_setValue("zifucd",zifuchangdu)
  256. //分割URL 获取最后 / 符号之前部分作为预设特征码,获取格式
  257. var inpusers = prompt("请输入特征码",inus); // 弹出用户输入input框
  258. if(inpusers){
  259. GM_setValue("caijitu",inpusers)
  260. console.log(GM_getValue("caijitu"))
  261. //主题名称采集
  262. var text = event.target.alt.replace(/[^\u4e00-\u9fa5]/g, '')
  263. if(text == "" && document.evaluate('//h1', document).iterateNext() !== null){
  264. text = document.evaluate('//h1', document).iterateNext().innerHTML.replace(/[^\u4e00-\u9fa5]/g, '')
  265. }
  266. if(text == ""){text = "如需自定图片名称可以在此输入,否则请直接点击确定"}
  267. //预测匹配图片数量
  268. var img = document.getElementsByTagName("img")
  269. var yuce = new Array();
  270. for(var i = 0;i<img.length;i++){
  271. if(img[i].src.indexOf(GM_getValue("caijitu")) !== -1 && img[i].src.substring(img[i].src.lastIndexOf("\/")+1,img[i].src.length).length == zifuchangdu){
  272. if(yuce.indexOf(img[i].src) == -1){
  273. //判断数组中是否存在这个链接
  274. yuce[yuce.length] = img[i].src
  275. }
  276. }
  277. }
  278. var inp = prompt("检测图片 "+img.length+' 张 ,匹配图片 '+yuce.length+' 张。\n' + yuce.join('\n'),text);
  279. GM_setValue("zhuti",inp)
  280. jiansuo()
  281. }
  282. }
  283.  
  284.  
  285. //核对规则采集
  286. if(GM_getValue("imgurl") !== undefined && GM_getValue("imgname") !== undefined){
  287. if(GM_getValue("moshi") == 2){
  288. if(!GM_getValue("caijixia")) {
  289. alert("双击快捷键为多分页采集模式,当前还没采集【下一页】按钮的 Xpath 定位,请点击【下一页】按钮进行采集,\n\n建议多分页采集时,优先采集【下一页】按钮,再采集图片规则,避免出现本提示。")
  290. }else{
  291. document.removeEventListener('click', link, true);
  292. GM_setValue("winurl",window.location.href);
  293. var tiaozhuan = document.evaluate(GM_getValue("caijixia"), document).iterateNext();
  294. if(tiaozhuan.href && tiaozhuan.href !== window.location.href){
  295. setTimeout(function(){ tiaozhuan.click(); }, 300);
  296. }else{
  297. console.log("无href")
  298. if(tiaozhuan.parentNode.href){
  299. console.log("上层有"+tiaozhuan.parentNode)
  300. tiaozhuan.parentNode.click();
  301. }else{
  302. console.log("结束")
  303. qingchu();
  304. }
  305. }
  306. }
  307. }else{
  308. //删除鼠标点击事件
  309. document.removeEventListener('click', link, true);
  310. xiazai();
  311. }
  312. }
  313. }
  314. //检测特征码匹配
  315. function jiansuo(){
  316. var img = document.getElementsByTagName("img")
  317. var inp = GM_getValue("zhuti")
  318.  
  319. for(var i = 0;i<img.length;i++){
  320. if(img[i].src.indexOf(GM_getValue("caijitu")) !== -1 && img[i].src.substring(img[i].src.lastIndexOf("\/")+1,img[i].src.length).length == zifuchangdu){
  321. if(img_src.indexOf(img[i].src) == -1){
  322. //判断数组中是否存在这个链接
  323. img_src[img_src.length] = img[i].src
  324. //匹配一个图片名称
  325. var n = "("+img_src.length+")"
  326. if(inp == ("" || "如需自定图片名称可以在此输入,否则请直接点击确定")){var name = img[i].src.substring(img[i].src.lastIndexOf("\/")+1,img[i].src.lastIndexOf("\."))}else{name = inp+n}
  327. img_name[img_name.length] = name
  328. }
  329. }
  330. }
  331. GM_setValue("imgurl",img_src);
  332. GM_setValue("imgname",img_name);
  333. console.log(GM_getValue("imgurl"));
  334. console.log(GM_getValue("imgname"));
  335. }
  336.  
  337. //生成下载页面
  338. function xiazai() {
  339. var str = ""
  340. var i = 0;
  341. GM_getValue("imgurl").forEach(function(url) {
  342. str=str+'<tr><td><a href='+GM_getValue("imgurl")[i]+' download='+GM_getValue("imgname")[i]+'><input type="checkbox" name="checkbox" value='+i+' checked="true">'+GM_getValue("imgname")[i]+'</td></tr>'
  343. i++
  344. });
  345. var xuanqu = "function opcheckboxed(objName,type){var objNameList=document.getElementsByName(objName);if(null!=objNameList){for(var i=0;i<objNameList.length;i++){if(objNameList[i].checked==true){if(type!=='checkall'){objNameList[i].checked=false}}else{if(type!=='uncheckall'){objNameList[i].checked=true}}}}}"
  346. var ses = 'function getBase64(imgUrl,name) { var xhr = new XMLHttpRequest(); xhr.open("get", imgUrl, true); xhr.responseType = "blob"; xhr.onload = function () { if (this.status == 200) { var blob = this.response; console.log("blob", blob); let oFileReader = new FileReader(); oFileReader.onloadend = function (e) { let base64 = e.target.result; console.log("方式一》》》》》》》》》", base64);var alink = document.createElement("a"); alink.href = base64; alink.download = name; alink.click(); }; oFileReader.readAsDataURL(blob); }; }; xhr.send(); }'
  347. var down = "function down(mo){var qxuan = document.getElementsByTagName('input');var i = 0 ;if(mo == 'cop'){ var copy = '';for(i;i<qxuan.length;i++){ if (qxuan[i].checked){copy = copy + qxuan[i].parentNode.href + '\\n'};}; document.addEventListener('copy', save);document.execCommand('copy');document.removeEventListener('copy', save); };function save(e) {e.clipboardData.setData('text/plain', copy);e.preventDefault();} ;if(mo == 'dow'){ var myVar = setInterval(function(){if (qxuan[i].checked){console.log(qxuan[i].parentNode.href+'||'+ qxuan[i].parentNode.download);getBase64(qxuan[i].parentNode.href,qxuan[i].parentNode.download)}; i++ ; if(i == qxuan.length){clearTimeout(myVar);} }, 600);}}"
  348. var jsng = xuanqu+ses+down
  349. var html='<html><head><meta charset="utf-8"><script>'+jsng+'</script><style>table, td, th {border: 1px solid black;vertical-align: middle;} .textCetent{text-align:center;}</style></head><body><h3 class="textCetent">'+GM_getValue("zhuti")+'</h3><table width="100%";height:100px;border-collapse: collapse;><tr border="0"><th colspan="6" bgcolor="Beige"><button onclick="opcheckboxed(\'checkbox\', \'checkall\')">全选</button> <button onclick="opcheckboxed(\'checkbox\', \'uncheckall\')">取消全选</button> <button onclick="opcheckboxed(\'checkbox\', \'reversecheck\')">反选</button> <button onclick="down(\'cop\')">拷贝所选链接</button> <button onclick="down(\'dow\')">下载所选图片</button></th></tr>'+str+'</table></body></html>'
  350. var newwindow = window.open('','_blank','width=600,height=900');
  351. newwindow.document.write(html);
  352. }
  353. })();

QingJ © 2025

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