kone
소미소프트
소미소프트

코네 base64 오토 디코더

06/03/2026, 10:36:34
유틸
37273 views · 22 likes

클로드는 신이야!

1

딱 코네에서 base64 디코딩만하고 url만 하이퍼링크화 시켜주는 게 필요해서

클로드 한발 뽑아주니 원큐에 되더라

tampermonkey나 viloetmonkey에 추가해주면 됨

// ==UserScript==
// @name         Base64 Auto Decoder
// @namespace    http://tampermonkey.net/
// @version      1.1
// @author       you
// @match        *://*/*
// @run-at       document-idle
// @noframes
// @grant        none
// ==/UserScript==

(function () {
  'use strict';

  if (window.__b64DecoderLoaded) return;
  window.__b64DecoderLoaded = true;

  const DECODED_MARK = 'data-b64decoded';

  /* ============================== 설정 ============================== */
  const TARGET_SELECTORS = ['#post-article', '#post-comment', '.article-body', '.title'];
  const MAX_DECODE = 5;
  const MIN_B64_LEN = 7;

  const B64_CANDIDATE = new RegExp('[A-Za-z0-9+/]{' + MIN_B64_LEN + ',}={0,2}', 'g');
  const URL_REGEX = /((?:https?:\/\/|www\.)[^\s<>"'()]+)/gi;

  /* ============================== 유틸 ============================== */
  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;
  }

  function decodeOnce(str) {
    if (!looksLikeBase64(str)) return null;
    try {
      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));
      return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
    } catch (e) {
      return null;
    }
  }

  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;
      if (!isProbablyText(decoded)) break;
      best = decoded;
      current = decoded;
    }
    return best;
  }

  /* ============================== DOM 조립 ============================== */
  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];
      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;
  }

  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;

      changed = true;
      if (match.index > last) {
        frag.appendChild(document.createTextNode(text.slice(last, match.index)));
      }
      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)));

    const wrapper = document.createElement('span');
    wrapper.setAttribute(DECODED_MARK, '1');
    wrapper.appendChild(frag);
    node.parentNode.replaceChild(wrapper, 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.parentElement && node.parentElement.closest('[' + DECODED_MARK + ']')) {
          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;
    requestAnimationFrame(() => {
      scheduled = false;
      if (observer) observer.disconnect();
      runOnce();
      startObserve();
    });
  }

  runOnce();
  startObserve();
})();

22
7 comments
ㅁㅊ 너무 편하고
06/03
딱 원하는 기능하고 id나 클래스만 지정해주니 알잘딱해줌
ㄳㄳ 근데 가끔 복호화된 결과물이 두번 연속 나오는 경우가 있긴한데 왜 그런거임?
06/03
난 그런거 못봤는데
06/03
두번 되는 게시물 링크좀
Samples
일반
코네
09/13 100 0
어흐 난 왜 이런게 너무좋지
일반
쁠뿡
08/31 423 0
최근에 본 작품인데 질문점 내용있음
질문
korean6638
08/31 421 0
자료 업로드 메가로 해도 괜찮나요?
질문
ddalddal2
08/31 564 0
요르티나 다햇는데 먼가 몬가임 ./....................
후기 및 공략
a123123a1231237
08/31 902 0
【하렘(?)/근친】나를 벌칙게임 소재로 삼지마! (삼아!) EX
동인
HoneyWorks
08/31 3324 11
요즘 뭔가 야겜들 퀄리티가 전반적으로 낮아지지 않았나요?
일반
ganzzi
08/31 1409 -3
그 옛날게임인데
질문
사과맛사탕
08/31 961 1
[그냥복구] 우리들의 육변기 선생님 -the GAME- 전 날라리엄마 교사의 변태 생활
복구
ttime490
08/31 3212 8
혹시 텍스트쪽에서 검열없는 ai 있을까요?
질문
ixa194
08/31 1561 1
오치카노 이 미친새기
작업현황
하츠네미쿠
08/31 1838 6
긴긴파크 꼴리긴 뒤지게 꼴리는데
후기 및 공략
ksikio123
08/30 1925 3
여자 작게만든다음 다리랑 뷰지 강제로 벌리는것도 좋네
야짤
superkiller123
08/30 3540 2
로리 거유 소녀에게 최면을 걸어 섹스하는 애니메이션 영상 게임
영상
ロリ巨乳
08/30 7047 16
직번) [James] 비몽사몽
동인
안드레
08/30 8327 7
샀다 보이즈..ㄷ
일반
쩝냡
08/30 5299 7
(직번)[몬무스]당신을 집착하는 니쿠사씨
동인
멕무
08/30 14203 17
스팀에서만 나오는 무인도 서바이벌 게임인데...
일반
haeun0511
08/30 5195 0
이런 것도 ntr 인가요 게임 추천 좀요
질문
양이오
08/30 4517 0
루나와 색욕의 고도 개지리넹
일반
İstiklâl Marşı
08/30 4066 0
이누히메 2.0 내년에 나오려나
일반
coke1566
08/30 4411 0
프린세스 시너지 초반에 비해 뒷심이 아쉽네
후기 및 공략
33709
08/30 4601 4
여친최면떳냐?
일반
sepisid
08/30 4816 3
시간 용자 엄청 재밌네 이거
일반
sinbalnom
08/30 4148 2
복구요청)RJ01368793-느슨한 서바이벌 ~알몸섬의 소녀들~
요청
ㅇㅇ
08/30 4408 0
[AI 번역][Kairaku Amnesia (Kinuo)] 가난한 아내가 집세를 보지로 갚을 때까지 ~28세 I컵 청초 아내, 악취나는 털복숭이 추남 집주인에게 NTR~
동인
crazyerdog
08/30 19567 29
아 게임 생각이 안나
질문
ghdrlfdl
08/30 3703 0
8월 마지막 날 그 긴거 예상중...
일반
ロリ巨乳
08/30 4785 2
망가 하나 찾아주실 수 있나요?
질문
churros
08/30 4125 0
[요청복구] RJ01295900 교배도시에 어서오세요 v1.03
복구
agnis
08/30 13954 21