您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Rehost images to a whitelisted site by ctrl+shift+clicking them
// ==UserScript== // @name Rehost image to... // @version 1.13 // @description Rehost images to a whitelisted site by ctrl+shift+clicking them // @author Chameleon // @include * // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_setClipboard // @namespace https://greasyfork.org/users/87476 // ==/UserScript== (function() { 'use strict'; if(window.location.host == "redacted.ch" && window.location.href.indexOf("threadid=1719") != -1) { var threadid=parseInt(window.location.href.split('threadid=')[1]); if(threadid===1719) showSettings(); } var images = document.getElementsByTagName('img'); for(var i=0; i<images.length; i++) { var im=images[i]; im.addEventListener('click', rehost.bind(undefined, im), false); } })(); function showSettings(message) { var div=document.getElementById('rehostToSettings'); if(!div) { var before = document.getElementsByClassName('forum_post')[0]; div = document.createElement('div'); div.setAttribute('id', 'rehostToSettings'); before.parentNode.insertBefore(div, before); div.setAttribute('style', 'width: 100%; text-align: center; padding-bottom: 10px;'); div.setAttribute('class', 'box'); } div.innerHTML = '<h2>Rehost image to... Settings</h2><br />'; var settings = getSettings(); var a=document.createElement('a'); a.href='javascript:void(0);'; a.innerHTML = 'Use image host: '+settings.site; a.addEventListener('click', changeSite.bind(undefined, a, div), false); div.appendChild(a); div.appendChild(document.createElement('br')); var a=document.createElement('a'); a.href='javascript:void(0);'; a.innerHTML = 'Debug: '+(settings.debug ? 'On':'Off'); a.addEventListener('click', changeA.bind(undefined, a, div), false); div.appendChild(a); div.appendChild(document.createElement('br')); var labelStyle = ''; var label = document.createElement('span'); label.setAttribute('style', labelStyle); label.innerHTML = 'ptpimg.me API Key: '; div.appendChild(label); var input=document.createElement('input'); input.setAttribute('style', 'width: 21em;'); input.placeholder='ptpimg.me API Key'; input.value = settings.apiKey ? settings.apiKey:''; div.appendChild(input); input.addEventListener('keyup', changeSettings.bind(undefined, div), false); var a=document.createElement('a'); a.href='javascript:void(0);'; a.innerHTML = 'Get ptpimg.me API Key'; div.appendChild(document.createElement('br')); div.appendChild(a); div.appendChild(document.createTextNode(' ')); var s=document.createElement('span'); s.innerHTML = message ? message : ''; div.appendChild(s); a.addEventListener('click', getAPIKey.bind(undefined, input, s, div), false); } function getAPIKey(input, span, div) { span.innerHTML = 'Loading ptpimg.me'; /*var xhr=new XMLHttpRequest(); xhr.open('GET', "https://ptpimg.me"); xhr.onreadystatechange = xhr_func.bind(undefined, span, xhr, gotAPIKey.bind(undefined, input, span, div), rehost.bind(undefined, input, span, div)); xhr.send();*/ GM_xmlhttpRequest({ method: "GET", url: 'https://ptpimg.me', onload: function(response) { if(response.status == 200) {gotAPIKey(input, span, div, response.responseText); } else { span.innerHTML = 'ptpimg.me error: '+response.status; } } }); } function gotAPIKey(input, span, div, response) { var key=response.split("value='")[1].split("'")[0]; if(key.length != 36) { span.innerHTML = "You aren't logged in to ptpimg.me"; return; } input.value=key; changeSettings(div, 0, "Successfully added API Key"); } function changeA(a, div) { if(a.innerHTML.indexOf('On') != -1) { a.innerHTML=a.innerHTML.replace('On', 'Off'); } else { a.innerHTML=a.innerHTML.replace('Off', 'On'); } changeSettings(div); } function changeSite(a, div) { if(a.innerHTML.indexOf('imgur.com') != -1) { a.innerHTML = a.innerHTML.replace('imgur.com', 'ptpimg.me'); } else if(a.innerHTML.indexOf('ptpimg.me') != -1) { a.innerHTML = a.innerHTML.replace('ptpimg.me', 'imgur.com'); } changeSettings(div); } function changeSettings(div) { var settings = getSettings(); var as=div.getElementsByTagName('a'); if(as[0].innerHTML.indexOf('imgur.com') != -1) settings.site = 'imgur.com'; else if(as[0].innerHTML.indexOf('ptpimg.me') != -1) settings.site = 'ptpimg.me'; if(as[1].innerHTML.indexOf('On') != -1) { settings.debug=true; } else settings.debug=false; var inputs=div.getElementsByTagName('input'); settings.apiKey = inputs[0].value; window.localStorage.ptpimgAPIKey = settings.apiKey; // can't use localStorage as the script runs across domains //window.localStorage.rehostImageToSettings = JSON.stringify(settings); GM_setValue('rehostImageToSettings', JSON.stringify(settings)); showSettings(); } function getSettings() { // can't use localStorage as the script runs across domains //var settings = window.localStorage.rehostImageToSettings; var settings = GM_getValue('rehostImageToSettings', false); if(!settings) { settings = {site:'imgur.com', apiKey:window.localStorage.ptpimgAPIKey ? window.localStorage.ptpimgAPIKey : ''}; } else settings = JSON.parse(settings); return settings; } function rehost(image, event) { var alreadySent = image.getAttribute('sent'); debug("shift: "+event.shiftKey+", ctrl: "+event.ctrlKey+", cmd: "+event.metaKey+", alreadySent: "+alreadySent); if(event.shiftKey && (event.ctrlKey || event.metaKey) && alreadySent != "true") { event.preventDefault(); image.setAttribute('sent', 'true'); var a=document.createElement('a'); var imagePlace = image.getBoundingClientRect(); a.setAttribute('style', 'position: absolute; z-index: 50000000; top: '+(imagePlace.top+window.scrollY)+'px; left: '+(imagePlace.left+window.scrollX)+'px; width: '+image.width+'px; text-align: center; color: blue; background: rgba(255,255,255,0.6); border-radius: 0px 0px 10px 10px;'); debug("top: "+(imagePlace.top+window.scrollY)+"px<br />left: "+(imagePlace.left+window.scrollX)+"px<br />width: "+image.width+"px"); a.innerHTML = 'Rehosting'; document.body.appendChild(a); if(image.src.indexOf("discogs.com") != -1 || image.src.indexOf("elparaisorecords.com") != -1) { image.src = "http://reho.st/"+image.src; } doRehost(a, image.src); } } function doRehost(a, imageSrc) { var settings = getSettings(); if(settings.site == 'imgur.com') { var formData = new FormData(); formData.append('image', imageSrc); var xhr = new XMLHttpRequest(); xhr.open('POST', 'https://api.imgur.com/3/image'); xhr.setRequestHeader('Authorization', 'Client-ID 735033a56fe790b'); xhr.onreadystatechange = xhr_func.bind(undefined, a, xhr, uploaded.bind(undefined, a, settings), doRehost.bind(undefined, a, imageSrc)); xhr.send(formData); } else if(settings.site == 'ptpimg.me') { if(!settings.apiKey || settings.apiKey.length != 36) { a.innerHTML = 'No valid ptpimg.me API key set'; return; } /*var formData = new FormData(); formData.append('link-upload', image_input.value); formData.append('api_key', 'xx'); // ptpimg.me doesn't have 'Access-Control-Allow-Origin' set var xhr = new XMLHttpRequest(); xhr.open('POST', 'https://ptpimg.me/upload.php'); xhr.onreadystatechange = xhr_func.bind(undefined, a, xhr, uploaded.bind(undefined, a, form, settings), doRehost.bind(undefined, a, image_input, form, settings)); xhr.send(formData);*/ // use GM_xmlhttpRequest for cross-domain GM_xmlhttpRequest({ method: "POST", url: 'https://ptpimg.me/upload.php', data: "link-upload="+encodeURIComponent(imageSrc)+'&api_key='+settings.apiKey, headers: { "Content-Type": "application/x-www-form-urlencoded" }, onload: function(response) { if(response.status == 200) {uploaded(a, settings, response.responseText); } else { a.innerHTML = 'ptpimg.me error: '+response.status; } } }); } } function debug(message) { var settings=getSettings(); if(!settings.debug) return; var div=document.getElementById('rehostDebug'); if(!div) { div=document.createElement('div'); div.setAttribute('style', 'position: absolute; top: 50px; left: 20px; min-width: 500px; background: black; color: white;'); div.setAttribute('id', 'rehostDebug'); document.body.appendChild(div); } div.innerHTML +=message+'<br />'; } function uploaded(a, settings, response) { var newLink=''; try { if(settings.site == 'imgur.com') newLink = JSON.parse(response).data.link.replace(/http:/, 'https:'); else if(settings.site == 'ptpimg.me') { var r=JSON.parse(response)[0]; newLink = "https://ptpimg.me/"+r.code+'.'+r.ext; } } catch(err) { a.innerHTML = err.message; a.style.color = 'red'; return; } debug("Rehosted: "+newLink); rehosted(a, newLink); } function rehosted(a, link) { a.style.color = 'green'; a.innerHTML = 'Rehosted<br />and copied to clipboard'; a.href = link; GM_setClipboard(link); } function xhr_func(messageDiv, xhr, func, repeatFunc) { if(xhr.readyState == 4) { if(xhr.status == 200) func(xhr.responseText); else { messageDiv.innerHTML = 'Error: '+xhr.status+'<br />retrying in 1 second'; window.setTimeout(repeatFunc, 1000); } } }