Python으로 reCAPTCHA Enterprise 해결

작성: solvethree읽는 데 3분

공식 Python SDK로 reCAPTCHA v3 Enterprise 토큰을 요청한 다음, 반환된 브라우저 식별 정보 및 동일한 프록시와 함께 solution.token을 제출합니다. Python 3.10 이상, 워크스페이스 API 키, 대상 사이트의 활성 프로필이 필요합니다.

이 페이지의 내용

SDK 설치 및 사이트 구성

공식 Python SDK를 설치합니다:

Python SDK 설치
python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl
  1. 1.

    사이트 프로필 생성

    solvethree 콘솔에서 대상 호스트 이름을 설정하고 해당 프로필이 활성 상태이며 워크스페이스에서 사용할 수 있는지 확인하세요. 해결 요청에 호스트 이름을 보내도 프로필이 생성되지는 않습니다. 아직 구성하지 않았다면 사이트 프로필 설정을 참조하세요.

  2. 2.

    SOLVETHREE_API_KEY 설정

    스크립트를 실행할 셸이나 배포 환경에서 SOLVETHREE_API_KEY를 워크스페이스 API 키로 설정하세요. 키는 서버에 보관하고 브라우저 코드나 커밋된 소스 파일에 넣지 마세요.

  3. 3.

    SOLVETHREE_PROXY 설정

    SOLVETHREE_PROXY를 해결 요청과 후속 애플리케이션 요청에 사용할 프록시 URL로 설정하세요. 이 예제는 프록시 하나를 사용하므로 proxyCandidates를 추가하지 마세요.

Enterprise 토큰 요청

이 예제를 solve.py로 저장하세요. accounts.example.com을 구성한 호스트 이름으로 바꾸되 스킴이나 경로는 제외하고, login을 대상 페이지에서 사용하는 액션으로 바꾸세요.

Python · solve.py
import os
from uuid import uuid4
from solvethree import Solvethree, SolvethreeError, TaskFailedError

client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
request = {
    "site": "accounts.example.com",  # Use your configured hostname.
    "action": "login",              # Use the page's actual action.
    "proxy": os.environ["SOLVETHREE_PROXY"],
    "requestId": str(uuid4()),
}
try:
    result = client.solve(request, timeout=180)
except TaskFailedError as error:
    raise SystemExit(f"Task failed: {error.error_code}") from None
except SolvethreeError as error:
    # Keep these IDs so an interrupted request can be recovered.
    raise SystemExit(f"Recover request {error.request_id}, task {error.task_id}") from None

solution = result["solution"]
token = solution["token"]
user_agent = solution["userAgent"]
client_hints = solution["secChUa"]
print("Ready task:", result["id"])  # Do not print the token or proxy password.

요청의 기본값은 enterprise-v3이므로 recaptchaType 필드가 필요하지 않습니다. type이나 url은 reCAPTCHA 요청 필드가 아니므로 추가하지 마세요.

Solvethree는 동기식입니다. client.solve는 작업을 한 번 생성한 다음 준비된 결과를 반환하거나 예외를 발생시킬 때까지 폴링합니다. 여기서 timeout=180은 클라이언트의 대기 시간을 180초로 제한합니다. 성공하면 스크립트는 민감한 값을 출력하지 않고 토큰, 사용자 에이전트, 클라이언트 힌트를 추출합니다.

애플리케이션에 토큰 제출

해결이 끝나면 같은 스크립트에서 계속 진행하세요. 예제에 명시된 대로 requests를 별도로 설치하세요. 로그인 URL과 폼 데이터를 애플리케이션의 실제 요청에 맞게 바꾸고 필요한 자격 증명, CSRF 토큰, 세션 쿠키를 포함하세요.

Python requests · 준비된 솔루션 적용
# Continue after client.solve(). Install requests separately: pip install requests.
import requests

# This example endpoint accepts the standard reCAPTCHA form field.
# Use your application's real URL, form fields, CSRF token and session.
response = requests.post(
    "https://accounts.example.com/login",
    data={"g-recaptcha-response": solution["token"]},
    headers={
        "User-Agent": solution["userAgent"],
        "sec-ch-ua": solution["secChUa"],
    },
    proxies={"http": request["proxy"], "https": request["proxy"]},
    timeout=30,
    allow_redirects=False,
)
# Inspect the application's response to determine whether it accepted the request.
print("Application HTTP status:", response.status_code)

이 예제는 애플리케이션이 g-recaptcha-response로 토큰을 받는다고 가정합니다. 필드 이름을 추측하지 말고 실제 요청을 확인하세요. 폼에 기존 세션이 필요하다면 쿠키 없이 새 요청을 보내는 대신 해당 세션을 통해 제출하세요.

반환된 userAgent와 secChUa를 유지하고 해결 요청에 제공한 것과 동일한 프록시를 사용하세요. IP를 바꾸거나 관련 없는 브라우저 식별 정보로 대체하면 요청이 실패할 수 있습니다.

준비된 작업은 솔루션이 생성되었다는 뜻이지 애플리케이션이 이를 수락했다는 뜻은 아닙니다. 애플리케이션의 응답과 생성된 세션을 확인하세요. HTTP 상태만으로는 로그인 성공을 확인할 수 없습니다. 토큰이 거부되면 다른 해결 요청에 비용을 지불하기 전에 전송 요청을 확인하세요. 작업 ID나 이전 토큰이 아니라 solution.token이 포함되어야 합니다. 거부된 토큰 진단을 참조하세요.

새 작업을 만들지 않고 중단된 해결 요청 복구

이 예제는 스크립트가 시작될 때마다 새 requestId를 생성합니다. 프로세스 재시작 후 복구가 필요하다면 solve를 호출하기 전에 해당 ID와 원본 요청을 저장하세요. 스크립트를 단순히 다시 실행하면 새로운 논리적 요청이 생성됩니다.

  • 예외에 task_id가 포함되어 있다면 get_task로 해당 작업의 폴링을 재개하세요. 연결 시간이 초과되었다는 이유만으로 대체 작업을 만들지 마세요.
  • 생성이 중단되었고 request_id만 있다면 동일한 requestId로 완전히 동일한 작업 요청을 다시 보내세요. 기존 작업이 반환됩니다. 같은 ID를 재사용하면서 작업 입력을 바꾸면 충돌이 발생합니다.
  • TaskFailedError가 발생하면 해당 작업의 폴링을 중단하세요. 재시도 전에 errorCode와 error를 확인하세요. 잘못된 입력을 그대로 두고 다시 해결을 요청해도 문제가 해결되지 않습니다. 실패한 해결 요청은 환불됩니다.

SDK는 작업 생성을 자동으로 재시도하지 않습니다. 다만 해결 기한 내에 일시적인 폴링 실패가 발생하면 Retry-After를 따릅니다. 대기와 복구를 더 세밀하게 제어하려면 작업 폴링 및 시간 제한을 참조하세요.

첫 작업을 실행하세요.

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

워크스페이스 만들기
Python으로 reCAPTCHA Enterprise 해결 · solvethree