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(); } })(); | cs |
