发新话题
打印

greasemonkey的g.e-h的相册下载解析脚本

greasemonkey的g.e-h的相册下载解析脚本

嘛~~最近迷上了脚本,虽然做的都是比较和谐的东西,但还算不错吧,这个是别人完成的脚本,但网站升级封了这个脚本,我在封了后两小时作出的fix。


修改了解析的正则匹配,以及通过xpath实现了比较高效的动态id的捕捉。嘛~~~小有功德吧


引用:
// ==UserScript==
// @name           g.e-hentai.org downloader fixed *
// @namespace      http://g.e-hentai.org
// @description    g.e-hentai downloader 批量下载地址解析
// @include        http://g.e-hentai.org/*
// ==/UserScript==

function parse_html(html)
{
    var m;
    var out = {};
    var re_next = /<a +href="([^"]*)"[^>]*>[ \t]*<img[^>]+alt="Next"/;
    m = re_next.exec(html);
    if (m)
    {
        out.next_url = m[1];
    }
    var re_img = /<img +id="*"[^>]+src="([^"]+)"/
    m = re_img.exec(html);
    if (m)
    {
        out.img_url = m[1];
    }
//Page 1 / 223
    var re_page = /Page ([0-9]+) \/ ([0-9]+)/
    m = re_page.exec(html);
    if (m)
    {
        out.current = parseInt(m[1]);
        out.total = parseInt(m[2]);
    }
    return out;
}

function build_ui()
{
    var imgid=getimgid();
    var main = document.getElementById(imgid).parentNode;
    var main2 = document.createElement('div');
    main2.innerHTML='<div id="__status__"></div><div id="__output__"></div>';
    main.parentNode.replaceChild(main2,main);
}
function append_output(html)
{
    document.getElementById('__output__').innerHTML += html;
}
function set_status(html)
{
    document.getElementById('__status__').innerHTML = html;
}
function do_current()
{
    var current_out = unsafeWindow.__currentout__;
    //Thanks neozone for the code
    if ('img_url' in current_out)
{
if(current_out.current<10)
append_output('<a href="'+current_out.img_url+'">00'+current_out.current+'</a>  ');
else if(current_out.current<100)
append_output('<a href="'+current_out.img_url+'">0'+current_out.current+'</a>  ');
else
append_output('<a href="'+current_out.img_url+'">'+current_out.current+'</a>  ');
}
    //ajax next
    do_next();
}
function do_next()
{
    var current_out = unsafeWindow.__currentout__;
    if (current_out.current < current_out.total &&
        'next_url' in current_out)
    {
        var url = current_out.next_url;
        set_status('current:'+current_out.current+'/'+current_out.total+'<br/>fetch:'+url);
        function onload(resp)
        {
            if (resp.status!=200){do_error('download error:'+resp.statusText);return;}
            var out = parse_html(resp.responseText);
            //todo::handle parse error
            var items = [];
            for (x in out){items.push(x);}
            if (items.length<4)
            {
                //GM_log('error url:'+resp.finalUrl);
                //GM_log('error html:'+resp.responseText);
                do_error('Parse error:'+resp.responseText);
                return;
            }
            unsafeWindow.__currentout__ = out;
            do_current();
        }
        GM_xmlhttpRequest({
            method:'GET',
            url:url,
            headers:{
                'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.4) Gecko/2008102920 Firefox/3.5.1',
                'Referer':document.location.href,
                'Cookie':document.cookie
            },
            onload:onload,
            onerror:do_error
        });
    }
}
function do_error(reason)
{
    //GM_log('do_error='+reason);
    var html = '<button id="__continue__">Continue</button><br/>';
    var txt = document.createTextNode(reason);
    var div = document.createElement('div');
    div.appendChild(txt);
    set_status(html+div.innerHTML);
    document.getElementById('__continue__').addEventListener('click',function(e){
        set_status('');
        do_next();
    },false)
}
function btn_download_click(e)
{
    document.getElementById('__btn_download__').disabled = true;
    unsafeWindow.__currentout__ = parse_html(document.documentElement.innerHTML);
    build_ui();
    do_current();
}
var tmp = document.getElementById('imgtext_1');
if (tmp)
{
    var div = document.createElement('div');
    div.innerHTML = '<button id="__btn_download__">Download</button>';
    tmp.parentNode.insertBefore(div,tmp);
    var btn = document.getElementById('__btn_download__');
    btn.addEventListener('click',btn_download_click,false);
}
function getimgid()
{
var allLinks, thisLink;
allLinks = document.evaluate(
    '//img[@id]',
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
for (var i = 0; i < allLinks.snapshotLength; i++) {
    thisLink = allLinks.snapshotItem(i);
    // do something with thisLink
    return thisLink.id;
}
}

TOP

发新话题
最近访问的版块