네이버가 작년 9월(?)부터 사용자 입력을 제외한 소프트웨어적 입력을 통한 로그인을 막기 위해 Captcha 시스템을 도입했습니다. 이로 인해 Selenium을 이용하여 자동 로그인을 시도했던 사용자들이 Captcha에 탐지 당해 로그인을 하지 못하고 있습니다.
Selenium Element send_keys Method
Selenium을 이용하고 있는 대부분의 이용자들은 element.send_keys() 메서드를 이용하여 로그인을 시도했습니다. 그러나 Selenium의 driver를 이용하여 아이디 및 비밀번호를 element.send_keys()메서드를 이용하여 로그인 시도 시 비정상적인 접근 방식으로 네이버 Captcha가 탐지하게 됐습니다.
Selenium Element send_keys Method Part 2
비밀번호를 제외한 아이디만 element.send_keys()메서드를 통해 입력한 경우에도 네이버 Captcha가 탐지합니다.
결론적으로 말씀을 드리자면 element를 통한 send_keys()는 네이버 Captcha에 반드시 탐지가 됩니다. 그렇다면 Selenium element send_keys() 메서드를 제외한 Win32api를 이용한 로그인 시도는 어떻게 될지 궁금해 시도해 봤습니다.
Win32api
Win32api를 통해 입력한 경우 Captcha가 탐지하지 못하고 로그인이 정상적으로 진행 됐습니다. 그러나 Win32api를 이용할 때는 driver에 –headless 옵션을 추가 할 경우 focus를 못잡아 아이디 및 비밀번호가 전달이 안 돼 로그인 시도가 거의 불가능합니다. 즉 사용자가 focus를 네이버 로그인 창이 아닌 다른 곳에 focus하는 경우 로그인에 문제가 생깁니다.
Win32api를 통해 성공할 수는 있으나 focus가 안 된 상태에서는 불가능한 제약이 생겼습니다. 하지만 driver가 –headless 상태에서 focus도 안 주고 element.send_keys()메서드를 통하여 Captcha를 피해 로그인을 성공시킬 수 있는 방법이 하나 있습니다.
Clipboard with send_keys Method
그것은 바로 Key 조합을 보내는 것입니다. Ctrl+V 키 조합을 element에 보낼 경우 네이버 Captcha가 비정상적인 로그인 시도를 탐지하지 못하고 정상적인 로그인에 성공합니다.
Clipboard 기능을 이용하여 아이디 및 비밀번호를 복사한 후에 로그인창에 붙여넣기를 하면 쉽게 네이버 Captcha를 뚫을 수 있습니다. element.send_keys()로 보내는 것이기 때문에 driver가 –headless인 상태에서도 사용이 가능합니다.
1 2 3 4 5 6 7 8 |
def clipboard_input(self, user_xpath, user_input): pyperclip.copy(user_input) # input을 클립보드로 복사 self.driver.find_element_by_xpath(user_xpath).click() # element focus 설정 ActionChains(self.driver).key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform() # Ctrl+V 전달 time.sleep(1) |
네이버 관련 시스템을 자동화하여 이용하기 위해 네이버 로그인을 시도했는데 Captcha라는 시스템이 작년 말부터 추가가 돼 소프트웨어적으로 로그인 시도가 어려웠으나 다양한 방법을 시도한 끝에 Clipboard를 이용한 로그인 방법을 찾게 됐습니다. 뿐만 아니라 Win32api도 가능하며 현재 Win32api로 –headless인 상태에서는 로그인 가능한 방법은 개발하지 못했으나 Unactive Window를 이용하면 driver가 –headless인 상태에서도 Captcha를 무력화할 수 있을 것 같습니다.
모든 소스는 https://github.com/lumyjuwon/NaverCaptcha에서 확인하실 수 있습니다.
- 영상의 순서가 잘못돼 수정했습니다.
막혔네요
아직 잘 됩니다 ㅎㅎ..
감사합니다. 아래 4줄이 핵심이네요.
잘됩니다.
어떻게 아신건가요??
경험적으로 여러가지 시도하다보니 알게되신건가요?
예전에 재미로 Win32api를 좀 사용해서 취미삼아 매크로들을 만들었는데 거기에 기반해서 경험적으로 알게 된 것 같습니다.
안녕하세요. 저도 파이썬으로 셀레니움을 이용하는데
작성자님은 모든코드가 한 파일에 있는게 아니라 분리되어 있네요?
저는 함수분리는 하지만, 한 파일안 main에 모든걸 넣어놨거든요.
이와 관련된 개념을 공부하고싶은데, 뭐라고 검색하면 되나요?
객체지향이라고 검색하시면 나옵니다.
객체지향은 그냥 코드를 짜는 패러다임이라고 보시면 됩니다.
네이버 보안정책이 바뀌었나보네요 블로그 글쓰기나 제목쪽 find_element이 다 암호화 되어있네요 혹시 해결방법아시나요?
그냥 html 구조 파악해서 만들면 쉽게 뚫을 거 같은데요 .. ?
이분이 말씀하시는 html 구조라는건 id나 class로 찾지 말고 태그명을 통해 태그 위치 기반으로 찾으라는 말씀이십니다.
태그명 자체를 암호화 할 수는 없으니까요.
제가 알아보니 암호화가 아니라 개발 과정에서 필요한 기능을 구현하다 그랬던 것 같습니다.
실행방법 알수 있을까요?
감사합니다 잘 되네요 ㅠㅠ
아 이거 파이썬이었구나.. 포커스 한 상태로는 로그인 됐는데 c#에서 healess 넣고서도 되는거 찾아야겠네요
천잰데요… 초보라 고민 많이 하고 있었는데. 최고입니다.
지금은 막힌듯 ㅠㅠ
5초전에 했는데 저는 되네요
현재 잘 되시나요?
현재 잘 되시나요?되시는분 계신가요?
잘 되고 있네요~
삭제된 댓글입니다.
관건은 headless에서도 사용하는 방법인거같네요..
headless모드에서도 클립보드에 저장한 내용을 붙여넣기 할 수 있나요???