해결된 토큰 제출 시 애플리케이션 쿠키 유지하기
풀이가 완료된 reCAPTCHA 토큰은 애플리케이션의 세션 쿠키나 CSRF 값을 대체하지 않습니다. 동일한 requests.Session으로 폼을 가져오고 제출해야 POST에서도 GET 중 받은 쿠키가 유지됩니다.
두 애플리케이션 요청 모두에 솔버가 반환한 브라우저 헤더와 동일한 프록시를 사용하세요. 이 예제는 폼을 열기 전에 해당 헤더를 사용할 수 있도록 먼저 풀이를 수행합니다.
이 페이지의 내용
폼 GET과 POST를 하나의 세션에서 처리하세요
requests와 공식 solvethree Python SDK가 설치된 Python 3.10+를 사용하세요. 대상 호스트 이름에 대한 활성 프로필이 워크스페이스에 있어야 합니다. 작업에 호스트 이름을 전송한다고 프로필이 생성되지는 않습니다. 설정되지 않았다면 사이트 프로필 설정을 참고하세요.
TARGET_URL을 애플리케이션의 폼 URL로 설정하세요. 직접 소유한 이 데모에서는 GET과 POST에 동일한 URL을 사용합니다.SOLVETHREE_PROXY를 풀이와 두 애플리케이션 요청에 사용할 단일 프록시로 설정하세요.SOLVETHREE_API_KEY를 워크스페이스 API 키로 설정하세요. 이 코드는 서버 측에서 실행하세요.
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree
class FormParser(HTMLParser):
csrf = None
def handle_starttag(self, tag, attributes):
values = dict(attributes)
if tag == "input" and values.get("name") == "csrf_token":
self.csrf = values.get("value")
target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
proxies = {"http": proxy, "https": proxy}
page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
page.raise_for_status()
parser = FormParser(); parser.feed(page.text)
if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
print("Application HTTP status:", response.status_code)
# Use the actual form's submit URL, fields and session rules. Inspect its result.SDK의 solve 호출은 작업을 생성하고 준비 완료 상태가 되거나 예외가 발생할 때까지 폴링합니다. 그런 다음 예제는 solution.userAgent와 solution.secChUa를 세션에 적용합니다. GET은 세션의 쿠키 저장소를 채우고, POST는 해당 저장소를 재사용하며 폼에서 파싱한 CSRF 값과 함께 solution.token을 제출합니다.
데모의 login 액션, 제출 URL, 폼 필드를 애플리케이션에 맞게 변경하세요. csrf_token은 이 폼의 필드 이름이지 solvethree의 요구 사항이 아닙니다. 다른 이름이나 구조를 사용한다면 HTML 파서를 조정하고 로그인 인증 정보 등 필요한 다른 필드도 포함하세요. 제출 URL이 폼 URL과 다르더라도 동일한 세션을 사용하세요.
애플리케이션이 POST를 거부하는 경우
출력된 HTTP 상태는 출발점일 뿐, 로그인 성공의 증거가 아닙니다. 다른 풀이에 비용을 지불하기 전에 애플리케이션의 응답과 발신 요청을 확인하세요. 준비 완료된 작업은 솔루션이 생성되었다는 뜻이며, 제출 수락 여부는 여전히 애플리케이션이 결정합니다.
- CSRF 입력 필드를 찾을 수 없습니다.
GET 응답 상태와 본문을 확인하세요. 리디렉션 따라가기가 비활성화되어 있으므로 리디렉션 응답은 예상한 폼이 아닙니다.
다음을 시도해 보세요: 동일한 세션을 통해 올바른 폼을 명시적으로 가져온 다음 실제 CSRF 필드에 맞게 파서를 조정하세요.
- 애플리케이션이 세션 누락 또는 유효하지 않은 CSRF 값을 보고합니다.
GET이 쿠키를 받았는지, POST가 해당 쿠키를 전송했는지, CSRF 값이 그 폼 응답에서 가져온 값인지 확인하세요.
다음을 시도해 보세요: 두 요청 모두 동일한 requests.Session에서 처리하세요. 한 클라이언트로 폼을 가져온 뒤 다른 클라이언트로 제출하지 마세요.
- 애플리케이션이 CAPTCHA를 거부합니다.
발신 요청의 토큰 필드, 액션, 프록시, User-Agent, sec-ch-ua를 확인하세요. 작업 ID나 이전 토큰이 아니라 solution.token을 보내고 있는지 확인하세요.
다음을 시도해 보세요: 현재 토큰, 풀이에 사용한 것과 동일한 프록시, 반환된 브라우저 헤더를 사용하세요. 토큰이 만료되었거나 이미 평가되었다면 제출 시점에 가깝게 새 토큰을 받으세요.
- POST는 완료되지만 로그인은 되지 않습니다.
응답 본문과 리디렉션 대상, 실제 제출 URL 및 필수 폼 필드를 확인하세요.
다음을 시도해 보세요: 데모의 폼 데이터를 애플리케이션의 요구 형식에 맞게 조정하세요. CAPTCHA 토큰은 인증 정보나 누락된 다른 애플리케이션 필드를 제공하지 않습니다.
출처 및 API 레퍼런스
첫 작업을 실행하세요.
워크스페이스 크레딧 $5로 시작하세요.