// ==UserScript== // @name Namu Hot Now // @name:ko 나무위키 실검 알려주는 스크립트 // @namespace https://arca.live/b/namuhotnow // @version 0.6 // @description 이게 왜 실검? // @author KEMOMIMI // @match https://namu.wiki/* // @match https://arca.live/ // @match https://arca.live/e/* // @match https://arca.live/u/* // @match https://arca.live/settings/* // @connect arca.live // @icon https://www.google.com/s2/favicons?sz=64&domain=namu.wiki // @grant GM_xmlhttpRequest // @downloadURL none // ==/UserScript== function findLinkByPartialMatch(pairs, searchString) { for (var i = 0; i < pairs.length; i++) { if (pairs[i].text.toLowerCase() === searchString.toLowerCase()) { return pairs[i].link; } } return null; } function getSpansContent() { var spansContent = []; var spans = document.querySelectorAll('#app ol span'); spans.forEach(function(span) { spansContent.push(span.textContent); }); return spansContent; } const targetURL = 'https://arca.live/b/namuhotnow'; var linkElements = []; var pairs = []; var previousSpansContent = getSpansContent(); var storedElements = []; function removeLinkElements() { for (var i = 0; i < linkElements.length; i++) { var linkElement = linkElements[i]; linkElement.parentNode.removeChild(linkElement); } linkElements = []; } function checkMobileHotkeword(){ var chk = setInterval(function() { const appElement = document.querySelector('#app form div > div'); if (!appElement) { var whyHotElements = document.querySelectorAll('.whyHot'); whyHotElements.forEach(function(element) { element.remove(); }); const elementsWithParentClass = document.querySelectorAll('.namuHotParentClass'); elementsWithParentClass.forEach(parentElement => { const childAElement = parentElement.querySelector('a'); if (childAElement) { parentElement.parentNode.insertBefore(childAElement, parentElement.nextSibling); parentElement.remove(); } }); }else{ if (document.querySelector('#app form div>div').textContent.trim() === '실시간 검색어') { const elementsWithParentClass = document.querySelectorAll('.namuHotParentClass'); let count = 0; elementsWithParentClass.forEach(parentElement => { const childAnchorElements = parentElement.querySelectorAll('a'); childAnchorElements.forEach(anchorElement => { if (anchorElement.getAttribute('href') === '#') { count++; } }); }); if (count == 0) { const elementsWithParentClass = document.querySelectorAll('.namuHotParentClass'); elementsWithParentClass.forEach(function(element) { element.remove(); }); } if (elementsWithParentClass.length == 0) { clearInterval(chk); refreshLink(2); } } } }, 100); } function refreshLink(type) { GM_xmlhttpRequest({ method: 'GET', url: targetURL, onload: function(response) { const htmlData = response.responseText; const parser = new DOMParser(); const doc = parser.parseFromString(htmlData, 'text/html'); var elements = doc.querySelectorAll('.article-list .list-table a:not(.notice)'); storedElements = Array.from(elements); elements.forEach(function(element) { var link = element.getAttribute('href'); var titleElement = element.querySelector('.title'); var text = titleElement ? titleElement.innerText.trim() : ''; pairs.push({text: text, link: link}); if (text.includes(',')) { var textArray = text.split(',').map(function(item) { return item.trim(); }); textArray.forEach(function(subText) { pairs.push({ text: subText, link: link }); }); } if (text.includes(' ')) { textArray = text.split(' ').map(function(item) { return item.trim(); }); textArray.forEach(function(subText) { pairs.push({ text: subText, link: link }); }); } if (text.includes('(')) { var removeParenthesis = text.replace(/\s*\([^)]*\)$/, ''); pairs.push({ text: removeParenthesis.trim(), link: link }); } }); if(type == 0){ previousSpansContent = getSpansContent(); var spans = document.querySelectorAll('#app span'); spans.forEach(function (span) { if (span.textContent.includes('실시간 검색어')) { var parentDiv = span.parentElement.parentElement; var realtimeList = parentDiv.querySelectorAll('li'); realtimeList.forEach(function(element) { var titleElement = element.querySelector('span'); var resultLink = findLinkByPartialMatch(pairs, titleElement.innerText.trim()); if (resultLink != null){ var linkElement = document.createElement('a'); linkElement.href = 'https://arca.live' + resultLink; linkElement.textContent = '이왜실?'; linkElement.display = 'flex' linkElement.width = '40%' linkElement.target="_blank" element.querySelector('a').style.width = "60%"; element.appendChild(linkElement); linkElements.push(linkElement); } }); } }); }else if(type == 1){ var firstLinkList = document.querySelector('aside .link-list'); var arcalinkElements = firstLinkList.querySelectorAll('a'); var titleArray = []; arcalinkElements.forEach(function(aLinkElement) { var resultLink = findLinkByPartialMatch(pairs, aLinkElement.getAttribute('title')); if(resultLink != null){ aLinkElement.style.paddingRight = "1em"; var newSpanHTML = `
${aLinkElement.getAttribute('title')}
`; aLinkElement.insertAdjacentHTML('beforebegin', newSpanHTML); aLinkElement.remove() } }); }else if(type == 2){ var namuHotParentClass = document.querySelectorAll('.namuHotParentClass'); if (!namuHotParentClass[0]) { var realtimeMobile = document.querySelector('#app form div>div'); var mobileParentDiv = realtimeMobile.parentElement; var mobileList = mobileParentDiv.querySelectorAll('a'); mobileList.forEach(function(element) { var resultLink = findLinkByPartialMatch(pairs, element.innerText.trim()); var newParent = document.createElement('span'); newParent.classList.add('namuHotParentClass'); if (resultLink != null){ var linkElement = document.createElement('a'); linkElement.href = 'https://arca.live' + resultLink; linkElement.textContent = '이왜실?'; linkElement.width = '20px' linkElement.target="_blank" linkElement.classList.add('whyHot'); element.style.width = "70%"; var beforePseudoElement = window.getComputedStyle(element, ':before'); element.parentNode.insertBefore(newParent, element); newParent.appendChild(element); newParent.appendChild(linkElement); newParent.style.display = 'flex'; linkElements.push(linkElement); }else{ element.parentNode.insertBefore(newParent, element); newParent.appendChild(element); element.style.width = "100%"; newParent.style.display = 'flex'; } }); checkMobileHotkeword(); } } } }); } function spansContentChanged(arr1, arr2) { return arr1.join() !== arr2.join(); } function hasAsideTag() { var asideElement = document.querySelector('aside'); return asideElement !== null; } function appendStyle(){ var style = document.createElement('style'); var css = ` .namuHotParentClass:nth-of-type(1) > a:nth-child(1):before { content: "1." !important; } .namuHotParentClass:nth-of-type(2) > a:nth-child(1):before { content: "2." !important; } .namuHotParentClass:nth-of-type(3) > a:nth-child(1):before { content: "3." !important; } .namuHotParentClass:nth-of-type(4) > a:nth-child(1):before { content: "4." !important; } .namuHotParentClass:nth-of-type(5) > a:nth-child(1):before { content: "5." !important; } .namuHotParentClass:nth-of-type(6) > a:nth-child(1):before { content: "6." !important; } .namuHotParentClass:nth-of-type(7) > a:nth-child(1):before { content: "7." !important; } .namuHotParentClass:nth-of-type(8) > a:nth-child(1):before { content: "8." !important; } .namuHotParentClass:nth-of-type(9) > a:nth-child(1):before { content: "9." !important; } .namuHotParentClass:nth-of-type(10) > a:nth-child(1):before { content: "10." !important; } .whyHot { align-items: center; border: 1px solid transparent; border-radius: var(--nav-bar-child-radius-var); display: flex; padding: var(--search-box-suggest-item-gutter-y-var) var(--search-box-suggest-item-gutter-x-var); text-decoration: none; word-break: break-all; } `; style.appendChild(document.createTextNode(css)); document.head.appendChild(style); } if (window.location.href.includes('namu.wiki')) { if(hasAsideTag()){ refreshLink(0); setInterval(function() { var currentSpansContent = getSpansContent(); if (spansContentChanged(previousSpansContent, currentSpansContent)) { removeLinkElements(); refreshLink(0); } }, 1000); }else{ var interNamuMobile = setInterval(function() { var firstLinkLista = document.querySelector('#app form div > div'); if (firstLinkLista) { if (firstLinkLista.textContent.trim() === '실시간 검색어') { clearInterval(interNamuMobile); appendStyle(); refreshLink(2); } } }, 50); } } if (window.location.href.includes('arca.live')) { var intervalId = setInterval(function() { var firstLinkLista = document.querySelector('aside .link-list a'); if (firstLinkLista && firstLinkLista.innerHTML !== " ") { clearInterval(intervalId); refreshLink(1); } }, 50); }