python - Chase 사이트 로그인을 자동화하기 위해 Selenium을 사용할 수 없습니다



google-chrome webdriver (1)

귀하의 코드를 가져 와서 구조를 단순화하고 다음과 같이 최소한의 코드 행으로 테스트를 실행했습니다 :

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://secure07c.chase.com/web/auth/#/logon/logon/chaseOnline?")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.jpui.input.logon-xs-toggle.clientSideError"))).send_keys("jsmiao")
driver.find_element_by_css_selector("input.jpui.input.logon-xs-toggle#password-input-field").send_keys("hello")
driver.find_element_by_css_selector("button#signin-button>span.label").click()

마찬가지로, 당신의 관찰에 따라 나는 다음과 같은 오류가있는 동일한로드 블록에 부딪쳤다 :

Sign In 으로 텍스트가있는 요소에서 click() 이 발생하는 것 같습니다. 사용자 이름 / 비밀번호 조회가 시작되었지만 프로세스가 중단되었지만. 웹 페이지 DOM 트리 를 검사하는 동안 <script> 태그 중 일부는 키워드 dist를 갖는 JavaScript 를 참조한다는 것을 알 수 있습니다. 예로서:

  • <script src="https://static.chasecdn.com/web/library/blue-boot/dist/2.20.3/blue-boot/js/main-ver.js"></script>
  • <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="blue-vendor/main" src="https://static.chasecdn.com/web/library/blue-vendor/dist/2.11.1/blue-vendor/js/main.js"></script>
  • <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="blue/main" src="https://static.chasecdn.com/web/library/blue-core/dist/2.16.3/blue/js/main.js"></script>
  • <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="blue-app/main" src="https://static.chasecdn.com/web/library/blue-app/dist/2.15.1/blue-app/js/main.js"></script>

웹 사이트가 Bot Management Service Provider 인 Distil Networks에 의해 보호되고 ChromeDriver에 의한 내비게이션 이 탐지되어 차후에 차단 된다는 것은 분명 합니다.

고구마

기사 당으로 Distil.it ...에 관하여 진짜로 무언가가있다 ... :

Distil은 사이트 동작을 관찰하고 스크레이퍼 특유의 패턴을 식별하여 자동 콘텐츠 스크래핑 봇으로부터 사이트를 보호합니다. Distil은 한 사이트에서 악의적 인 봇을 식별하면 모든 고객에게 배포되는 블랙리스트의 행동 프로파일을 만듭니다. 봇 방화벽 같은 것, Distil은 패턴을 감지하고 반응합니다.

더욱이,

"One pattern with **Selenium** was automating the theft of Web content" Distil CEO Rami Essaid는 지난 주 인터뷰에서 말했다. "Even though they can create new bots, we figured out a way to identify Selenium the a tool they're using, so we're blocking Selenium no matter how many times they iterate on that bot. We're doing that now with Python and a lot of different technologies. Once we see a pattern emerge from one type of bot, then we work to reverse engineer the technology they use and identify it as malicious".

참고

자세한 내용은 다음에서 확인할 수 있습니다.

Selenium (Python)을 사용하여 Chase 웹 사이트에 로그인하려고하면 다음 오류 메시지가 나타납니다.

그러나, "인간"로그인을 사용하여 잘 작동합니다. Selenium이 요소를 발견하면 문제가 발생합니다.

내가 놓친 게 있니? 나는 stackoverflow에 대한 답변을 찾으려고 노력했지만 아무 소용이 없습니다.

최신 정보:

예상되는 결과는 스크립트를 통해 프로그래밍 방식으로 로그인 할 수 있다는 것입니다.

아래 코드 샘플은 다음과 같습니다.

import time
import os

from selenium import webdriver

CHASE_USER_ID = os.getenv('CHASE_USER_ID', None)
CHASE_PASSWORD = os.getenv('CHASE_PASSWORD', None)

assert CHASE_USER_ID is not None, 'Chase user id not set'
assert CHASE_PASSWORD is not None, ' Chase password not set'


def main():
    chrome_options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(r'./chromedriver', chrome_options=chrome_options)

    try:
        driver.get('https://secure07c.chase.com/web/auth/#/logon/logon/chaseOnline?')

        time.sleep(2)

        user_element = driver.find_element_by_id('userId-input-field')  # Finding an element here seems to make the login process fail 
        user_element.send_keys(CHASE_USER_ID)

        password_element = driver.find_element_by_id('password-input-field')
        password_element.send_keys(CHASE_PASSWORD)

        time.sleep(2)

        password_element.submit()

        time.sleep(10)
    finally:
        driver.quit()


if __name__ == '__main__':
    main()




selenium-chromedriver