// ==UserScript== // @name Namu Hot Now // @name:ko 나무위키 실검 알려주는 스크립트 // @namespace https://arca.live/b/namuhotnow // @version 0.3.1 // @description 이게 왜 실검? // @author KEMOMIMI // @match https://namu.wiki/* // @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 refreshLink() { 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('(')) { var removeParenthesis = text.replace(/\s*\([^)]*\)$/, ''); pairs.push({ text: removeParenthesis.trim(), link: link }); } }); 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); } }); } }); } }); } function spansContentChanged(arr1, arr2) { var startIndex = arr1.indexOf("실시간 검색어"); var endIndex = arr1.indexOf("최근 변경") + 1; var subArr1 = arr1.slice(startIndex, endIndex); var subArr2 = arr2.slice(startIndex, endIndex); return subArr1.join() !== subArr2.join(); } removeLinkElements(); refreshLink(); setInterval(function() { var currentSpansContent = getSpansContent(); if (spansContentChanged(previousSpansContent, currentSpansContent)) { removeLinkElements(); refreshLink(); previousSpansContent = currentSpansContent; } }, 1000);