您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Sleazy Fork is available in English.
Userscript for Motherless.com. Provide direct links for pictures and video files. Download all Images on one site with DownThemAll(firefox) or Download Master(Chrome).
当前为
// ==UserScript== // @name FapFun // @namespace https://greasyfork.org/scripts/7156-fapfun/code/FapFun.user.js // @description Userscript for Motherless.com. Provide direct links for pictures and video files. Download all Images on one site with DownThemAll(firefox) or Download Master(Chrome). // @require https://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js // @include htt*://motherless.com* // @version 4.1 // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grand UnsafeWindow // @author sodomgomora // @license GPLv3 // ==/UserScript== // Some of this script based on Pornifier2 script by Jesscold // This script is realesed under GPL v3 // Globals var debug = false; var images = []; var ids = []; var imagesUrl = []; var siteurls = []; var thisurl = ''; // Start the magic main(); function fapLog(log) { if (debug === true) { console.log(log); return; } return; } function main() { fapLog('entered main'); // try to become Premium // setTimeout(function(){ // unsafeWindow.__is_premium = true; //really motherless? // }, 500); thisurl = window.location.href; var inputList = document.createElement('input'); inputList.type = 'button'; inputList.value = 'Images URLs'; inputList.name = 'imagesurl'; inputList.onclick = getImageList; inputList.setAttribute('style', 'font-size:18px;position:fixed;top:100px;right:20px;z-index:10000;'); document.body.appendChild(inputList); addSinglePreview(); checkForPaginationLinks(function (hasOne) { fapLog('main: haseOne= ' + hasOne); if (hasOne > 0) { var inputAllImages = document.createElement('input'); inputAllImages.type = 'button'; inputAllImages.value = 'Get all Images'; inputAllImages.name = 'getallimages'; inputAllImages.onclick = getAllImages; inputAllImages.setAttribute('style', 'font-size:18px;position:fixed;top:140px;right:20px;z-index:10000;'); document.body.appendChild(inputAllImages); } return; }); return; } function addResetButton() { var resetButton = document.createElement('input'); resetButton.type = 'button'; resetButton.value = 'Reset'; resetButton.name = 'deletevalue'; resetButton.onclick = deleteGMValue; resetButton.setAttribute('style', 'font-size:18px;position:fixed;top:220px;right:20px;z-index:10000;'); document.body.appendChild(resetButton); return; } function checkForPaginationLinks(cb) { var ret = ''; ret = $('.pagination_link').contents().text(); fapLog('checkForPaginationLinks: entered!'); fapLog('checkForPaginationLinks: ret= ' + ret); if (ret === '') { cb(0); return; } else { cb(1); return; } } //----- Button onclick functions ----- function deleteGMValue() { fapLog('deleteGMValue: thisurl= ' + thisurl); GM_deleteValue(thisurl); $('input[name*=\'deletevalue\']').remove(); $('input[name*=\'stopvalue\']').remove(); } function getAllImages() { var href = ''; var lasttmp = 0; ids = [ ]; href = window.location.href; href = href.replace(/^(http|https):\/\//i, ''); fapLog('getAllImages: href= ' + href); var url = getUrl(href); if (GM_getValue(url.allsites) != undefined) { fapLog('getAllImages: was processed earlyer!'); addResetButton(); displayOverlay(imagesUrl, 'lasti', url.allsites); thisurl = url.allsites; return; } thisurl = url.allsites; sneakyXHR(url.onesite, function (src) { fapLog('getAllImages: callback from sneakyXHR = ' + src); var urlwithoutpagenumber = url.onesite.substring(0, url.onesite.length - 1); $firstids = $('<div>' + src + '</div'); $firstsite = $('<div>' + src + '</div').find('.pagination_link a'); fapLog($firstsite); $firstsite.each(function () { var tmp = parseInt($(this).text()); if (tmp > lasttmp) { lasttmp = tmp; } }); var headers = { 'Accept': 'text/xml', 'Range': 'bytes=0-300' }; //load last paginationsite if last is realy true GM_xmlhttpRequest({ method: 'get', 'url': urlwithoutpagenumber + lasttmp, headers: $.extend({ }, { 'User-agent': 'Mozilla/4.0', 'Accept': 'text/xml', 'Range': 'bytes=0-300', 'Cookie': document.cookie }, headers || { }), onload: function (responseDetails) { var lastsitetmp = 1; var text = responseDetails.responseText; $lastsite = $('<div>' + text + '</div').find('.pagination_link a'); fapLog($lastsite); $lastsite.each(function () { var tmp = parseInt($(this).text()); if (tmp > lastsitetmp) { lastsitetmp = tmp; } }); fapLog('getAllImages: lasttmp= ' + lasttmp + ' lastsitetmp=' + lastsitetmp); if (lasttmp < lastsitetmp) { lasttmp = lastsitetmp; } $test = $firstids.find('img[src^="http://cdn4.thumbs.motherlessmedia.com/thumbs/"]'); $test.each(function () { try { var id = $(this).attr('data-strip-src').match('thumbs/([^?]+).\\w'); } catch (err) { return; } ids.push(id[1]); }); fapLog('getAllImages: lasttmp= ' + lasttmp); //paginationsite shown but has no link if (lasttmp == 0) { getImages('getallimages', ids); return; } var urlwithoutpagenumber = url.onesite.substring(0, url.onesite.length - 1); for (var i = 2; i < lasttmp + 1; i++) { var lenght = siteurls.push(urlwithoutpagenumber + i); } fapLog('getAllImages: siteURLs= ' + siteurls); addStop(); parralelizeTask(siteurls, loopGetSites, 'getallimages', function () { getImages('getallimages', ids); ids = []; return; }); } }); }, 'get', { 'Accept': 'text/xml', 'Range': 'bytes=0-300' //grab first 3k }); return; } // retrun URLs for user,group,galleries and search page function getUrl(href) { var url = ''; var urlall = ''; var parthref = ''; var n = href.indexOf('?'); if (n != -1) { parthref = href.substring(0, n); } else { parthref = href; } fapLog('getUrl: parthref= ' + parthref); var casesn = parthref.indexOf('/'); var cases = parthref.substring(casesn + 1, casesn + 2); fapLog('getUrl: cases= ' + cases); switch (cases) { case 'G': var gup = parthref.substring(casesn + 3, parthref.lenght); fapLog('getUrl: gup= ' + gup); url = 'http://motherless.com/GI' + gup + '?page=1'; urlall = 'http://motherless.com/GI' + gup; break; case 'g': var g = parthref.substring(casesn + 3, parthref.lenght); fapLog('getUrl: g= ' + g); url = 'http://motherless.com/gi' + g + '?page=1'; urlall = 'http://motherless.com/gi' + g; break; case 'u': var u = parthref.substring(casesn, parthref.lenght); fapLog('getUrl: u= ' + u); url = 'http://motherless.com' + u + '?t=i&page=1'; urlall = 'http://motherless.com' + u; break; case 't': var t = parthref.substring(casesn, parthref.lenght); fapLog('getUrl: t= ' + t); url = 'http://motherless.com' + t + '?range=0&size=0&sort=relevance&page=1'; urlall = 'http://motherless.com' + t; break; } return { onesite: url, allsites: urlall }; } function getImageList() { fapLog('getImageList: pressed'); thisurl = window.location.href; if (thisurl.indexOf('?') == -1) { thisurl = thisurl + '?page=1'; } if (GM_getValue(thisurl) != undefined) { addResetButton(); displayOverlay(data = [], 'lasti', thisurl); return false; } getImages('imagesurl', images); return; } function getVideoUrl() { alert('not jet implemented!'); return; } // Get url for full image and add url under thumbnail function addSinglePreview() { var data = []; var i = 0; var imgs = $('img[src^="http://cdn4.thumbs.motherlessmedia.com/thumbs/"]'); if (typeof unsafeWindow.__fileurl != "undefined") { fapLog('Script url found: ' + unsafeWindow.__fileurl); var $wrap = $('.media-action-networks'); fapLog('TEst' + $wrap.toSource()); var videourl = $('<strong>Video URL: </strong><a href=\'' + unsafeWindow.__fileurl + '\' class=\'pop\'>Download</a>'); $wrap.after(videourl); } fapLog('image urls found: ' + imgs.length); imgs.each(function () { var $wrap = $(this); if ($wrap.data('p2-preview')) { return; } $wrap.data('p2-preview', 'yep'); var $a = $wrap.closest('a'); var vid = $wrap.attr('src').match('thumbs/([^.]+).\\w'); // test for video preview and not an image var vlink = vid[1]; var n = vlink.indexOf('-'); vlink = vlink.substring(n, vlink.length); fapLog('vlink: ' + vlink); // is a video if (vlink == '-small') { var videoClicky = $('<a href=\'javascript;\' class=\'p2-single-preview\'>View Video</a>'); $a.after(videoClicky); var href = $a.attr('href').match(/\.com\/(\w)(\w+)/) ? [ RegExp.$1, RegExp.$2 ] : false; videoClicky.click(function (e, single) { var $this = $currentSingle = $(this); $this.text('loading...'); var id = $wrap.attr('data-strip-src').match('thumbs/([^.]+).\\w'); var vl = id[1]; var n = vl.indexOf('-'); id[1] = vl.substring(0, n); fapLog('addSinglePreview: found url for video: ' + id[1]); if (!id) { $this.text('cant load :P'); return; } var timer = setTimeout(function () { $this.text('cant load :P'); }, 8000); data[0] = {url: "http://cdn4.videos.motherlessmedia.com/videos/" + id[1] +".mp4?fs=opencloud"} fapLog('addSinglePreview: video src: ' + data.toSource()); displayOverlay(data, 'video'); $this.text('View Video'); clearTimeout(timer); return false; }); } else { try { var id = $wrap.attr('data-strip-src').match('thumbs/([^?]+).\\w'); } catch (err) { fapLog(err.message); return; } images[i] = id[1]; i++; fapLog('fill images: image=' + images[i - 1] + ' index=' + i); var imageClicky = $('<a href=\'javascript;\' class=\'p2-single-preview\'>View full size</a>'); $a.after(imageClicky); var href = $a.attr('href').match(/\.com\/(\w)(\w+)/) ? [ RegExp.$1, RegExp.$2 ] : false; imageClicky.click(function (e, single) { var $this = $currentSingle = $(this); $this.text('loading...'); fapLog('found url for image: ' + id[1]); if (!id) { $this.text('cant load :P'); return; } var timer = setTimeout(function () { $this.text('cant load :P'); }, 8000); data[0] = {url: "http://cdn4.images.motherlessmedia.com/images/" + id[1] +"?fs=opencloud"} fapLog('addSinglePreview: image src: ' + data.toSource()); displayOverlay(data, 'image'); $this.text('View full size'); clearTimeout(timer); return false; }); } }); } function getImages(buttonname, arrimg) { fapLog('getImagesJPG: arrimg.length=' + arrimg.length); fapLog(arrimg); $button = $('input[name*=\'' + buttonname + '\']'); $button.val('working...'); arrimg.forEach( function (value) { imagesUrl.push("http://cdn4.images.motherlessmedia.com/images/" + value +"?fs=opencloud"); }); displayOverlay(imagesUrl, 'images', thisurl); $('input[name*=\'stopvalue\']').remove(); return; } function sneakyXHR(url, cb, method, headers) { method = method || 'GET'; fapLog('sneaky requesting: ' + url); setTimeout(function () { GM_xmlhttpRequest({ method: method, url: url, headers: $.extend({ }, { 'User-agent': 'Mozilla/4.0', 'Accept': 'text/xml', 'Range': 'bytes=0-300', 'Cookie': document.cookie }, headers || { }), onload: function (responseDetails) { var text = responseDetails.responseText; cb(text, responseDetails); } }); }, 1); return; } //-- handler for Overlay (jquery) function removeOverlay() { $('#overlay').remove(); return; } // show the full image as overlay and shrink it to screen resolution function displayOverlay(data, type, url) { var mywidht = window.innerWidth; var myheight = window.innerHeight; var html = ''; fapLog('monitor resolution: ' + window.innerWidth + ':' + window.innerHeight); switch (type) { case 'lasti': fapLog('displayOverlay: lasti: url= ' + url); html = GM_getValue(url); GM_setClipboard(GM_getValue(url + 'clipboard')); break; case 'image': html = '<table id=\'overlay\'><tbody><tr><td><div id="close"><img src=\'' + data[0].url + '\' style=\'width:auto; hight:auto; max-height:' + myheight + 'px; max-width:' + mywidht + 'px\'></div></td></tr></tbody></table>'; break; case 'video': html = '<table id=\'overlay\'><tbody><tr><td><video src="'+ data[0].url +'" type="video/mp4" controls></video><br><a href=\'' + data[0].url + '\'>Video Link</a><br><br><div id="close">Close</div></td></tr></tbody></table>'; break; case 'images': var clipboard = ''; var count = 1; $('input[name*=\'getallimages\']').val('Get all Images'); $('input[name*=\'imagesurl\']').val('Images URLs'); html = '<table id=\'overlay\'><tbody><tr><td><br><div id="close">Close</div>'; data.forEach(function (value) { html += '<a class=\'changeColorLink\' href=\'' + value + '\'>link ' + count + '</a> '; clipboard += value + ' '; count++; }); html += '</td></tr></tbody></table>'; GM_setClipboard(clipboard); GM_setValue(url, html.toString()); GM_setValue(url + 'clipboard', clipboard.toString()); break; } fapLog('displayOverlay: type= ' + type + ': html=' + html.toSource()); setTimeout(function () { var $el = $(html).css({ 'overlay':'before', 'position': 'fixed', 'top': 0, 'left': 0, 'width': '90%', 'height': '100%', 'background-color': 'rgba(0,0,0,.7)', 'z-index': 300000, 'vertical-align': 'middle', 'text-align': 'center', 'color': '#fff', 'font-size': '30px', 'font-weight': 'bold', 'overflow': 'hidden', 'cursor': 'auto' }); $('a.changeColorLink', $el).hover(function () { $(this).css('color', 'blue'); }, function () { $(this).css('color', 'pink'); }); $el.appendTo('body'); $("#close").click(function () { fapLog("BUTTON CLICK"); if ($('#overlay').length > 0) { removeOverlay(); return; } }); }, 50); return; } //----- PARALELLIZISE ----- //paralellize for getting all sites within pagination function loopGetSites(doneTask, value) { var timeout = setTimeout(function (){ fapLog("Timeout is called"); doneTask(); }, 120000); sneakyXHR(value, function (src) { clearTimeout(timeout); $firstids = $('<div>' + src + '</div'); $test = $firstids.find('img[src^="http://cdn4.thumbs.motherlessmedia.com/thumbs/"]'); $test.each(function () { try { var id = $(this).attr('data-strip-src').match('thumbs/([^?]+).\\w'); fapLog(id[1]); } catch (err) { fapLog(err.message); return; } if (id[1].lastIndexOf('-strip') != -1) { fapLog('loopGetSites: Falsche parameter. Enthält -strip'); return; } ids.push(id[1]); return; }); doneTask(); return; }, 'get', { 'Range': 'bytes=0-3000' //grab first 3k); }); } //helper function for parralelize functions function parralelizeTask(arr, fn, buttonname, done) { fapLog('parralelizeTask: arr= ' + arr); var total = arr.length; var maxtotal = total; fapLog('parralelizeTask: arr.length= ' + total); doneTask = function () { if (--total === 0) { done(); return; } $('input[name*=\'' + buttonname + '\']').val('processed:' + total); return; }; arr.forEach(function (value) { fn(doneTask, value); }); return; } function addStop() { var stopButton = document.createElement('input'); stopButton.type = 'button'; stopButton.value = 'Stop'; stopButton.name = 'stopvalue'; stopButton.onclick = stop; stopButton.setAttribute('style', 'font-size:18px;position:fixed;top:260px;right:20px;z-index:10000;'); document.body.appendChild(stopButton); return; } function stop() { displayOverlay(imagesUrl, 'images', thisurl); }