Selenium에서 CAPTCHA 솔버 사용하기

작성: solvethree읽는 데 3분

solvethree로 reCAPTCHA Enterprise 토큰을 얻은 다음, Selenium으로 solution.token을 애플리케이션의 폼에 넣고 제출하세요. SDK는 작업을 해결할 뿐, 브라우저 폼을 대신 채워주지는 않습니다.

예제는 토큰 필드와 제출 버튼이 있는 HTTPS 폼을 사용합니다. 테스트하는 애플리케이션에 맞게 선택자를 수정하세요.

이 페이지의 내용

폼과 Python 환경 준비

  1. 1.

    의존성 설치

    Chrome과 함께 Python 3.10 이상을 사용하세요. pip로 selenium 패키지를 설치한 다음, 다운로드 가능한 wheel 파일로 공식 solvethree Python SDK를 설치하세요. Python 연동의 직접 다운로드 설치 안내를 따르세요. 패키지 레지스트리에 있다고 가정하여 다른 설치 방식으로 대체하지 마세요.

  2. 2.

    대상 프로필 설정

    solvethree 콘솔에서 소유한 폼의 호스트 이름을 설정하고 해당 프로필이 워크스페이스에서 활성화되어 있는지 확인하세요. 작업에 호스트 이름을 보내도 프로필이 생성되지는 않습니다. 샘플은 login 액션을 요청하므로 애플리케이션에서 다른 액션을 사용한다면 변경하세요.

  3. 3.

    환경 변수 설정

    TARGET_URL에는 HTTPS 폼의 전체 URL을, SOLVETHREE_PROXY에는 HTTP 또는 HTTPS 프록시 URL을, SOLVETHREE_API_KEY에는 워크스페이스 API 키를 설정하세요. 키는 페이지 JavaScript가 아닌 Python 프로세스에 보관하세요.

먼저 해결한 후 반환된 식별 정보로 Chrome 시작

이 Chrome 샘플에는 사용자 이름이나 비밀번호 없이 IP 허용 목록으로 접근을 허용하는 프록시가 필요합니다. 자격 증명이 포함된 프록시 URL은 거부하며, 인증 프록시 설정은 구현되어 있지 않습니다.

작업은 TARGET_URL에서 추출한 호스트 이름, login 액션 및 프록시 하나를 사용합니다. solve가 준비된 결과를 반환하면 Chrome은 동일한 프록시와 반환된 userAgent로 시작됩니다. 샘플은 이동 전에 반환된 secChUa 헤더도 설정합니다.

Selenium + Python · IP 허용 목록 기반 프록시를 사용하는 Chrome
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree

target = os.environ["TARGET_URL"]  # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
    raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
        "headers": {"sec-ch-ua": solution["secChUa"]}
    })
    driver.get(target)
    # Adapt the field and button to your application's form contract.
    field = WebDriverWait(driver, 20).until(
        lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
    )
    driver.execute_script("""
        arguments[0].value = arguments[1];
        arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
    """, field, solution["token"])
    driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
    # Check your application's success response here.
finally:
    driver.quit()

Solvethree.solve는 작업을 한 번 생성하고, 준비될 때까지 폴링하거나 예외를 발생시킵니다. 그 후에야 브라우저가 폼으로 이동합니다. 스크립트는 토큰 필드를 기다린 뒤 solution.token을 할당하고, input 이벤트를 발생시킨 다음 제출 버튼을 클릭합니다. Chrome은 finally 블록에서 닫힙니다.

데모의 폼 가정을 실제 폼에 맞게 변경

  • TARGET_URL은 애플리케이션의 폼 페이지입니다. 작업의 site는 전체 URL이 아니라 해당 호스트 이름입니다. reCAPTCHA 요청은 url 또는 type 필드를 사용하지 않습니다.
  • login은 샘플 액션입니다. 애플리케이션과 해당 애플리케이션에 설정된 프로필에서 사용하는 액션으로 바꾸세요.
  • By.NAME과 g-recaptcha-response로 데모 textarea를 찾습니다. 애플리케이션이 실제로 읽는 필드나 제출 매개변수를 사용하세요. 값을 할당하고 input 이벤트를 발생시키는 것은 데모의 전달 방식이며, 모든 경우에 통용되는 reCAPTCHA 콜백이 아닙니다.
  • button[type="submit"]는 데모 제출 버튼을 식별합니다. 폼에 맞는 명확한 선택자로 바꾸고, 애플리케이션에 필요한 세션, CSRF 및 콜백 동작을 유지하세요.

샘플의 20초 명시적 대기는 textarea가 존재하는지만 확인합니다. 제출 버튼을 클릭한 후에는 성공 상태나 유효성 검사 오류 등 애플리케이션의 실제 결과를 기다리는 조건부 대기를 추가하세요. 솔버 제한 시간과 별개로 전체 브라우저 흐름의 기한을 설정하세요. 상태 확인을 고정 시간 대기로 대체하거나 암시적 대기와 명시적 대기를 무분별하게 혼용하지 마세요.

다시 비용을 지불하고 해결을 요청하기 전에 실패 단계 확인

Chrome이 시작되기 전에 솔버 작업이 실패합니다.

종료된 작업의 errorCode와 error를 확인하세요. 작업 실패와 HTTP 요청 오류를 구분하세요.

다음을 시도해 보세요: 재시도 전에 보고된 입력, 프로필 또는 연결 문제를 수정하세요. 실패한 작업의 폴링은 중단하세요. 유효하지 않은 동일한 입력으로 다시 요청해도 나아지지 않습니다.

Selenium이 textarea를 찾는 중 시간 초과됩니다.

Chrome이 의도한 폼에 도달했는지, 페이지에 데모에서 지정한 이름의 필드가 실제로 있는지 확인하세요.

다음을 시도해 보세요: 데모 로케이터를 애플리케이션의 토큰 전달 방식에 맞게 바꾸고, 해당 요소를 사용할 수 있는 상태가 될 때까지 기다리세요. 제한 시간을 늘려도 잘못된 선택자는 해결되지 않습니다.

토큰은 준비되었지만 애플리케이션이 제출을 거부합니다.

먼저 애플리케이션의 발신 요청을 확인하세요. 작업 ID나 이전 값이 아닌 solution.token이 포함되어 있는지, 액션, 프록시, 브라우저 식별 정보 및 세션이 의도한 흐름과 일치하는지 확인하세요.

다음을 시도해 보세요: 다른 토큰을 요청하기 전에 제출한 매개변수나 애플리케이션 요구 사항을 수정하세요. ready 상태의 작업은 솔루션을 제공하며, 제출이 수락되었는지는 애플리케이션의 응답으로 판단합니다.

첫 작업을 실행하세요.

워크스페이스 크레딧 $5로 시작하세요.

워크스페이스 만들기
Selenium에서 CAPTCHA 솔버 사용하기 · solvethree