Python과 Node.js로 여러 CAPTCHA 해결하기

작성: solvethree읽는 데 3분

시작하는 요청 수뿐 아니라 진행 중인 풀이 수를 제한하세요. 아래 예제는 독립적인 reCAPTCHA Enterprise 작업 8개를 동시에 최대 4개까지 풀이하며, 각 결과가 완료되는 대로 처리합니다.

4개는 동시 실행 설정의 예시일 뿐, solvethree의 처리 용량 한도가 아닙니다. 애플리케이션이 반환된 솔루션을 얼마나 빨리 사용할 수 있는지에 맞춰 한도를 정하세요.

이 페이지의 내용

SDK 및 작업 입력 준비

Python 3.10+ 또는 Node.js 22+를 사용하세요. 문서의 다운로드 URL에서 공식 SDK를 설치하되, 패키지 직접 다운로드를 사용하세요. 워크스페이스 API 키는 서버에 보관하세요.

  • 서버 환경에 SOLVETHREE_API_KEY와 SOLVETHREE_PROXY를 설정하세요.
  • accounts.example.com과 login을 대상 호스트 이름과 액션으로 바꾸세요. 사이트에는 워크스페이스에서 사용할 수 있는 활성 프로필이 이미 있어야 합니다. 호스트 이름을 제출해도 프로필이 생성되지는 않습니다.
  • jobs의 각 항목을 별도의 논리적 작업으로 취급하세요. 예제에서는 배치를 읽기 쉽게 하려고 동일한 사이트, 액션, 프록시를 반복하지만 모든 작업에 서로 다른 requestId를 부여합니다.
  • 복구 중에는 각 작업의 입력을 변경하지 마세요. 새로운 독립적인 풀이에는 새 ID가 필요하고, 중단된 풀이를 복구하려면 원래 ID와 동일한 입력이 필요합니다.

동시 실행 수를 제한한 배치 실행

Python · 4개 동시 해결
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
from uuid import uuid4
from solvethree import Solvethree

# Each worker gets its own synchronous client.
def solve_one(job):
    client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
    return client.solve({**job, "requestId": str(uuid4())}, timeout=180)

jobs = [
    {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    for _ in range(8)
]
with ThreadPoolExecutor(max_workers=4) as pool:
    futures = [pool.submit(solve_one, job) for job in jobs]
    for future in as_completed(futures):
        try:
            result = future.result()
            print("Ready task:", result["id"])
            # Submit this solution promptly; don't wait for the whole batch.
        except Exception as error:
            print("One task failed:", type(error).__name__)

여기서는 `Solvethree`가 동기식이므로 Python에 스레드가 필요합니다. 각 solve 호출은 작업을 생성하고 결과가 준비될 때까지 기다리거나 예외를 발생시킵니다. 네이티브 비동기 클라이언트가 없으므로 비동기 함수 안에서 직접 호출해도 해당 함수의 이벤트 루프 스레드를 차단합니다. 예제는 각각 자체 클라이언트를 가진 스레드 풀 워커 4개를 사용하며, 전체 배치를 기다리지 않고 완료된 퓨처를 처리합니다.

Node.js는 워커 프로미스 4개로 동시 실행 수를 제한합니다. 각 워커는 하나의 풀이를 기다린 후 다음 작업을 가져옵니다. Promise.all은 해당 워커들을 기다릴 뿐, 모든 작업을 한꺼번에 시작하지 않습니다. 반면 제한 없는 작업 목록을 solve 호출에 직접 매핑하면 전체 목록이 즉시 시작되며, 동시 실행 수를 실질적으로 제한할 수 없습니다.

두 예제 모두 작업별로 오류를 처리하므로 하나의 풀이가 실패해도 나머지 작업은 중단되지 않습니다. 180초 시간 제한은 전체 배치가 아니라 각 solve 호출에 적용됩니다.

준비된 각 결과를 즉시 사용

실제 배치를 실행하기 전에 성공 처리 경로의 주석을 대상 사이트에 제출하는 코드로 바꾸세요. 출력된 ID는 작업을 식별하며, reCAPTCHA 토큰이 아닙니다. 해당 작업에 제공한 것과 동일한 프록시를 사용해 반환된 userAgent, secChUa와 함께 solution.token을 제출하세요.

모든 토큰을 모은 뒤 가장 느린 풀이가 끝날 때까지 기다렸다가 사용하지 마세요. 준비된 각 결과를 도착하는 즉시 처리하세요. SDK는 CAPTCHA를 풀지만 대상 사이트에 솔루션을 제출하지는 않으며, 작업이 준비되었다고 해서 대상 사이트가 후속 요청을 수락했다는 뜻은 아닙니다.

전체 배치가 아닌 중단된 작업 하나만 복구

예제에서는 워커 패턴을 간결하게 유지하기 위해 오류 클래스 이름을 출력합니다. 실제 연동에서는 영향을 받은 작업 항목과 SDK 오류가 제공하는 복구 ID를 보관하세요. Python은 request_id와 task_id를, JavaScript는 requestId와 taskId를 사용합니다.

풀이 시간이 초과되거나 연결이 끊어집니다.

오류에서 작업 ID 또는 요청 ID를 확인하세요. 원격 작업은 여전히 존재할 수 있습니다.

다음을 시도해 보세요: 작업 ID를 알고 있다면 GET 폴링을 재개하세요. 그렇지 않으면 동일한 요청 ID로 동일한 입력을 재전송해 생성을 복구하세요.

SDK가 TaskFailedError를 발생시킵니다.

종료된 작업의 errorCode와 error를 확인하세요.

다음을 시도해 보세요: 해당 작업의 폴링을 중단하고 다른 풀이를 시작하기 전에 보고된 원인을 해결하세요. 잘못된 입력을 변경하지 않은 채 무작정 재시도하지 마세요.

어느 예제든 다시 실행하면 새 요청 ID가 생성되고 새 논리적 작업이 시작됩니다. 이는 복구가 아닙니다. 두 SDK 모두 작업 생성을 자동으로 재시도하지 않으므로, 성공한 작업을 다시 제출하지 않고 중단된 작업만 복구할 수 있도록 충분한 정보를 보관하세요.

첫 작업을 실행하세요.

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

워크스페이스 만들기
Python과 Node.js로 여러 CAPTCHA 해결하기 · solvethree