您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Binds ctrl+s to a download on gelbooru
// ==UserScript== // @name Gelbooru CTRL+S Binds // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description Binds ctrl+s to a download on gelbooru // @author JFKennedy // @match https://gelbooru.com/* // @icon https://google.com/s2/favicons?sz=64&domain=gelbooru.com // @grant GM_xmlhttpRequest // @license MIT // ==/UserScript== document.addEventListener('keydown',e=>{ const fetchWithTampermonkey = async (url, responseType = 'blob') => { return new Promise((resolve, reject) => { const loader = document.createElement('div'); loader.style.height='4px'; loader.style.width='100vw'; loader.style.position='fixed'; loader.style.top='0'; loader.style.left='0'; loader.style.display='block'; loader.style.background='#1a1a1a00'; const loaderInner = document.createElement('div'); loaderInner.style.height=loader.style.height; loaderInner.style.width='0'; loaderInner.style.position='fixed'; loaderInner.style.top='0'; loaderInner.style.left='0'; loaderInner.style.display='block'; loaderInner.style.background='#aa99ff'; loader.appendChild(loaderInner); const loaderInner2 = document.createElement('div'); loaderInner2.style.height=loader.style.height; loaderInner2.style.width=loader.style.height; loaderInner2.style.position='fixed'; loaderInner2.style.top='0'; loaderInner2.style.right='0'; loaderInner2.style.display='block'; loaderInner2.style.filter='blur(2px)'; loaderInner2.style.background=loaderInner.style.background; loaderInner2.style.borderRadius='128px'; loaderInner.appendChild(loaderInner2); document.body.appendChild(loader); GM_xmlhttpRequest({ method: 'GET', url, responseType, // specify the desired responseType onload: (response) => { if (response.status === 200) { if (responseType === 'blob') { resolve(new Blob([response.response], { type: response.responseHeaders.match(/content-type: (.*)/i)[1] })); } else { resolve(response.responseText); } loader.remove(); } else { setTimeout(()=>loader.remove(),1000) loaderInner.style.background='#ffaaaa' loaderInner2.style.background='#ffaaaa' reject(new Error('Request failed with status ' + response.status)); } }, onprogress: function(progress) { const percent = progress.lengthComputable ? (progress.position/progress.totalSize) : 100; console.log(progress,percent); loaderInner.style.width=`${percent*100}vw` loaderInner2.style.left=loaderInner; }, onerror: (error) => { reject(error); }, }); }); }; const id = new URLSearchParams(location.search).get('id') if (e.key === 's' && e.ctrlKey && id) { e.preventDefault() document.querySelectorAll('a[href*="https://"][target="_blank"][rel="noopener"]').forEach(async v=>{ if (v.textContent.includes('Original image')) { const url = v.href; const data = await fetchWithTampermonkey(url); const dlUrl = URL.createObjectURL(data); const a = document.createElement('a'); a.href=dlUrl; a.download = `${id}.${url.split('.').pop()}` || ('img-'+Date.now()); document.body.appendChild(a) a.click() } }) } })