Tempermonkey 설치 후 아래 스크립트 추가 하기...
설명은 다른사람들이 알아서 할것 같아서 그냥 싸지르고 튀겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | // ==UserScript== // @name Base64 AutoDecoder // @namespace http://tampermonkey.net/ // @version 1.0 // @description 디코딩 가능한 base64 문자열을 링크로 변환합니다. // @author Zeliper // @match https://kone.gg/s/imya/* // @include https://kone.gg/ // @grant unsafeWindow // ==/UserScript== unsafeWindow.on = true ; ( function () { 'use strict' ; // Base64 문자열을 URL로 디코딩하는 함수 function decodeBase64ToURL(str) { try { const decoded = atob(str); // Base64 디코딩 // URL이 http 또는 https로 시작하는지 확인 if ( / ^https?:\ / \ //.test(decoded)) { return decoded; // 유효한 URL이면 반환 } } catch (e) { return null ; // 디코딩 오류가 나면 null 반환 } return null ; } // 텍스트에서 Base64 문자열을 찾아 링크로 변환하는 함수 function replaceBase64WithLink(node) { console .log( "Node : " , node); const base64Regex = / \b[a - zA - Z0 - 9 + / = ]{ 20 ,}\b / g; // Base64 문자열을 찾는 정규식 let text = node.textContent; // 텍스트 노드의 텍스트 내용 let match; const parent = node.parentNode; let lastIndex = 0 ; // 텍스트에서 Base64 문자열을 찾아서 처리 while ((match = base64Regex.exec(text)) ! = = null ) { const before = text.slice(lastIndex, match.index); const base64Str = match[ 0 ]; const decodedURL = decodeBase64ToURL(base64Str); if (decodedURL) { console .log(decodedURL); // 유효한 URL이 디코딩되었으면 링크로 변환 const a = document .createElement( 'a' ); a.href = decodedURL; a.textContent = decodedURL; a.target = '_blank' ; //node.textContent = ''; // <-- 나중에 문제 없으면 이거 넣어서 해도 될듯 node.appendChild( document .createElement( 'br' )); node.appendChild(a); } else { console .log( "Failed" ); } lastIndex = base64Regex.lastIndex; } } // .prose-container의 Shadow DOM을 탐색하여 텍스트 변환 function walkShadowRoot(shadowRoot) { const textNodes = shadowRoot.querySelectorAll( ':not(div)' ); // 모든 텍스트 노드를 확인 textNodes.forEach(node = > { replaceBase64WithLink(node); }); } // .prose-container가 로드된 후 Shadow DOM 탐색 function processShadowRoot() { const container = document .body.querySelector( '.prose-container' ); if (container & & container.shadowRoot) { walkShadowRoot(container.shadowRoot); // Shadow DOM 처리 } } // 페이지가 완전히 로드된 후 실행 function onLoad() { processShadowRoot(); } // MutationObserver를 사용하여 .prose-container의 Shadow DOM 로드를 감지 const observer = new MutationObserver(() = > { const container = document .body.querySelector( '.prose-container' ); if (container & & container.shadowRoot) { processShadowRoot(); } }); // .prose-container가 추가될 때까지 대기 observer.observe( document .body, { childList: true , subtree: true }); // 페이지 로딩이 완료되면 바로 실행 if ( document .readyState = = = 'complete' ) { onLoad(); } })(); |
삭제된 댓글입니다.
삭제된 댓글입니다.