- // ==UserScript==
- // @name 图片采集下载工具
- // @namespace http://tampermonkey.net/
- // @version 1.1
- // @description 测试一下
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_listValues
- // @grant GM_deleteValue
- // @grant GM_download
- // @author yinyi
- // @include *
- // ==/UserScript==
- (function() {
- //全局变量
- var ci = 0
- var time = 0
- var huan = 0
- var time1 = 0
- var dian = 0
- var myVar;
- var zifuchangdu;
- var img_src = new Array();
- var img_name = new Array();
-
- //检测为分页采集模式跳转
- if(GM_getValue("moshi") == 2 && GM_getValue("caijixia") !== undefined && GM_getValue("caijitu") !== undefined && GM_getValue("zhuti") !== undefined){
- img_src=GM_getValue("imgurl");
- img_name=GM_getValue("imgname");
- zifuchangdu=GM_getValue("zifucd");
- console.log(GM_getValue("imgurl"));
- console.log(GM_getValue("imgname"));
- console.log(GM_getValue("caijixia"));
- jiansuo();
-
- var tiaozhuan = document.evaluate(GM_getValue("caijixia"), document).iterateNext();
- if(tiaozhuan){
- console.log(tiaozhuan)
- if(tiaozhuan.href.substring(tiaozhuan.href.length-1) == "#"){
- tiaozhuan.href = tiaozhuan.href.substring(0,tiaozhuan.href.length-1)
- }
- if(tiaozhuan.href && tiaozhuan.href !== window.location.href){
- console.log("有href"+tiaozhuan.href +"||"+ window.location.href)
- setTimeout(function(){ GM_setValue("winurl",window.location.href);tiaozhuan.click(); }, 300);
- }else{
- console.log("无href")
- if(tiaozhuan.parentNode.href){
- console.log("上层有"+tiaozhuan.parentNode)
- setTimeout(function(){ GM_setValue("winurl",window.location.href);tiaozhuan.parentNode.click(); }, 300);
- }else{
- console.log("结束")
- xiazai();
- qingchu();
- }
- }
- }else{
- console.log("Xpath 的规则无法定位,尝试测算url 进行下一页跳转")
- var qwin = GM_getValue("winurl")
- console.log(qwin)
- console.log(qwin[0]+"||"+window.location.host)
- console.log(qwin[1]+"||"+window.location.pathname)
-
- if(qwin !== window.location.href){
- var zurl = "";
-
- zurl = zifu(qwin,window.location.href)
-
- console.log(zurl)
- $.ajax({
- url: zurl,
- type: 'GET',
- complete: function(response) {
- if(response.status == 200) {
- setTimeout(function(){ GM_setValue("winurl",window.location.href);window.open(zurl,"_self"); }, 300);
- } else {
- console.log("测算uel无效,终止")
- xiazai()
- qingchu();
- }
- }
- });
- }
-
- }
- }
- function qingchu(){
- GM_deleteValue("moshi")
- GM_deleteValue("caijixia")
- GM_deleteValue("caijitu")
- GM_deleteValue("winurl")
- GM_deleteValue("zhuti")
- GM_deleteValue("imgurl")
- GM_deleteValue("imgname")
- }
-
- //测算url 的字符处理模块
- function zifu(q,d){
- var qi = "";
- var hi = "";
- var qn = 0;
- for(var i = 0;i<d.length;i++){
- if(q.substring(0,i+1) == d.substring(0,i+1)){
- qn = i;
- qi = d.substring(0,i+1)
- }
- if(q.substring(q.length-i,q.length) == d.substring(d.length-i,d.length)){
- console.log(q.substring(q.length-i,q.length) +"||"+ d.substring(d.length-i,d.length))
- hi = d.substring(d.length-i,d.length)
- }
- }
- //console.log(qi+"||"+hi)
- //console.log(d.substring(qn+1,d.lastIndexOf(hi)))
- var ye = d.substring(qn+1,d.lastIndexOf(hi))
- ye = Number(ye)+1
- var hurl = qi+ye+hi
- return hurl
- }
- //定位元素 Xpath 的规则模块
- // function readXPath(element) {
- // if (element.id !== "") {return '//*[@id=\"' + element.id + '\"]';}
- // if (element == document.body) {return '/html/' + element.tagName.toLowerCase();}
- // var ix = 1,
- // siblings = element.parentNode.childNodes;
-
- // for (var i = 0, l = siblings.length; i < l; i++) {
- // var sibling = siblings[i];
- // if (sibling == element) {
- // return arguments.callee(element.parentNode) + '/' + element.tagName.toLowerCase() + '[' + (ix) + ']';
- // } else if (sibling.nodeType == 1 && sibling.tagName == element.tagName) {
- // ix++;
- // }
- // }
- // };
- //////////
- function readXPath(element) {
- if (element.id!==""){
- return '//*[@id=\"'+element.id+'\"]';
- }
-
- if (element.getAttribute("class")!==null){
- return '//*[@class=\"'+element.getAttribute("class")+'\"]';
- }
-
- if (element==document.body){
- return '/html/'+element.tagName;
- }
-
-
- var ix= 0,
- siblings= element.parentNode.childNodes;
-
- for (var i= 0,l=siblings.length; i<l; i++) {
- var sibling= siblings[i];
- if (sibling==element){
- return arguments.callee(element.parentNode)+'/'+element.tagName+((ix+1)==1?'':'['+(ix+1)+']');
- }else if(sibling.nodeType==1 && sibling.tagName==element.tagName){
- ix++;
- }
- }
- };
-
-
-
- //检测设置快捷键
- if(!GM_getValue("kuaijiejian")){
- alert("检测到第一次运行故做以下提示:/n 1:默认快捷键【Esc】,如需自定快捷键,可以在关闭本提示之后,长按3秒当前设定的快捷键进行更改.")
- GM_setValue("kuaijiejian",27)
- }
-
- //快捷键验证模块
- function yanzheng(event) {
- var e = event || window.event || arguments.callee.caller.arguments[0];
- //快捷键替换
- if(huan == 1){
- huan = 0;
- GM_setValue("kuaijiejian",e.keyCode);
- alert("快捷键替换完成");
- return;
- }
-
- if(e && e.keyCode==GM_getValue("kuaijiejian")){return 1;}else{return 0;}}
-
-
- //快捷键按下
- document.onkeydown=function(event){
- var an = yanzheng(event)
- if(an == 1 && ci == 0){ci = 1;time = new Date().getTime();}
- }
-
-
- //快捷键抬起
- document.onkeyup=function(event){
- if(ci == 1){
- ci = 0;
- time = new Date().getTime()-time;
-
- if(time > 1200){
- huan = 1;
- alert("在关闭本提示之后,单击需要设定为快捷键的按键,请注意避免与其他软件或脚本快捷键冲突,不支持组合键")
- return;
- }else{
- GM_setValue("moshi",1)
- time1 = new Date().getTime()-time1
-
- if (time1 < 450){
- myStopFunction()
- GM_setValue("moshi",2)
- }else{
- GM_setValue("moshi",1)
- time1 = new Date().getTime()
- }
- myFunction()
- }
- }
-
- }
-
-
- function myFunction(){myVar=setTimeout(function(){zhixing()},500);}
- function myStopFunction(){clearTimeout(myVar);}
-
- //绑定鼠标点击执行模块
- function zhixing(){
- document.addEventListener('click', link, true);
- console.log(GM_getValue("moshi"))
- GM_deleteValue("caijixia")
- GM_deleteValue("caijitu")
- GM_deleteValue("zhuti")
- GM_deleteValue("imgurl")
- GM_deleteValue("imgname")
- }
-
-
- //点击触发功能
- function link(event) {
- event.preventDefault();
- event.stopPropagation();
-
- //moshi2触发Xpath 定位规则采集
- if(event.target.tagName !== "IMG" && GM_getValue("moshi") == 2){
- var inpt = prompt(" 请输入【下一页】按钮的Xpath定位",readXPath(event.target));
- if(inpt){
- //var data = document.evaluate(inpt, document).iterateNext();
- //console.log(data)
- GM_setValue("caijixia",inpt)
- console.log(GM_getValue("caijixia"));
- }
- }
-
- //对图片特征规则采集
- if(event.target.tagName == "IMG"){
- var inus = event.target.src.substring(event.target.src.indexOf("\."), event.target.src.lastIndexOf("\/")+1);
- zifuchangdu = event.target.src.substring(event.target.src.lastIndexOf("\/")+1,event.target.src.length).length;
- console.log(zifuchangdu)
- GM_setValue("zifucd",zifuchangdu)
- //分割URL 获取最后 / 符号之前部分作为预设特征码,获取格式
- var inpusers = prompt("请输入特征码",inus); // 弹出用户输入input框
- if(inpusers){
- GM_setValue("caijitu",inpusers)
- console.log(GM_getValue("caijitu"))
- //主题名称采集
- var text = event.target.alt.replace(/[^\u4e00-\u9fa5]/g, '')
- if(text == "" && document.evaluate('//h1', document).iterateNext() !== null){
- text = document.evaluate('//h1', document).iterateNext().innerHTML.replace(/[^\u4e00-\u9fa5]/g, '')
- }
- if(text == ""){text = "如需自定图片名称可以在此输入,否则请直接点击确定"}
- //预测匹配图片数量
- var img = document.getElementsByTagName("img")
- var yuce = new Array();
- for(var i = 0;i<img.length;i++){
- if(img[i].src.indexOf(GM_getValue("caijitu")) !== -1 && img[i].src.substring(img[i].src.lastIndexOf("\/")+1,img[i].src.length).length == zifuchangdu){
- if(yuce.indexOf(img[i].src) == -1){
- //判断数组中是否存在这个链接
- yuce[yuce.length] = img[i].src
- }
- }
- }
- var inp = prompt("检测图片 "+img.length+' 张 ,匹配图片 '+yuce.length+' 张。\n' + yuce.join('\n'),text);
- GM_setValue("zhuti",inp)
- jiansuo()
- }
- }
-
-
- //核对规则采集
- if(GM_getValue("imgurl") !== undefined && GM_getValue("imgname") !== undefined){
- if(GM_getValue("moshi") == 2){
- if(!GM_getValue("caijixia")) {
- alert("双击快捷键为多分页采集模式,当前还没采集【下一页】按钮的 Xpath 定位,请点击【下一页】按钮进行采集,\n\n建议多分页采集时,优先采集【下一页】按钮,再采集图片规则,避免出现本提示。")
- }else{
- document.removeEventListener('click', link, true);
- GM_setValue("winurl",window.location.href);
- var tiaozhuan = document.evaluate(GM_getValue("caijixia"), document).iterateNext();
- if(tiaozhuan.href && tiaozhuan.href !== window.location.href){
- setTimeout(function(){ tiaozhuan.click(); }, 300);
- }else{
- console.log("无href")
- if(tiaozhuan.parentNode.href){
- console.log("上层有"+tiaozhuan.parentNode)
- tiaozhuan.parentNode.click();
- }else{
- console.log("结束")
- qingchu();
- }
- }
- }
- }else{
- //删除鼠标点击事件
- document.removeEventListener('click', link, true);
- xiazai();
- }
- }
- }
- //检测特征码匹配
- function jiansuo(){
- var img = document.getElementsByTagName("img")
- var inp = GM_getValue("zhuti")
-
- for(var i = 0;i<img.length;i++){
- if(img[i].src.indexOf(GM_getValue("caijitu")) !== -1 && img[i].src.substring(img[i].src.lastIndexOf("\/")+1,img[i].src.length).length == zifuchangdu){
- if(img_src.indexOf(img[i].src) == -1){
- //判断数组中是否存在这个链接
- img_src[img_src.length] = img[i].src
- //匹配一个图片名称
- var n = "("+img_src.length+")"
- if(inp == ("" || "如需自定图片名称可以在此输入,否则请直接点击确定")){var name = img[i].src.substring(img[i].src.lastIndexOf("\/")+1,img[i].src.lastIndexOf("\."))}else{name = inp+n}
- img_name[img_name.length] = name
- }
- }
- }
- GM_setValue("imgurl",img_src);
- GM_setValue("imgname",img_name);
- console.log(GM_getValue("imgurl"));
- console.log(GM_getValue("imgname"));
- }
-
- //生成下载页面
- function xiazai() {
- var str = ""
- var i = 0;
- GM_getValue("imgurl").forEach(function(url) {
- 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>'
- i++
- });
- 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}}}}}"
- 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(); }'
- 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);}}"
- var jsng = xuanqu+ses+down
- 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>'
- var newwindow = window.open('','_blank','width=600,height=900');
- newwindow.document.write(html);
- }
- })();