selenium 활용 간 구글 로그인 블록 우회하기

Binsu·2021년 4월 27일
2

Python Automation

목록 보기
1/2
post-thumbnail

왜 우회를 하려고 하나?

저는 Selenium을 활용해서 유튜브 채널 구독 마이그레이션 자동화 프로그램을 만드는 과정에서 난관에 봉착했습니다. 아래 코드와 같이 xpath를 통해 구글 로그인을 시도하면 브라우저에서 아래와 같은 화면만 뜨고 다음 프로세스로 진행이 불가합니다.

# https://github.com/kunalJa/Youtube-Subscriptions-Learn-Selenium-/blob/master/SubScrape.py

# Fill in username
driver.find_element_by_xpath("""//*[@id="identifierId"]""").send_keys(user)
driver.find_element_by_xpath("""//*[@id="identifierId"]""").send_keys(Keys.RETURN)
sleep(2)
# Fill in password
driver.find_element_by_xpath("""//*[@id="password"]/div[1]/div/div[1]/input""").send_keys(password)
driver.find_element_by_xpath("""//*[@id="password"]/div[1]/div/div[1]/input""").send_keys(Keys.RETURN)
sleep(2)

OAuth2.0 구글 로그인 우회 방법은?

다른 방법이 있는지 찾아보니 Stack Overflow 사이트를 경유해서 구글 로그인을 하고 다시 구글로 이동하는 우회방법이 있다고 하여 시도해봤더니, 이 역시도 구글팀에서 막았는지 로그인이 안됩니다.
좀 더 검색해보니 구글은 봇이 로그인하는지 여부를 탐지하는 것을 알게 되었습니다. 결론적으로, 구글 로그인 페이지에서 사람이 직접 로그인하는 것처럼 속여야 합니다.

결론

자동화가 탐지되는 웹드라이버 크롬을 실행하는 것이 아닌, PC에 설치된 크롬의 디버깅 모드로 Selenium을 사용하면 됩니다. 디버깅 크롬 실행 방법과 관련하여 제가 참고한 블로그는 다음과 같습니다.

하지만 과제가 하나 남아 있습니다. 디버거 모드로 크롬을 열어서 element.click() 혹은 element.send_keys 등의 Selenium 메소드를 사용하면 여전히 봇으로 탐지됩니다. 이는 pyautogui 라이브러리를 사용하면 해결됩니다. 즉, 사람이 키보드로 ID와 PW를 입력하는 것을 흉내내는 것입니다. 아래는 제가 작성한 Selenium 활용 간 구글 로그인 블록 우회 python 코드입니다.

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

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?hl=ko&passive=true&continue=https%3A%2F%2Fwww.google.com%2F'
        '%3Fgws_rd%3Dssl&ec=GAZAmgQ&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.press('enter')

위 방법 외에도 창의적인 우회 방법이 있다면 공유해주시기 바랍니다.

2개의 댓글

comment-user-thumbnail
2023년 4월 29일

정말 감사합니다~ 수고해주신 덕분으로 문제를 잘 해결했습니다!

답글 달기