유튜브의 긴 영상 또는 음악을 배경음악으로 틀어놓고 컴퓨터 등을 할 때가 있습니다.

 

아니면 편안하게 앉아서 영상을 감상하는데 광고가 중간에 뜨면 몸을 살짝 일으켜 광고 건너뛰기 버튼을 누르는 것이 너무나도 귀찮습니다.

 

뭐 프리미엄을 구독하면 해결되지만 왠지 싫습니다. 결국 무료의 대가로 귀찮게 광고 건너뛰기를 눌러야 하지만 그것도 너무 귀찮고 싫습니다. 이러한 이율배반적(?)인 상황속에서 파이썬으로 프로그램을 만들어 조금이나마 편해봅시다.

 

이 프로그램은 유튜브의 광고가 뜨고 수초 후에 광고 건너뛰기 버튼이 활성화 되자마자 눌러주는 프로그램입니다. 그렇기 때문에 최소한의, 수초간의 광고는 봐야합니다.😅

물론 하단광고 역시 뜨자마자 x버튼을 찾아 눌러주는 코드도 추가로 각자 작성하실 수 있습니다.

별거 없이 사람이 하는 행위를 그대로 똑같이 컴퓨터에게 시키는 겁니다.

 

본격적으로 시작하면 필요한 라이브러리는 다음과 같습니다.

1
2
3
from PIL import ImageGrab, Image, ImageOps
import time
import pyautogui
cs

PIL은 이미지 편집의 가장 기본적인 라이브러리입니다.

PIL라이브러리 안의 ImageGrab과 Image 모듈함수를 사용할텐데 ImageGrab은 화면 캡쳐 기능을 이용하기 위함입니다.

 

time 라이브러리는 프로그램을 while문으로 돌릴때 반복사이에 최소한의 delay를 주기 위함입니다.

 

pyautogui 라이브러리는 자동 마우스 컨트롤을 하기 위함입니다.

 

사실 본 블로그만 이해한다면 웬만한 매크로 프로그램은 모두 만들 수 있습니다. 원리만 이해한다면 말이죠.

중요한 것은 발상 자체입니다. 그걸 실제로 성취하는 기술은 알아서 다 따라오고 인터넷에 방법이 모두 있습니다.

그리고 조금은 귀찮을 수도 있는 지루한 삽질이 동반됩니다.

물론 이러한 노가다성 작업 자체도 즐거운 분이 있을 수도 있습니다. 저도 처음 코딩 배울땐 그랬으니깐요.😁

1
2
3
4
5
6
7
while(True):
    img = ImageGrab.grab(bbox=(1350,786,1369,805))
    rgb_img = img.convert('RGB')
    thresh = 128
    fn = lambda x : 255 if x > thresh else 0
    res = rgb_img.convert('L').point(fn, mode='1')
    res = res.convert('RGB')
cs

일단 무한으로 while문을 돌린다음,

img변수에 내 컴퓨터 화면의 광고 건너뛰기 버튼의 화살표 같은 부분의 영역을 지정하여 캡쳐합니다.

bbox값을 튜플로 (시작x좌표값, 시작y좌표값, 끝x좌표값, 끝y좌표값)을 주는 겁니다.

좌표값은 전체화면을 printscreen키로 캡쳐해서 포토샵같은 그림 편집 프로그램으로 확인하시면 됩니다.

위의 환한 부분 안의 화살표 부분입니다.

실제 저같은 경우 듀얼 모니터를 쓰고 한쪽에 유튜브나 음악을 틀어놓고 코딩을 자주 하는데 굳이 전체화면은 하지 않고 저렇게 쓰고 있습니다. 전체화면으로 해도 똑 같습니다.

 

그리고 이제 컴퓨터가 계속 저 부분을 스캔하며 삼각형 모양의 화살표가 나타나면 바로 눌러주게 하면 됩니다. 보시는 바와 같이 약간 뒤의 영상이 투영되어 색이 조금씩은 계속 바뀔 수 밖에 없어서 흰색이나 검은색이라고 당장은 특정할 수 없기 때문에 위의 코드와 같이 캡쳐한 화면을 블랙&화이트로 바꾸어주는 작업을 합니다.

 

제가 여러번의 시행착오로 만들어진 코드이기 때문에 이부분은 그냥 쓰셔도 됩니다.🤣 

굳이 간단히 설명하자면 저 화살표같은 넘기기 모양의 아이콘을 블랙&화이트로 바꾸어주는 작업입니다. 그리고 위에 코드는 없지만 res.show()를 통해서 미리보기 할 수도 있고 res.save("파일명.jpg")로 파일을 저장할 수도 있습니다.

 

결과물은 뒤의 영상이 어떻든지 간에 다음과 같은 이미지가 나오게 됩니다.

다시 프로그램의 개념을 설명드리면 컴퓨터가 계속해서 저 구역을 캡쳐하여 위의 넘기기 이미지가 나오면 클릭을 해서 광고를 넘기는 것입니다.

 

하지만 실제 저 아이콘 이미지를 그대로 찾을 필요 없이 특정할 수 있는 규칙만 찾으면 될 것 같습니다. 다른 이미지는 거의 발생할 확률이 극도로 낮은 규칙을.

확대한 사진은 검은색 부분의 일부 픽셀들이 검은색이 아니고 약간 회색빛이 섞여서 보이는데 실제 작은 이미지는 순수 검은색입니다.

다시 저 이미지를 크게 봅니다. 제가 확대하였지만 실제 이미지의 크기는 19픽셀 x 19픽셀의 작은 이미지입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    black_list = [[4,6],[4,15],[10,7],[10,14],[17,7],[17,14]]
    white_list = [[6,7],[6,14],[8,10],[12,10],[16,6],[16,14]]
 
    check = False
 
    for i in black_list:
        r,g,b = res.getpixel((i[0], i[1]))
        if [r,g,b] == [0,0,0]:
            pass
        else:
            check = True
    for n in white_list:
        r2,g2,b2 = res.getpixel((n[0], n[1]))
        if [r2,g2,b2] == [255,255,255]:
            pass
        else:
            check = True
 
    if check==False:
        pyautogui.click(1358,798)
      
    time.sleep(1)
cs

저같은 경우는 총 저 19x19=361개의 픽셀중에서 검은색 픽셀 중 6개 좌표, 흰색 픽셀 중 6개 좌표를 뽑아 그 12개 좌표 값의 픽셀 색상을 확인하여 검은색, 흰색 조건을 한번에 모두 만족하면 바로 클릭하게 됩니다.

실제 화면의 저 작은 영역 안에서 검은색 흰색이 극명하게 갈리는 경우는 저 화살표 아이콘 말고는 거의 없을 겁니다.

 

먼저 black_list에 검은색 영역의  x, y 좌표값으로 이루어진 리스트의 리스트를 만들고 white_list도 마찬가지로 만듧니다. 그리고 check = False로 설정하고 black_list와 white_list를 for문으로 반복하여 .getpixel((x값, y값))함수를 이용하여 얻어낸 rgb값이, black_list의 경우 하나라도 흰색- (255,255,255) 이 나오는 경우 또는 white_list의 경우 하나라도 검은색 (0,0,0)이 나오는 경우에 check값을 True로 바꾸고 마지막 pyautogui.click()함수를 실행하지 않고 다시 while문을 실행합니다. 즉 다시 영역을 캡쳐하고 동일한 작업을 한다는 말입니다. 이러한 부분들은 어렵지도 않고 좀 더 깔끔하게 만들수 있습니다만 저는 그냥 대충 짰습니다.(안좋은 습관입니다.)

 

마지막 time.sleep(1)의 경우는 없어도 되지만 왠지 습관처럼 넣게 됩니다. 반복문에 약간의 딜레이가 있어야 할 것 같은 기분입니다.

 

이제 위 방법을 응용하여 여러 구역을 캡쳐하여 화살표 아이콘을 확인할 수 있어 전체화면 창화면 등등 어떠한 화면에서도 동작하고 유튜브 영상 하단에 뜨는 제각기 다른 크기의 배너 광고 역시 뜨자마자 닫는 프로그램을 만들 수 있습니다.

이 역시 하기엔 많은 시행착오 노가다가 필요할 것 같습니다.

 

아무튼 막상 프로그램을 만들고 프로그램을 동작해 놓으면 은근 편합니다.😄

+ Recent posts