크피탕메이트

갤질좀 편하게 하자

As of 2022-04-21. See the latest version.

// ==UserScript==
// @name         크피탕메이트
// @namespace    http://tampermonkey.net/
// @version      2.4
// @description  갤질좀 편하게 하자
// @author       수린
// @license      MIT
// @match        https://gall.dcinside.com/*lists*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=dcinside.com
// @require      http://code.jquery.com/jquery-latest.js
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// ==/UserScript==

function pushKillList() {
    let currentList = GM_getValue("차단목록");
    let word = prompt(`현재 차단목록: ${currentList}`, "차단할 단어/고닉 or id or ip");
    if (word) {
        //alert(currentList.indexOf(word));
        if (currentList.indexOf(word) > -1) {
            currentList.splice(currentList.indexOf(word), 1);
            GM_setValue("차단목록", currentList);
            alert(word + " 차단목록 제거 완료");
        } else {
            alert(word + " 차단목록 추가 완료");
            currentList.push(word);
            GM_setValue("차단목록", currentList);
        }
    }
}

function kill(list) {
    let killList = GM_getValue("차단목록");
    for (let elem of list.querySelectorAll('.ub-content.us-post')) {
        if (killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-uid")) > -1
            || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-ip")) > -1
            || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-nick")) > -1) {
            elem.remove();
        }
        let title = elem.querySelector('.gall_tit.ub-word').innerText;
        for (let i of killList) {
            let REG = RegExp(i);
            if (REG.exec(title)) {
                elem.remove();
            }
        }
    }
}

function killComment(commentList) {
    let killList = GM_getValue("차단목록");
    //댓글돌이
    for (let elem of commentList.querySelectorAll('.ub-content.dory')) {
        elem.remove();
    }
    for (let elem of commentList.querySelectorAll('.ub-content')) {
        if (elem.querySelector('.gall_writer.ub-writer')) {
            if (killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-uid")) > -1
                || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-ip")) > -1
                || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-nick")) > -1) {
                elem.remove();
            }
            let text;
            if (elem.querySelector('.clear.cmt_txtbox.btn_reply_write_all')) {
                text = elem.querySelector('.clear.cmt_txtbox.btn_reply_write_all').innerText;
            } else {
                text = elem.querySelector('.clear.cmt_txtbox').innerText;
            }
            for (let i of killList) {
                let REG = RegExp(i);
                if (REG.exec(text)) {
                    elem.remove();
                }
            }
        }

    }
}

async function MakeGallList() {
    let loadInterval = null;
    let popupInterval = null;
    let now = new Date();
    let date = now.getFullYear().toString() + (now.getMonth() + 1).toString() + now.getDate().toString();
    let broadId = location.href.split("id=")[1].split("&")[0];
    $("#popup_preview").hover(
        function() {
            clearTimeout(popupInterval);
        },
        function() {
            clearTimeout(popupInterval);
            popupInterval = setTimeout(function() {
                $("#popup_preview").stop(true,true).fadeOut(200, function() {
                    $("#popup_preview .content").empty();
                });
            }, 20);
        }
    ).on("click", function(eve) {
        //if($(eve.target).hasClass("content")) {
        $("#popup_preview").stop(true,true).fadeOut(200, function() {
            $("#popup_preview .content").empty();
        });
    });

    //리스트에 하우스 호버중일때
    $(".gall_list tr.ub-content").hover(
        function() {
            //clearTimeout(popupInterval);
        },
        function() {
            clearTimeout(loadInterval);
            clearTimeout(popupInterval);
            popupInterval = setTimeout(function() {
                $("#popup_preview").stop(true,true).fadeOut(20, function() {
                    $("#popup_preview .content").empty();
                });
            }, 200);
        }
    );
    function popupShow(target, eve, content) {
        var scrollX = $(window).scrollLeft();
        var scrollY = $(window).scrollTop();
        $("#popup_preview")
            .stop(true,true)
        //.hide()
            .css({ left:eve.pageX + 30, top:(eve.clientY - 20) + scrollY})
            .find(".content")
            .html(content)
            .outerHeight()
        ;
        $("#popup_preview").fadeIn(200, function() {
            var popupHeight = $(this).find(".content").scrollTop(0).outerHeight();
            var popupTop = (eve.clientY - 20) - popupHeight;
            if(popupTop < -10) {
                $(this).css("top","+=" + (Math.abs(popupTop) + 10));
            }
        });
    }

    await fetch(window.location.href)
        .then((response) => response.text())
        .then((result) => {
        result = result.substr(result.indexOf('"gall_list"') + 13, result.length);
        result = result.substr(0, result.indexOf("table") - 2);
        let list = document.createElement('table');
        list.innerHTML = result;
        kill(list);
        document.querySelector('.gall_list').innerHTML = list.innerHTML;
        $(".gall_list .gall_tit > a:not(.reply_numbox)").hover(
            function(eve) {
                var target = $(this);
                var event = eve;
                var link = $(this).attr("href");
                var id = link.split("id=")[1].split("&")[0];
                var no = link.split("no=")[1].split("&")[0];
                var contentId = id + "_" + no + "_" + date;
                clearTimeout(loadInterval);
                loadInterval = setTimeout(function() {
                    var loadContent = localStorage.getItem(contentId);
                    if(loadContent != undefined && loadContent != null && loadContent !== "") {
                        popupShow(target, event, loadContent);
                    }
                    else {
                        GM_xmlhttpRequest({
                            method: "GET",
                            url: link,
                            overrideMimeType:"text/html; charset=utf-8",
                            headers:{
                                "Content-Type": "text/html; charset=utf-8",
                                "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
                                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
                            },
                            onload: function(response) {
                                if(response && response.responseText != undefined) {
                                    if(response.responseText.indexOf("derror/deleted") > -1) {
                                        var content = "※삭제된 글입니다.";
                                        localStorage.setItem(contentId, content);
                                        popupShow(target, event, content);
                                    }
                                    else {
                                        var viewContent = $(response.responseText).find(".view_content_wrap .writing_view_box");
                                        if(viewContent.length > 0) {
                                            viewContent.find("script,style").remove();
                                            content = viewContent.html();
                                            localStorage.setItem(contentId, content);
                                            popupShow(target, event, content);
                                        }
                                    }
                                }
                            }
                        });
                    }
                }, 200);
            },
            function() {
                clearTimeout(loadInterval);
            }
        );
    });
}

function addSetting() {
    GM_addStyle(`.settingBox{
    position: absolute;
    top: 33%;
    left: 33%;
    width:33%;
    height: 33%;
    display: none;
    border-radius:5px;
    background-color: #262626;
    z-index: 20000;
    }`);
    GM_addStyle(`.box{
    width:33%;
    height: 33%;
    border-radius:5px;
    float:left;
    margin: 5px;
    background-color: #fff;
    }`);
    GM_addStyle(`.button{
    width:82px;
    height:32px;
    border:1px solid #ccc;
    border-radius:2px;
    font-size:14px;
    font-weight:bold;color:#333;margin-left:2px;
    background:#fff;
    padding-bottom:2px
    }`);
    let settingButton = document.createElement('button')
    settingButton.className = "on";
    settingButton.id = "settingButton";
    settingButton.innerHTML = "설정";

    document.querySelector(".array_tab.left_box").append(settingButton);
    let settingBox = document.createElement('div')
    settingBox.className = 'settingBox';
    document.querySelector("body").append(settingBox);
    document.querySelector("#settingButton").addEventListener("click", (event)=> {
        event.stopPropagation()
        document.querySelector('.settingBox').style.display = 'block';
    });
    let a = document.createElement('div');
    a.className = 'box';
    document.querySelector('.settingBox').append(a);
    document.querySelector('.box').innerHTML = `현재 차단목록: \n${GM_getValue("차단목록")}`;

    let b = document.createElement('div');
    b.innerHTML = `<input type="text"></input>`;
    document.querySelector('.box').append(b);
    let c = document.createElement('button')
    c.className = "button";
    c.innerHTML = "추가";
    document.querySelector(".box").append(c);

    let closeButton = document.createElement('button')
    closeButton.className = "button";
    closeButton.innerHTML = "닫기";
    closeButton.addEventListener("click", ()=>{document.querySelector('.settingBox').style.display = 'none';});
    document.querySelector(".settingBox").append(closeButton);
}

function addPreview() {
    GM_addStyle(`
            #popup_preview{position:absolute;z-index:10000; top:0px;}#popup_preview
            .content{position:absolute;left:0;bottom:0;padding:15px;width:600px;
            max-height:1000px;
            min-height:100px;
            line-height:20px;
            font-size:12px;
            opacity:1;
            color:#ffffff;
            border:1px solid #ddd;
            border-radius:5px;
            background:#262626;
            overflow:auto}
            #popup_preview img{max-width:30%}
            #popup_preview iframe,#popup_preview embed{width:100%;height:auto;min-height:240px}
            </style>`);

    $("body").append('<div id="popup_preview"><div class="content"></div></div>');
}

$(function () {
    'use strict';
    addPreview();

    //--------------------------------------------------------------------------------------------------------------
    //지저분한거 정리
    $("#top").width='100%';
    document.querySelector("#top").style.minWidth='600px';
    document.querySelectorAll(".wrap_inner")[0].style.width='100%';
    document.querySelector("#container").style.marginLeft='0 auto';
    document.querySelector("#container").style.marginRight='0 auto';
    document.querySelector(".right_content").querySelector('div').hidden = true;
    document.querySelector('.dchead').hidden = true;
    document.querySelector('.gnb_bar').hidden = true;
    if (document.querySelector('.dcwiki')) document.querySelector('.dcwiki').hidden = true;
    document.querySelector('.fr.gall_issuebox').hidden = true;
    for (let elem of document.querySelectorAll(".content_box")) {
        elem.hidden = true;
    }
    let dcfoot = document.querySelector('.dcfoot.type1');
    for (let elem of dcfoot.querySelectorAll('div')) {
        elem.hidden = true;
    }
    let search = document.querySelector('#search_wrap');
    search.className = "";
    document.querySelector('.left_content').prepend(search);
    document.querySelector('.btn_visit').style.position = 'relative';
    //--------------------------------------------------------------------------------------------------------------
    //새 버튼들
    let login = document.querySelector('.area_links.clear').querySelectorAll('li');
    let login_btn = login[login.length - 1];
    let asdf = document.createElement('button')
    asdf.className = "on";
    asdf.innerHTML = document.querySelector('.user_info').innerText;
    document.querySelector(".array_tab.left_box").append(asdf);
    let killButton = document.createElement('button')
    killButton.className = "on";
    killButton.id = "btn_kill";
    killButton.innerHTML = "차단목록";
    document.querySelector(".array_tab.left_box").append(killButton);
    document.querySelector('#btn_kill').addEventListener("click", pushKillList);

    let logoutButton = document.createElement('button')
    logoutButton.className = "";
    logoutButton.innerHTML = login_btn.innerHTML;
    document.querySelector(".array_tab.left_box").append(logoutButton);
    //--------------------------------------------------------------------------------------------------------------
    //글 읽기 iframe
    document.querySelector('body').addEventListener("click", (event) => {
        if (document.querySelector('#view')) {
            document.querySelector('#view').remove();
        }

    });
    document.querySelector('.gall_listwrap.list').onclick = function(event) {
        if (event.target.nodeName != 'A') return;
        if (document.querySelector('#view')) {
            document.querySelector('#view').remove();
        }
        let href = event.target.getAttribute('href');

        $("#popup_preview").stop(true,true).fadeOut(100, function() {
            $("#popup_preview .content").empty();
        });

        document.querySelector('body').insertAdjacentHTML('afterbegin', `
        <div id="view"; style="position:absolute; z-index: 20; opacity:1; left:${event.clientX - 100}px; top:5%; border-radius:5px; background-color:white; opacity:1; border:1px solid;box-shadow:1px 1px 5px rgba(0,0,0,0.3); max-width:1000px; width:80%; height:90%; float:left">
            <iframe id="iframe" src="${href}" width='100%' height='100%'></iframe>
        </div>`);
        //--------------------------------------------------------------------------------------------------------------
        //지저분한거 정리
        let interval = setInterval(() => {
            if (document.querySelector('#iframe')) {
                let iframeDocument = document.querySelector('#iframe').contentDocument;
                iframeDocument.querySelector(".right_content").querySelector('div').hidden = true;
                iframeDocument.querySelector('.dchead').hidden = true;
                iframeDocument.querySelector('.gnb_bar').hidden = true;
                if (iframeDocument.querySelector('.dcwiki')) {
                    iframeDocument.querySelector('.dcwiki').hidden = true;
                }
                iframeDocument.querySelector('.fr.gall_issuebox').hidden = true;
                for (let elem of iframeDocument.querySelectorAll(".content_box")) {
                    elem.hidden = true;
                }
                let dcfoot = iframeDocument.querySelector('.dcfoot.type1');
                for (let elem of dcfoot.querySelectorAll('div')) {
                    elem.hidden = true;
                }
                iframeDocument.querySelector("#top").style.width='0%';
                iframeDocument.querySelector("#top").style.minWidth='0px';
                iframeDocument.querySelectorAll(".wrap_inner")[0].style.width='50%';
                iframeDocument.querySelectorAll(".wrap_inner")[0].marginLeft='0 auto';
                iframeDocument.querySelectorAll("article")[1].style.width='0%';
                iframeDocument.querySelectorAll("article")[1].style.minWidth='1000px';
                iframeDocument.querySelector('.con_banner.writing_banbox').style.minHeight='0px';
                iframeDocument.querySelector("#container").style.marginLeft='0 auto';
                iframeDocument.querySelector("#container").style.marginRight='0 auto';
                iframeDocument.querySelector('.gall_listwrap.list').hidden = true;
                iframeDocument.querySelector('.listwrap.clear').hidden = true;
                //iframeDocument.querySelector('.view_bottom_btnbox.clear').hidden = true;
                iframeDocument.querySelector('.page_head.clear').hidden = true;
                iframeDocument.querySelector('.stickyunit').style.width='0%';
                iframeDocument.querySelector('.issue_wrap').hidden = true;
                if (iframeDocument.querySelector('.comment_box')) killComment(iframeDocument.querySelector('.comment_box'));
                clearInterval(interval)
            }
        }, 100);
        event.stopPropagation()
        return false;
    };
    //--------------------------------------------------------------------------------------------------------------
    //리스트 새로고침
    setInterval(() => {
        MakeGallList();
    }, 1000);
    //--------------------------------------------------------------------------------------------------------------
    //리스트 글 수
    if (document.querySelector('.select_area').querySelector('a').innerText != "30개") {
        //alert("글 리스트 30개로 바꿈");
        //listDisp(30);
    }
    //addSetting();
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。