【簡単】YouTubeの広告を自動的にスキップする【Python】

2024年03月28日 更新日:2024年03月28日


大学生

YouTubeでBGM流してるときに広告来るとうざいよね

ドラ猫

Pythonで自動でスキップできるようにするにゃ


方針


まずはYouTubeの広告の仕様をチェック。




このスキップボタンを自動でクリックできるようにすると良いですね。


パッと思いつくのは、①スキップボタンのhtmlを検出②画面キャプチャをしてスキップボタンを検出

この2通りですかね~


①が簡単そうなのでこの方針で行こうと思います。

1秒ごとにhtmlを監視して、スキップボタンが見つかったらクリックするようにします。


ブラウザの自動操作を行うので、seleniumを使いたいと思います。

バージョンは4.18.1です。


seleniumの基本的な使い方はもっと詳しい記事がたくさんあるので、それを確認してください。

特にYouTube動画とChatGPTを使うととても捗ると思います。


YouTubeの表示


まず、chromedriverを使ってYouTubeを表示します。

昔使ってたchromedriverがエラーとなってしまったのですが、最新バージョンではchromedriverを手動でインストールする必要がないのですね。


option = Options()
option.add_argument('--incognito') #シークレットモード
option.add_experimental_option('detach', True) #ブラウザを開いたまま終了する
driver = webdriver.Chrome(options=option)
driver.implicitly_wait(10)
driver.get(
    'https://www.youtube.com/'
)

(import文は最後に全てまとめて記述します。)


driverの設定(optionsの引数)でシークレットモードで表示して、ブラウザを開いたまま終了するようにしています。

implicity_waitは、画面が表示されるまで10秒間までは待機するという設定です。


driver.get('url')でサイトにアクセスします。

YouTubeのトップページにアクセスしましたが、この状態のまま次のステップのhtmlの監視をします。

どうせこの時点でスキップボタンはないので、手動で見たい動画のページに移動します。


HTMLの監視


1秒ごとに監視したいので、while文とtime.sleep(1)を使って無限ループをしたいと思います。

ループを抜ける方法は後で考えます。


ここで、ブラウザのデベロッパーツールでスキップボタンのhtmlを確認します。

#html
<button class="ytp-ad-skip-button-modern ytp-button">
  <div class="ytp-ad-text ytp-ad-skip-button-text-centered ytp-ad-skip-button-text" id="ad-text:7" style="">スキップ</div>
  <span class="ytp-ad-skip-button-icon-modern">
    <svg height="100%" viewBox="-6 -6 36 36" width="100%">
      <path d="M5,18l10-6L5,6V18L5,18z M19,6h-2v12h2V6z" fill="#fff"></path>
    </svg>
  </span>
</button>


ボタンタグが2つのクラスを持っているので、seleniumのfind_elementメソッドの引数にBy.CSS_SELECTORを指定します。

これを使えば、クラスを2つ指定することができます。


毎秒スキップボタンを監視しますが、ボタンが見つからないときはNoSuchElementExceptionエラーとなります。

例外処理で、このエラーとなったときには何も処理しないで1秒間待機したのちに、while文のはじめに戻るようにします。


while True:
        
    try:
        button = driver.find_element(By.CSS_SELECTOR, '.ytp-ad-skip-button-modern.ytp-button')
        button.click()
        print('広告をスキップしました')
            
    except NoSuchElementException:
        pass

    time.sleep(1)


プログラムの終了


広告は動画内も流れてくることがあるので、一度スキップしただけで終了しても意味がないと思います。

なので、ユーザーの任意のタイミングでプログラムを終了できるようにします。


プログラム実行中にCtrl+Cをすると、KeyboardInterruptエラーとなるらしいです。

なので、例外処理でKeyboardInterruptが出たらプログラムが終了するようにします。

先ほどのhtmlを監視する部分は丸ごとtry文の中に組み込みます。


try:
    while True:
        #current_html = driver.page_source
        
        try:
            button = driver.find_element(By.CSS_SELECTOR, '.ytp-ad-skip-button-modern.ytp-button')
            button.click()
            print('広告をスキップしました')
            
        except NoSuchElementException:
            pass
        
        time.sleep(1)
        
except KeyboardInterrupt:
    # ユーザーがCtrl+Cを入力して終了する場合に処理を停止
    pass


ワンクリックで実行する


まずは、プログラムの全文はこちらです。


skip_adds.py

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
import time

print('Ctrl+Cで終了します')

option = Options()
option.add_argument('--incognito') #シークレットモード
option.add_experimental_option('detach', True) #ブラウザを開いたまま終了する
driver = webdriver.Chrome(options=option)
driver.implicitly_wait(10)
driver.get(
    'https://www.youtube.com/'
)

try:
    while True:
        #current_html = driver.page_source
        
        try:
            button = driver.find_element(By.CSS_SELECTOR, '.ytp-ad-skip-button-modern.ytp-button')
            button.click()
            print('広告をスキップしました')
            
        except NoSuchElementException:
            pass
        
        time.sleep(1)
        
except KeyboardInterrupt:
    # ユーザーがCtrl+Cを入力して終了する場合に処理を停止
    pass

print('終了します')


batファイルを使うとワンクリックで起動できるそうです。

batファイルについてはあまりよく知らないので、コードだけ載せておきます。


skip_adds.bat

@echo off
cd skip_addsのパス
python skip_adds.py
pause


これをデスクトップに置いておけば、クリックするだけで自動でYouTubeが開きます。

好きな動画を開けば、動画前の広告だろうと動画中の広告だろうとスキップボタンが表示された瞬間にクリックされます。


1つ注意してほしいのは、YouTubeのhtmlが変更されたときには使えなくなるので、アップデートが必要になります。

その時は新しく記事を書きたいと思います!


SNSで感想をシェアしてね↓