SauceNao DirectLinks

2/1/2026, 9:08:47 PM

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name        SauceNao DirectLinks
// @namespace   Violentmonkey Scripts
// @match       https://saucenao.com/search.php*
// @grant       none
// @version     1.0
// @author      me :3
// @license MIT
// @description 2/1/2026, 9:08:47 PM
// ==/UserScript==
const sitePatterns = [
{
    name: 'nhentai',
    regex: /(?<=nhentai\/)\d+/
},
{
    name:'ehentai',
    regex:/ehentai\/.*?([a-f0-9]{40})/
},
{
    name:'kemono',
    regex:/\/kp\/.*?([a-f0-9]{64})/
}]
const SiteLinks = {kemono:"https://kemono.cr/search_hash?hash=",ehentai:"https://exhentai.org/?f_shash=",nhentai:"https://nhentai.net/g/"}
const ResultNum = document.getElementsByClassName("resultimage");
function AddIcon(Data,targdiv){


  const a = document.createElement("a");
  const img = document.createElement("img");
  img.width = 16;
  img.height = 16;
  img.border = 0;
  img.alt = "";
  const br = document.createElement("br");
  br.style.lineHeight = "2px";

    if(Data.name === "nhentai"){
    img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADc0lEQVRYR+1WWUhUYRT+7iz3zoyCpG22IIkhRUSSD23QagnaAplRVkZGkEKLJEFMlg+lBDH1YjTZQ1BYQUgEpRFFGaYUUqKWJS22qGmmjrPdWW7n3hybaRanmYl68MC83P/cc77/O9937jCJqWkC/lEIYIzMGIC/wYCGRppiVyBRkCPOyUAOBkZGwGuZA61yB7oYpzT0iI9gETXNsLNY6FAgWmB8KquFQFQpedQq7eiDEBkNiA3zrBzmOhV+5fxO5oSOM6Nebh/JCZuBGLrlPl6FDBsLWQAnNcrs0KrN6B2m3pUaFoAUuu0xiwpTnPKAJn5JN85XmSQN/B4hA2BJVOUmTUDKxWYD1HS3xogPjMMnyJABiNVEpZdYorCUhOcvdJwFlUqr3/OwAIhVOWLinCkKc3yMoZNEt0ltAO/bDJGz4WyHHBXmKCgIjHtUsFboWUtAfYTNgKt6qUWDlXalR7OdmiG0kucDRcQAZJINi63qkV5DtONWRQ/i577zHxEDsJiEqCNBuuK9TEC2ZnCU9hFcxRt5Fof5Xwy8I+o30whGC4mBIyd00ob40tWDR0+eSu8kJ81A+oolmD41HhzLYmDQgGfPm3H3YR1MJrNHXVF65eZozCcxusJA/k+LCnIEAoX44v3aBhQdP4XiogKsW7McDOPtn+6eXhzUlqGhsWmkWY6Nw36ryuuyucTAy2BE6ALQ1NoGtUqFmYkJ4HkbWtre4GtvH1ilEgtS59EZJzXpJzZWb8rD975+bOE5FNDvdwuKeRfJhueDsaELgOsKVbfvofSsHt+ogSumxU9Cpf40pkyeKD2qK9UDV6qR7Ea7+NxGvzf0ve8nF6jpQ3VIY4IhgBckDbgDuFl9H4VHy3xqJ3t9Okq1hdIZf6cOhkKdR95jhR1naPV2+Nn7vop6AVi2IRcfP3f6BJA0IwE11y9IZ7aGZgzuLBnJu6W04SRnQuC1413WA4DNZsesxRkY1qRX9oS4WNRXX5WeG1rfoiurCLGCDC/kThSoh8AT7X8aHgA6u3uwJDPHb43xsePQUHNNOm951Y6t2wqgpe13mb52zTT3UMIDwNsPn5CWtStoAOu250v/gkZbt4GAhQ0glFu7vzMGYIyB/4MBw5BRclLHp05h7Y69vD9lx46LYR7cuMSK523t74XsPQf85gbrDlpdxh8egOgJOdosqgAAAABJRU5ErkJggg==" ;
    a.href = Data.link;
    a.appendChild(img);
    targdiv.appendChild(a);
    targdiv.appendChild(br);
    }
    if(Data.name === "ehentai"){
    img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAVElEQVQ4T2NkoBAwUqifAWxAGpvgf3SDZv16DzccJg8TQ+ZT1wBkW5FdRLQLBt4AmLNBLkF2NrZABqkFqcMaiGQbMPBhQLELkOOevimRkgxFcW4EAHGHkBEVa0F8AAAAAElFTkSuQmCC";
    a.href = Data.link;
    a.appendChild(img);
    targdiv.appendChild(a);
    targdiv.appendChild(br);
    }
    if(Data.name === "kemono"){
    const targetLink = targdiv.querySelector('a[href*="kemono.party"]');
    targetLink.href = Data.link;
    }


}
function ProcessLinks(link,ParentDiv)
{
  for (const rule of sitePatterns) {
   const found = link.match(rule.regex);
   const IconDiv = ParentDiv.querySelector(".resultmiscinfo");
   if(found && rule.name === "nhentai"){let Data = {name:rule.name,link:SiteLinks.nhentai+found[0]};
    AddIcon(Data,IconDiv);break;}
   if(found && rule.name === "ehentai"){let Data = {name:rule.name,link:SiteLinks.ehentai+found[1]};
    AddIcon(Data,IconDiv); break;}
   if(found && rule.name === "kemono"){let  Data =  {name:rule.name,link:SiteLinks.kemono+found[1]};
    AddIcon(Data,IconDiv); break;}
    }
}

for (let i = 0; i < ResultNum.length; i++) {
    const imgDiv = document.getElementById("resImage" + i);
    if (!imgDiv) continue;
    const link = imgDiv.getAttribute('data-src') || imgDiv.getAttribute('src');
    if (!link) continue;
    const tr = imgDiv.closest("tr");


    ProcessLinks(link,tr);



}