Greasy Fork

Namu Hot Now

이게 왜 실검?

目前为 2024-02-04 提交的版本。查看 最新版本

// ==UserScript==
// @name         Namu Hot Now
// @name:ko      나무위키 실검 알려주는 스크립트
// @namespace    https://arca.live/b/namuhotnow
// @version      0.3
// @description  이게 왜 실검?
// @author       KEMOMIMI
// @match        https://namu.wiki/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=namu.wiki
// @grant        GM_xmlhttpRequest
// ==/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 aside 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 aside 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();
}

setInterval(function() {
    var currentSpansContent = getSpansContent();
    if (spansContentChanged(previousSpansContent, currentSpansContent)) {
        removeLinkElements();
        refreshLink();
        previousSpansContent = currentSpansContent;
    }
}, 1000);