클로드는 신이야!
1
딱 코네에서 base64 디코딩만하고 url만 하이퍼링크화 시켜주는 게 필요해서
클로드 한발 뽑아주니 원큐에 되더라
tampermonkey나 viloetmonkey에 추가해주면 됨
// ==UserScript==
// @name Base64 Auto Decoder
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 영역의 base64 인코딩 텍스트만 자동 디코딩(최대 5회 중첩)하여 해당 부분만 대체하고, 디코딩된 텍스트의 URL은 하이퍼링크 처리
// @author you
// @match *://*/*
// @run-at document-idle
// @grant none
// ==/UserScript==
(function () {
'use strict';
/* ============================== 설정 ============================== */
// CSS 셀렉터로 지정 → id면 '#post-article', class면 '.post-comment' 처럼 쓰면 됨
// 댓글이 여러 개로 반복되는 구조여도 querySelectorAll 로 모두 처리됨
const TARGET_SELECTORS = ['#post-article', '#post-comment', '.article-body', '.title'];
const MAX_DECODE = 5; // 중첩 디코딩 최대 반복 횟수
const MIN_B64_LEN = 8; // base64 후보로 볼 최소 길이 (짧을수록 오탐↑)
// 텍스트 안에서 base64 "후보"를 찾아내는 정규식
const B64_CANDIDATE = new RegExp('[A-Za-z0-9+/]{' + MIN_B64_LEN + ',}={0,2}', 'g');
// URL 추출용 정규식 (http/https/www)
const URL_REGEX = /((?:https?:\/\/|www\.)[^\s<>"'()]+)/gi;
/* ============================== 유틸 ============================== */
// 문자열이 base64 형태인지 1차 판별 (문자셋 + 길이). 패딩 유무 모두 허용.
// base64 길이는 %4가 1일 수 없음(0/2/3만 유효) → 패딩 없는 글도 통과시킴
function looksLikeBase64(str) {
return (
str.length >= MIN_B64_LEN &&
str.length % 4 !== 1 &&
/^[A-Za-z0-9+/]+={0,2}$/.test(str)
);
}
// 디코딩 결과가 "사람이 읽을 수 있는 텍스트"인지 판별 (제어문자 비율로 오탐 제거)
function isProbablyText(str) {
if (!str) return false;
let bad = 0;
for (const ch of str) {
const c = ch.codePointAt(0);
if (c < 0x09 || (c > 0x0d && c < 0x20) || c === 0x7f) bad++;
}
return bad / str.length < 0.1;
}
// base64 -> UTF-8 문자열 1회 디코딩 (실패 시 null)
function decodeOnce(str) {
if (!looksLikeBase64(str)) return null;
try {
// 패딩이 없으면 4의 배수가 되도록 '=' 보정
let s = str;
const rem = s.length % 4;
if (rem === 2) s += '==';
else if (rem === 3) s += '=';
const binary = atob(s);
const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));
// fatal:true -> 유효하지 않은 UTF-8이면 예외 발생 → 오탐 차단
return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
} catch (e) {
return null;
}
}
// 중첩 디코딩 (최대 MAX_DECODE회). 더 이상 base64가 아니거나 깨진 데이터면 중단
function fullyDecode(str) {
let current = str;
let best = null;
for (let i = 0; i < MAX_DECODE; i++) {
const decoded = decodeOnce(current);
if (decoded === null) break; // 더 이상 base64 아님 → 종료
if (!isProbablyText(decoded)) break; // 깨진 데이터 → 직전 결과 유지
best = decoded;
current = decoded; // 한 번 더 디코딩 시도
}
return best;
}
/* ============================== DOM 조립 ============================== */
// 디코딩된 텍스트를 받아 URL을 <a>로 분리한 노드 배열 반환
function buildDecodedNodes(text) {
const nodes = [];
let last = 0;
let m;
URL_REGEX.lastIndex = 0;
while ((m = URL_REGEX.exec(text)) !== null) {
let url = m[0];
// URL 끝에 붙은 문장부호는 링크에서 제외
const trailMatch = url.match(/[.,;:!?)\]}'"]+$/);
let trail = '';
if (trailMatch) {
trail = trailMatch[0];
url = url.slice(0, url.length - trail.length);
}
const start = m.index;
if (start > last) nodes.push(document.createTextNode(text.slice(last, start)));
const a = document.createElement('a');
a.href = url.toLowerCase().startsWith('http') ? url : 'https://' + url;
a.textContent = url;
a.target = '_blank';
a.rel = 'noopener noreferrer';
nodes.push(a);
if (trail) nodes.push(document.createTextNode(trail));
last = start + m[0].length;
}
if (last < text.length) nodes.push(document.createTextNode(text.slice(last)));
return nodes;
}
// 텍스트 노드 하나를 처리: base64 부분만 디코딩해서 그 자리에만 대체
function processTextNode(node) {
const text = node.nodeValue;
if (!text) return;
let match;
let last = 0;
let changed = false;
const frag = document.createDocumentFragment();
B64_CANDIDATE.lastIndex = 0;
while ((match = B64_CANDIDATE.exec(text)) !== null) {
const candidate = match[0];
const decoded = fullyDecode(candidate);
if (decoded === null) continue; // 실제 base64가 아니면 건드리지 않음
changed = true;
// base64 앞쪽의 일반 텍스트는 원본 그대로 유지
if (match.index > last) {
frag.appendChild(document.createTextNode(text.slice(last, match.index)));
}
// 디코딩된 부분만 (URL 링크 포함) 삽입
for (const n of buildDecodedNodes(decoded)) frag.appendChild(n);
last = match.index + candidate.length;
}
if (!changed) return; // 디코딩 대상 없음 → 노드 유지
if (last < text.length) frag.appendChild(document.createTextNode(text.slice(last)));
node.parentNode.replaceChild(frag, node);
}
// 컨테이너 내부의 모든 텍스트 노드 처리
function processContainer(container) {
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, {
acceptNode(node) {
const p = node.parentNode;
if (!p) return NodeFilter.FILTER_REJECT;
const tag = p.nodeName;
// 스크립트/스타일/이미 링크/입력영역은 건너뜀
if (tag === 'SCRIPT' || tag === 'STYLE' || tag === 'A' || tag === 'TEXTAREA') {
return NodeFilter.FILTER_REJECT;
}
if (!node.nodeValue || !node.nodeValue.trim()) return NodeFilter.FILTER_REJECT;
return NodeFilter.FILTER_ACCEPT;
},
});
const targets = [];
let n;
while ((n = walker.nextNode())) targets.push(n);
targets.forEach(processTextNode);
}
/* ====================== 실행 / 동적 콘텐츠 감시 ====================== */
let observer = null;
let scheduled = false;
function runOnce() {
TARGET_SELECTORS.forEach((sel) => {
document.querySelectorAll(sel).forEach((el) => processContainer(el));
});
}
function startObserve() {
if (!observer) observer = new MutationObserver(() => scheduleRun());
const root = document.body || document.documentElement;
if (root) observer.observe(root, { childList: true, subtree: true, characterData: true });
}
function scheduleRun() {
if (scheduled) return;
scheduled = true;
// 디코딩으로 인한 DOM 변경이 옵저버를 다시 트리거하지 않도록
// 일시 중지(disconnect) → 처리 → 재연결(reconnect)
requestAnimationFrame(() => {
scheduled = false;
if (observer) observer.disconnect();
runOnce();
startObserve();
});
}
runOnce();
startObserve();
})();22
댓글 5개
아우로라
06.03
ㅁㅊ 너무 편하고
apache
06.03
딱 원하는 기능하고 id나 클래스만 지정해주니 알잘딱해줌
fisherman
06.03
ㄳㄳ
근데 가끔 복호화된 결과물이 두번 연속 나오는 경우가 있긴한데 왜 그런거임?
apache
06.03
난 그런거 못봤는데
apache
06.03
두번 되는 게시물 링크좀
공지
번역 탭 제목 양식 신설 및 미검수 공지 선호도 조사(2차)
루미네순애
06.21
289399
14
번역 탭 제목 양식 신설 및 미검수 공지 선호도 조사(2차)
공지
루미네순애
06.21 289399 14
공지
❗알림❗ 지금 차단 당하면 해명해도 차단해제가 안되니 주의바람....
1uF
06.01
1443514
54
❗알림❗ 지금 차단 당하면 해명해도 차단해제가 안되니 주의바람....
공지
1uF
06.01 1443514 54
공지
‼️뉴비 필독 가이드‼️
1uF
05.02
3404129
150
‼️뉴비 필독 가이드‼️
공지
1uF
05.02 3404129 150
공지
🔔[필독] 채널 규정 & 신문고 (2026 04 05~)
SK
04.05
2976488
-26
🔔[필독] 채널 규정 & 신문고 (2026 04 05~)
공지
SK
04.05 2976488 -26
공지
🔔[필독] 탭 별 이용 가이드 (20260206~)
Etrick
02.05
3178242
-37
🔔[필독] 탭 별 이용 가이드 (20260206~)
공지
Etrick
02.05 3178242 -37
소리
용량주의) 대마인 시리즈 드라마CD 모음 49GB/169개
키도
06.03
48260
47
용량주의) 대마인 시리즈 드라마CD 모음 49GB/169개
소리
키도
06.03 48260 47
소리
(복구)[한글자막]다키마쿠라 여친 -Pretty Holic- ~꼬~옥 밀착하며 곁잠 섹스해 주는 느슨하고 귀여운 후배~
키리안
06.03
49096
46
(복구)[한글자막]다키마쿠라 여친 -Pretty Holic- ~꼬~옥 밀착하며 곁잠 섹스해 주는 느슨하고 귀여운 후배~
소리
키리안
06.03 49096 46
야짤
씨이이이이발 이거거든ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
stealthmania
06.03
41272
19
씨이이이이발 이거거든ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
야짤
stealthmania
06.03 41272 19
영상
[복구] 레이블(니케) 영상 복구
Bremerton
06.03
125667
63
[복구] 레이블(니케) 영상 복구
영상
Bremerton
06.03 125667 63
동인
Naminori Kamome-눈 내리고 사랑이 쌓이네
k8625
06.03
119236
53
Naminori Kamome-눈 내리고 사랑이 쌓이네
동인
k8625
06.03 119236 53
번역
[한글패치] 니토-오염격리구역에 떨어진 토끼- (패치파일만)
jaaxmaster
06.03
413170
213
[한글패치] 니토-오염격리구역에 떨어진 토끼- (패치파일만)
번역
jaaxmaster
06.03 413170 213
동인
Henrybird-변기 성녀 블랑카
k8625
06.03
138879
83
Henrybird-변기 성녀 블랑카
동인
k8625
06.03 138879 83
동인
ai번역 간락02 유카편
1Q2W3E4R
06.03
125774
50
ai번역 간락02 유카편
동인
1Q2W3E4R
06.03 125774 50
동인
Hotate-chan 섹스마려워 안달난 아내
k8625
06.03
154041
180
Hotate-chan 섹스마려워 안달난 아내
동인
k8625
06.03 154041 180
영상
장리 (명조)
Bremerton
06.03
115641
97
장리 (명조)
영상
Bremerton
06.03 115641 97
소리
[요청복구][RJ01576867]다키마쿠라 여친 -Pretty Holic- ~꼬~옥 밀착하며 곁잠 섹스해 주는 느슨하고 귀여운 후배~
vhskorea
06.03
41243
39
[요청복구][RJ01576867]다키마쿠라 여친 -Pretty Holic- ~꼬~옥 밀착하며 곁잠 섹스해 주는 느슨하고 귀여운 후배~
소리
vhskorea
06.03 41243 39
소리
【한국어 자막판】 집애감금(執愛監禁)
puella
06.03
50074
72
【한국어 자막판】 집애감금(執愛監禁)
소리
puella
06.03 50074 72
후기 및 공략
이세계 NTR여관 후기 (털게가 가야했던길?)
koreno1
06.03
49306
23
이세계 NTR여관 후기 (털게가 가야했던길?)
후기 및 공략
koreno1
06.03 49306 23
동인
karoti 메스가키 리나짱 1 2 3
posan
06.03
145404
116
karoti 메스가키 리나짱 1 2 3
동인
posan
06.03 145404 116
번역
(AI번역,미검수)(후타나리, 펨보이, 후타나리 NTR) Futa Familly 0.246
Onko
06.03
399212
119
(AI번역,미검수)(후타나리, 펨보이, 후타나리 NTR) Futa Familly 0.246
번역
Onko
06.03 399212 119
미번
RJ01561117 구마령 아가씨 사야 2탄 [돚거해옴]
gloneofist
06.03
84598
54
RJ01561117 구마령 아가씨 사야 2탄 [돚거해옴]
미번
gloneofist
06.03 84598 54
미번
RJ01586101 에투알 마리아주 v1.0.1
ECiLA
06.03
84114
38
RJ01586101 에투알 마리아주 v1.0.1
미번
ECiLA
06.03 84114 38
복구
[요청복구] 디스토피아의 약탈자
arquivity
06.03
201660
55
[요청복구] 디스토피아의 약탈자
복구
arquivity
06.03 201660 55
정보
호신술도장 서클 신작 6월 5일 발매 확정
아이스뱅
06.03
50200
43
호신술도장 서클 신작 6월 5일 발매 확정
정보
아이스뱅
06.03 50200 43
복구
[요청복구] 시코르스키 서클 모음 シコルスキー大佐
arquivity
06.03
218486
115
[요청복구] 시코르스키 서클 모음 シコルスキー大佐
복구
arquivity
06.03 218486 115
번역
한글, 렌파이) Confined and Horny 0.27
화앨
06.03
363641
132
한글, 렌파이) Confined and Horny 0.27
번역
화앨
06.03 363641 132
유틸
코네 base64 오토 디코더
apache
06.03
30328
22
코네 base64 오토 디코더
유틸
apache
06.03 30328 22
미번
[수정] 음락의 무녀 ~음탕회권~, 음락의 무녀 ~치옥담~, 음락의 무녀 (원본)
Ed
06.03
78091
40
[수정] 음락의 무녀 ~음탕회권~, 음락의 무녀 ~치옥담~, 음락의 무녀 (원본)
미번
Ed
06.03 78091 40
소리
[구매보급]【한국어 자막판】 길 잃은 숲에서 폭유 엘프 자매에게 구조되었지만... 결국 잡아먹혔습니다♪
이름뭐하지
06.03
58811
64
[구매보급]【한국어 자막판】 길 잃은 숲에서 폭유 엘프 자매에게 구조되었지만... 결국 잡아먹혔습니다♪
소리
이름뭐하지
06.03 58811 64
번역
[AI번역][VJ007656] 음락의 무녀 (패치파일만) - 260604본편추가
호빵할배
06.03
349447
78
[AI번역][VJ007656] 음락의 무녀 (패치파일만) - 260604본편추가
번역
호빵할배
06.03 349447 78
유틸
[버전업] Base64 자동 링크 변환 크롬 확장 프로그램
qqwe1234
06.03
22481
18
[버전업] Base64 자동 링크 변환 크롬 확장 프로그램
유틸
qqwe1234
06.03 22481 18
번역
[기번][AI번역][미검수][RJ01292204]레즈세계의 네토라레 사정
kukuruyake
06.03
365850
181
[기번][AI번역][미검수][RJ01292204]레즈세계의 네토라레 사정
번역
kukuruyake
06.03 365850 181
동인
Milimon-아비게일
k8625
06.03
179806
191
Milimon-아비게일
동인
k8625
06.03 179806 191
동인
Milimon-바니걸 니키
k8625
06.03
144242
97
Milimon-바니걸 니키
동인
k8625
06.03 144242 97
동인
Nijiiro Guin-최강능력자가 시간정지로 꼴사납게 패배
k8625
06.03
174121
187
Nijiiro Guin-최강능력자가 시간정지로 꼴사납게 패배
동인
k8625
06.03 174121 187
s/somisoft
• 150,619명 구독중여러가지 다루는 서브
2025-05-17 14:58:43 생성
Rules
- 1. 게시물 규정 양식
업로드 시 링크 암호화 & 필수 정보를 기입할 것
- 2. 질문
국룰, 암호화 링크 등 기본사항 질문 금지, 탭 미준수시 차단 및 삭제
- 3. 요청
요청 기준 및 양식 미준수 & 댓글로만 자료 복구 요청 시 차단
- 4. 미성년자 / 근첩 / 페미 / 다중계정
조금이라도 의심되면 선 차단, 후 해명
- 5. 좆목 / 네임드화
닉언, 네임드화 등 친목질 금지
- 6. 분탕 및 어그로 / 혐짤 / 낚시 / 뇌절
해당 카테고리의 차단 기간 및 가중처벌은 처리자 재량으로 판단
- 7. 홍보 / 판촉 / 거래
허용되지 않은 모든 형태의 홍보, 거래, 교환, 조건부 공유 시 차단
- 8. 쌀먹 / 바이러스
조건부 공유 & 수익성 링크 & 고의적인 바이러스 유포 시 갱신차단
- 9. 자료 분류 / AI
미검수 시 표기 필수, 생성형 AI를 사용한 자료의 제목에 AI 미기입 시 차단
- 10. 실사 / 토들러
업로드시 갱신 차단
- 11. 기타 세부 규정은 서브 공지사항 참고