selenium으로 유튜브 구독목록 마이그레이션 자동화하기

Binsu·2021년 7월 17일
0

Python Automation

목록 보기
2/2
post-thumbnail

만들게 된 계기

최근에 구글 아이디를 새로 만들었더니 기존에 사용하던 구글 계정의 유튜브 구독 목록은 옮길 방법이 없다는 문제가 생겼습니다. 유튜브는 원래 구독관리 페이지에서 구독목록을 xml파일로 내보내는 기능이 있었습니다. 하지만, 어느 순간 조용히 그 기능이 사라졌습니다.
'이 자동화 도구를 누가 먼저 만들지 않았을까?'하며 구글링을 해봤을 때, 예전에 이 xml 파일로 자동화해주는 도구는 있었지만 지금도 동작하는 도구는 없었습니다.
결국, 백 개가 넘는 구독 목록을 보며 하나하나 구독 버튼을 누르는 것은 무리라는 생각에 직접 자동화 도구를 만들어야겠다는 결심을 했습니다.

과정

  1. 먼저, 기존 구글 계정으로 로그인한 후 https://www.youtube.com/feed/channels 에서 html 파일을 저장(수동)
  2. 저장한 html 파일에서 구독한 유튜브 채널의 주소만 파싱한다.
  3. 새 구글계정으로 로그인 후 반복문으로 텍스트 파일 내 유튜브 채널 주소로 접속하여 구독버튼을 자동 클릭한다.

마이그레이션 자동화 과정은 위와 같이 크게 세 가지 절차로 이루어져 있습니다.
크롬 디버그 모드로 구글 로그인 블록을 우회하는 방법은 이전에 올린 포스트인 selenium 활용 간 구글 로그인 블록 우회하기를 참고하시면 됩니다.
전체 완성코드는 아래와 같습니다.

### main.py ###

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_autoinstaller
import subprocess
import shutil
import pyautogui
from bs4 import BeautifulSoup
import re

try:
    shutil.rmtree(r"C:\chrometemp")  # remove Cookie, Cache files
except FileNotFoundError:
    pass

try:
    subprocess.Popen(r'C:\Program Files\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 '
                     r'--user-data-dir="C:\chrometemp"')
    # Open the debugger chrome
except FileNotFoundError:
    subprocess.Popen(r'C:\Users\binsu\AppData\Local\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 '
                     r'--user-data-dir="C:\chrometemp"')

option = Options()
option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
try:
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=option)
except:
    chromedriver_autoinstaller.install(True)
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=option)
driver.implicitly_wait(10)

driver.get(
    url='https://accounts.google.com/signin/v2/identifier?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Dko%26next%3D%252Fc%252FDingoMusic%26continue_action%3DQUFFLUhqazZ0cmVpeDRReWNfcVE2RWpFcHQ0SlBvR3hGd3xBQ3Jtc0tsZFF6dDUzb1lLXzlhZFBnTkx4YlJYSkRScHVTUmhYOEQ3eng1UWNYSHQ5NXNmZWVpemhTbmx0SlJwR0NFd0ZzbW9LRzJ6Zk81ZTRrV0taalZGbm9lZ05kZVFuTDk0TVlpaXVXa3N2VmdrWFp5UFlpYlRCTjVxRjVRNWFsLUY1NFNTbVpTU0pWOUl1enRWQTNZMDI3eDdfX3JPTld4aXJDZmxpWl8zb3dIZ01STEtYbC1VdFZrOXEyN0EzQzVoSE82MUwwcG9xX1VLblpjUUd1clU5aHBjUUg2WDRB&hl=ko&ec=66429&flowName=GlifWebSignIn&flowEntry=ServiceLogin')
# Google login page

pyautogui.write('### ID ###')  # Fill in your ID or E-mail
pyautogui.press('tab', presses=3)  # Press the Tab key 3 times
pyautogui.press('enter')
time.sleep(3)  # wait a process
pyautogui.write('### PW ###')   # fill in your PW
pyautogui.hotkey('ctrl', 'c')
pyautogui.press('enter')
time.sleep(3)  # wait a process
pyautogui.hotkey('ctrl', 'v')
pyautogui.press('enter')

html = open("channels.html", "r", encoding='utf-8')
line = html.readlines()  # readlines는 모든 라인을 읽음.
sublist = re.compile(r'(https:\/\/www.youtube.com\/channel\/[a-zA-Z0-9-_]{24})').findall(str(line))
set_sublist = set(sublist)  # 리스트를 집합으로 변환해서 중복제거
list_sublist = list(set(set_sublist))  # 중복 제거된 집합을 리스트로 변환
for i in list_sublist:
    driver.get(url=i)
    try:
        driver.find_element_by_css_selector(
            '#subscribe-button > ytd-subscribe-button-renderer > tp-yt-paper-button').click()
    except:
        continue

결론

위 파이썬 코드를 실행하면 브라우저에서 구독을 자동으로 해주는 모습을 볼 수 있습니다. 구독 목록에 비례하여 시간이 소요되겠지만, 유튜브 채널 한 개 구독하는 데 1초도 걸리지 않습니다.
다 만들고 나니 유튜브 API를 활용하는 방법도 있다는 것을 알게 되었습니다. 향후에 유튜브 API를 활용하여 구독목록을 관리하는 방법도 한번 다뤄보겠습니다.

0개의 댓글