Flask 백엔드에서 solvethree 호출하기

작성: solvethree읽는 데 3분

별도의 Flask 경로를 사용해 solvethree 작업을 생성하고 조회하세요. 아래 POST는 전체 솔루션 생성이 끝날 때까지 기다리지 않고 반환합니다. 호출자는 작업 ID를 보관하고 작업이 준비되거나 실패할 때까지 GET 경로로 확인합니다.

이 페이지의 내용

의존성 설치 및 대상 설정

  1. 1.

    Python 3.10 이상 사용

    python -m pip install flask로 Flask를 설치하세요. python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl로 공식 Python SDK를 설치하세요.

  2. 2.

    서버 환경 변수 설정

    SOLVETHREE_API_KEY를 워크스페이스 API 키로 설정하고, INTEGRATION_KEY를 권한이 있는 호출자가 X-Integration-Key로 보낼 비밀 값으로 설정하세요. CAPTCHA_SITE는 전체 URL이 아닌 대상 호스트 이름으로, SOLVETHREE_PROXY는 이 작업에 사용하는 HTTP 또는 HTTPS 프록시 URL로 설정하세요. 이 값들은 서버에 보관하세요.

  3. 3.

    사이트 프로필 활성화

    solvethree 콘솔에서 해당 호스트 이름의 활성 프로필을 설정하고 워크스페이스에서 사용할 수 있도록 하세요. CAPTCHA_SITE를 설정해도 프로필이 생성되지는 않습니다. 대상이 아직 설정되지 않았다면 사이트 프로필 설정을 참고하세요.

이 예제는 액션을 login으로 고정하고 기본 reCAPTCHA Enterprise v3 작업을 사용합니다. 실행하기 전에 대상 작업에 맞게 액션을 변경하세요. 호출자는 요청 본문으로 사이트, 액션 또는 프록시를 재정의할 수 없습니다.

생성 및 조회 경로 추가

Flask · 동일한 작업 생성 및 조회
# pip install flask and the official solvethree SDK wheel.
import hmac
import os
from flask import Flask, abort, jsonify, request
from solvethree import Solvethree, SolvethreeError

app = Flask(__name__)

def client():
    return Solvethree(os.environ["SOLVETHREE_API_KEY"])

@app.before_request
def authorize():
    if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
        abort(401)

@app.errorhandler(SolvethreeError)
def task_error(error):
    return jsonify(requestId=error.request_id, taskId=error.task_id), 502

@app.errorhandler(ValueError)
def invalid_input(error):
    return jsonify(error="Invalid task input or ID"), 400

@app.post("/captcha/tasks")
def create():
    task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    if request.headers.get("x-request-id"):
        task["requestId"] = request.headers["x-request-id"]
    return jsonify(client().create_task(task, wait_ms=0, timeout=20))

@app.get("/captcha/tasks/<task_id>")
def retrieve(task_id):
    return jsonify(client().get_task(task_id, wait_ms=15000, timeout=25))

예제를 app.py로 저장하세요. 환경 변수를 설정한 상태에서 python -m flask --app app run으로 로컬에서 시작하세요. 경로는 POST /captcha/tasks와 GET /captcha/tasks/<task_id>입니다. Flask는 데코레이터가 두 경로를 등록하므로 별도의 URLconf가 필요하지 않습니다. 로컬 시작에 관한 자세한 내용은 Flask 빠른 시작을 참고하고, 기존 프로덕션 WSGI 설정은 유지하세요.

생성은 wait_ms=0과 20초 네트워크 타임아웃을 사용합니다. 이는 솔루션 생성 대기를 건너뛰는 것이지 HTTP 요청 자체를 기다리지 않는다는 뜻은 아닙니다. 조회는 작업 업데이트를 최대 15초 동안 기다리며 25초 네트워크 타임아웃을 사용합니다. 두 뷰 모두 동기식 SDK를 사용하므로 SDK 호출이 실행되는 동안 각각 요청 워커를 점유합니다.

POST를 보내기 전에 요청 ID 보관

  1. 1.

    논리적 작업마다 요청 ID 하나 생성

    POST /captcha/tasks를 호출하기 전에 저장한 다음, X-Integration-Key와 함께 X-Request-ID로 보내세요. ASCII 영문자, 숫자, 밑줄 또는 하이픈으로 구성된 1–64자를 사용하세요. 서버가 고정된 설정으로 작업을 구성하므로 이 POST에는 작업 본문이 필요하지 않습니다.

  2. 2.

    반환된 작업 ID 보관

    성공한 HTTP 응답을 받으면 결과의 id를 저장하세요. X-Integration-Key를 다시 보내면서 GET /captcha/tasks/<task_id>로 조회하세요.

  3. 3.

    생성 여부가 불확실하면 새 작업을 만들지 말고 기존 작업 복구

    POST 연결 시간이 초과되어도 생성은 성공했을 수 있습니다. 작업 ID가 있으면 해당 작업을 조회하세요. 없다면 동일한 X-Request-ID와 변경하지 않은 작업 입력값으로 POST를 다시 보내 기존 작업을 복구하세요. 사이트, 액션 또는 프록시를 변경한 뒤 같은 ID를 재사용하면 충돌이 발생합니다.

예제에서 이 헤더는 선택 사항이지만, 생성을 완료한 뒤 응답이 유실되었을 때 헤더를 생략했다면 이 복구 방법을 사용할 수 없습니다. 첫 요청의 시간이 초과되었다는 이유만으로 새 ID를 생성하지 마세요.

작업 상태보다 HTTP 오류를 먼저 처리

먼저 Flask 응답의 HTTP 상태를 확인하세요. 예제는 연동 키가 없거나 잘못되면 401, ValueError를 포착하면 400, SolvethreeError를 포착하면 502를 반환합니다. 이 502 응답 본문은 복구에 사용할 requestId와 taskId를 제공합니다. 작업 상태 페이로드가 아니며, 이것만으로 작업 실패를 의미하지는 않습니다.

성공한 HTTP 응답을 받으면 작업 상태를 확인하세요.
성공한 HTTP 응답을 받으면 작업 상태를 확인하세요.
작업 상태호출자 조치
대기 중같은 작업 ID를 유지하고 다시 조회하세요.
해결 중같은 작업 ID를 유지하고 다시 조회하세요.
ready폴링을 중단하고 솔루션을 확인하세요.
실패폴링을 중단하고 errorCode와 error를 확인하세요. 해결에 실패하면 환불됩니다.

원래 프록시와 반환된 식별 정보로 토큰 제출

ready 결과에만 사용 가능한 솔루션이 포함됩니다. 작업 ID가 아닌 solution.token을 의도한 대상에 보내고, 반환된 solution.userAgent와 solution.secChUa 브라우저 식별 정보를 사용하세요.

작업을 생성할 때 사용한 것과 동일한 프록시로 제출하세요. 이 예제는 고정된 SOLVETHREE_PROXY 하나를 사용하므로, 나중에도 현재 환경 변수 값이 일치할 것이라고 가정하지 말고 원래 프록시 설정을 작업과 함께 보관하세요. Flask 라우트는 SDK 결과를 반환할 뿐, 대상에 제출하거나 호출자의 프록시를 설정하지는 않습니다.

토큰, 프록시, 브라우저 식별 정보, 의도한 대상을 함께 보관하세요. 준비된 작업은 solvethree가 솔루션을 생성했다는 뜻이며, 수락 여부는 이후 애플리케이션 요청에 대한 대상의 응답으로 결정됩니다.

첫 작업을 실행하세요.

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

워크스페이스 만들기
Flask 백엔드에서 solvethree 호출하기 · solvethree