작성일 — 댓글 남기기

[정보] 유튜브 건너뛰기 크롬에서 실행하기(막힘, ublock 사용하세요 무료 확장 프로그램)

최근 유튜브 광고가 너무 많이 띄워져서 AI를 통해서 확인한 상황입니다.

작동 아주 잘 됩니다~ 아래 내용 참고해서 사용하시면 되겠습니다.

이미지 참고하세요.

단계별 적용 방법 및 전체 소스 코드

1단계: Tampermonkey 확장 프로그램 설치

  1. 구글 크롬 웹 스토어로 이동합니다.
  2. Tampermonkey를 검색하여 크롬에 추가합니다.

2단계: 새 스크립트 만들기 및 소스 코드 입력

  1. 브라우저 우측 상단의 Tampermonkey 확장 프로그램 아이콘을 클릭합니다.
  2. 대시보드로 이동한 뒤, 상단 탭에서 새 스크립트 만들기(+ 아이콘)를 선택합니다.
  3. 기존에 적혀 있는 기본 코드를 모두 지우고, 아래의 전체 소스 코드를 그대로 복사해서 붙여넣습니다.
  4. 키보드에서 Ctrl + S를 눌러 저장합니다.

전체 소스 코드

// ==UserScript==
// @name         YouTube Ad Skip Controller Deep
// @namespace    http://tampermonkey.net/
// @version      1.6
// @description  Shadow DOM 내부까지 탐색하여 유튜브 광고 건너뛰기 버튼을 클릭합니다.
// @author       Gemini
// @match        *://*.youtube.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let isRunning = true;

    // 플로팅 제어 아이콘 생성
    const toggleBtn = document.createElement('div');
    toggleBtn.id = 'yt-skip-toggle-btn';
    toggleBtn.innerText = '[START] SKIP';
    toggleBtn.style.position = 'fixed';
    toggleBtn.style.bottom = '20px';
    toggleBtn.style.right = '20px';
    toggleBtn.style.zIndex = '999999';
    toggleBtn.style.padding = '8px 12px';
    toggleBtn.style.backgroundColor = '#2e7d32';
    toggleBtn.style.color = '#ffffff';
    toggleBtn.style.borderRadius = '20px';
    toggleBtn.style.cursor = 'pointer';
    toggleBtn.style.fontSize = '12px';
    toggleBtn.style.fontWeight = 'bold';
    toggleBtn.style.boxShadow = '0 2px 5px rgba(0,0,0,0.3)';
    toggleBtn.style.userSelect = 'none';

    toggleBtn.onclick = function() {
        isRunning = !isRunning;
        if (isRunning) {
            toggleBtn.style.backgroundColor = '#2e7d32';
            toggleBtn.innerText = '[START] SKIP';
        } else {
            toggleBtn.style.backgroundColor = '#c62828';
            toggleBtn.innerText = '[STOP] SKIP';
        }
    };

    document.body.appendChild(toggleBtn);

    // 마우스 이벤트 시뮬레이션 함수
    function simulateClick(element) {
        if (!element) return;
        const eventOptions = { bubbles: true, cancelable: true, view: window };
        element.dispatchEvent(new PointerEvent('pointerdown', eventOptions));
        element.dispatchEvent(new MouseEvent('mousedown', eventOptions));
        element.dispatchEvent(new PointerEvent('pointerup', eventOptions));
        element.dispatchEvent(new MouseEvent('mouseup', eventOptions));
        element.dispatchEvent(new MouseEvent('click', eventOptions));
        if (typeof element.click === 'function') {
            element.click();
        }
    }

    // Shadow DOM 내부까지 재귀적으로 셀렉터를 탐색하는 함수
    function findElementDeep(selectors, root = document) {
        for (let sel of selectors) {
            let found = root.querySelector(sel);
            if (found) return found;
        }

        const allElements = root.querySelectorAll('*');
        for (let el of allElements) {
            if (el.shadowRoot) {
                let found = findElementDeep(selectors, el.shadowRoot);
                if (found) return found;
            }
        }
        return null;
    }

    // Shadow DOM 내부까지 텍스트("건너뛰기", "Skip")를 탐색하는 함수
    function findElementByTextDeep(root = document) {
        const targets = root.querySelectorAll('button, div[role="button"], span, a');
        for (let target of targets) {
            const txt = target.innerText || target.textContent;
            if (txt && (txt.includes('건너뛰기') || txt.includes('Skip'))) {
                return target.closest('button') || target.closest('div[role="button"]') || target;
            }
        }

        const allElements = root.querySelectorAll('*');
        for (let el of allElements) {
            if (el.shadowRoot) {
                let found = findElementByTextDeep(el.shadowRoot);
                if (found) return found;
            }
        }
        return null;
    }

    // 광고 건너뛰기 탐지 및 실행 루프
    setInterval(() => {
        if (!isRunning) return;

        const selectors = [
            '.ytp-skip-ad-button',
            '.ytp-skip-ad-button__text',
            '.ytp-ad-skip-button',
            '.ytp-ad-skip-button-modern',
            '.videoAdUiSkipButton',
            'button[id^="skip-button:"]'
        ];

        let skipButton = findElementDeep(selectors);
        if (!skipButton) {
            skipButton = findElementByTextDeep();
        }

        if (skipButton) {
            simulateClick(skipButton);
        }
    }, 500);
})();

3단계: 유튜브 접속 및 동작 확인

  • 유튜브 웹사이트(https://www.youtube.com)에 접속합니다.
  • 화면 우측 하단에 초록색 배경의 [START] SKIP 아이콘이 떠 있는지 확인합니다.
  • 아이콘을 클릭하면 빨간색 [STOP] SKIP으로 바뀌며 기능이 멈추고, 다시 누르면 활성화됩니다. 광고가 나왔을 때 건너뛰기 버튼이 자동으로 눌리는지 확인합니다.

보완 설정 (선택 사항)

  • 크롬 주소창에 chrome://extensions를 입력하여 확장 프로그램 관리 화면으로 이동합니다.
  • Tampermonkey의 세부 정보를 클릭합니다.
  • 사이트 액세스 항목을 ‘모든 사이트’ 대신 ‘특정 사이트에서’로 변경하고 유튜브 주소만 허용해 두시면 보안상 더욱 안전하게 사용하실 수 있습니다.

4. 사용자 스크립트 허용 (필수)

  • 현황: 이미지 중간의 사용자 스크립트 허용 스위치가 Off 상태로 되어 있습니다.
  • 이유: Tampermonkey는 작성하신 유저스크립트 코드를 브라우저에서 실행해주는 프로그램입니다. 스위치가 꺼져 있으면 스크립트 코드가 동작하지 않습니다.
  • 조치: 사용자 스크립트 허용 오른쪽 토글 스위치를 On으로 변경합니다.

실행 방법

  • Tampermonkey 아이콘을 클릭하여 대시보드로 진입합니다.
  • 우측 상단의 스위치를 찾아 On으로 전환합니다.
  • 변경 사항이 반영되었는지 해당 아이콘의 색상 및 상태를 확인합니다.

5. 사이트 액세스 설정 확인 및 수정

  • 현황: 사이트 액세스 드롭다운이 클릭 시로 설정되어 있습니다.
  • 이유: 클릭 시로 되어 있으면 유튜브에 접속할 때마다 확장 프로그램을 매번 수동으로 클릭해 주어야 실행됩니다.
  • 조치:
    • 드롭다운 메뉴를 클릭합니다.
    • “특정 사이트에서” 또는 “특정 사이트에 대해서만”으로 변경합니다.
    • 목록에 이미 포함된 항목에서 https://www.youtube.com/를 유지 또는 추가합니다.
    • 필요 시 새 페이지 추가를 눌러 https://www.youtube.com/를 함께 등록합니다.

요약 체크리스트

  • 사용자 스크립트 허용 켜기(토글 색상이 파란색으로 변경)
  • 사이트 액세스를 클릭 시에서 특정 사이트에서로 변경

두 작업을 마친 후 유튜브 페이지를 새로고침(F5)하면 오른쪽 하단에 [START] SKIP 아이콘이 정상적으로 표시됩니다.


확인된 내용 및 활용 팁

  • 정상 동작: 이제 유튜브에서 영상을 시청하다가 광고가 나오면 아이콘이 켜져 있는 상태일 때(START) 광고 건너뛰기 버튼이 자동으로 클릭되어 본 영상이 재생됩니다.
  • 일시 정지 필요 시: 기능을 끄고 싶다면 우측 하단의 [START] SKIP 아이콘을 클릭해 빨간색 [STOP] SKIP으로 바뀌며 수동 제어 상태가 됩니다. 필요 시 다시 아이콘을 클릭하면 활성화됩니다.

제대로 동작되면 아래와 같이 표시

진행은 했으나, 자동화가 안되네, ublock 사용하시고. 현재 새롭게 매크로 자동 처리 개발중..

답글 남기기