Greasy Fork

Greasy Fork is available in English.

图片采集下载工具

测试一下

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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);
}
})();