작업 유형
Cloudflare Turnstile
이 페이지는 중국어 버전을 기계 번역한 것이라 부정확한 내용이 있을 수 있어요. 중국어 버전을 기준으로 해 주세요.
Cloudflare Turnstile 작업은 토큰(token)을 반환해요. 이 토큰을 대상 웹사이트에 제출하면 인증을 통과할 수 있어요. TurnstileTaskProxyless는 작업당 25 포인트 (≈ $3.75 / 1k)이고, 비동기로 결과를 반환해요. 먼저 createTask를 호출한 뒤 5초마다 getTaskResult를 폴링하세요. 인식에 실패하거나 시간이 초과되면 포인트가 자동으로 환불돼요.
https://api.yescaptcha.com/createTask글로벌 엔드포인트https://cn.yescaptcha.com/createTask중국 엔드포인트요청 본문은 JSON이고, clientKey로 인증해요. 작업을 생성한 엔드포인트와 같은 엔드포인트에서 결과를 조회하세요.
사용 시기
섹션 제목: “사용 시기”웹페이지의 폼 안에 Cloudflare 인증 위젯(“사람인지 확인”)이 포함되어 있고, 페이지가 challenges.cloudflare.com/turnstile 스크립트를 로드하는 경우예요.
페이지 전체가 Cloudflare에 가로막혀 “잠시만 기다리십시오…”, “브라우저를 확인하는 중”이 표시된다면 Turnstile이 아니라 Cloudflare 챌린지 페이지예요. 이 경우에는 Cloudflare 챌린지 페이지를 사용하세요. 구분 방법은 캡차 유형 판별에서 확인할 수 있어요.
작업 유형과 가격
섹션 제목: “작업 유형과 가격”| 작업 유형 | 가격 | 반환 방식 | 설명 |
|---|---|---|---|
TurnstileTaskProxyless | $3.75 / 1k; 25 포인트/작업 · ¥25 / 1k | 비동기 | |
TurnstileTaskProxylessM1 | $4.50 / 1k; 30 포인트/작업 · ¥30 / 1k | 비동기 | |
TurnstileTask | $3.75 / 1k; 25 포인트/작업 · ¥25 / 1k | 비동기 | 자체 프록시 |
미국 달러 가격은 US$1 ≈ ¥6.67 기준의 추정치이며, 작업은 포인트로 차감돼요.
TurnstileTaskProxyless와TurnstileTaskProxylessM1은 파라미터가 같고 경로만 달라서 서로 대체용으로 쓸 수 있어요.TurnstileTask는 직접 준비한 프록시로 캡차를 로드해요. 프록시 필드를 함께 전달해야 해요.
요청 파라미터
섹션 제목: “요청 파라미터”| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
type | string | 예 | 작업 유형이에요. 이 페이지의 "작업 유형 및 가격"을 참고하세요 |
websiteURL | string | 예 | 캡차가 표시되는 페이지의 전체 URL이에요. 캡차 제공업체의 도메인이 아니라 캡차가 보이는 사이트를 입력하세요 |
websiteKey | string | 예 | Turnstile 사이트 키(sitekey)예요. 보통 0x로 시작해요 |
pageAction | string | 아니요 | 페이지가 Turnstile에 전달하는 action이에요(turnstile.render의 옵션 또는 위젯 요소의 data-action). 예: login. 대부분의 경우 필요하지 않아요. 작업이 계속 실패할 때만 추가하세요 |
data | string | 아니요 | 페이지가 Turnstile에 전달하는 cData예요(turnstile.render의 옵션 또는 위젯 요소의 data-cdata). 예: c0bd4b36-7419-4e18-83c6-378699f2a9a2. 대부분의 경우 필요하지 않아요. 작업이 계속 실패할 때만 추가하세요 |
proxyType | string | 일부 유형 | 프록시 프로토콜이에요: http, https, socks4, socks5 (TurnstileTask에서 필수) |
proxyAddress | string | 일부 유형 | 프록시 IP 주소 또는 호스트 이름이에요. 127.0.0.1이나 192.168.x.x 같은 로컬 또는 사설 주소는 저희 서버가 접근할 수 없어서 사용할 수 없어요 (TurnstileTask에서 필수) |
proxyPort | integer | 일부 유형 | 프록시 포트 (TurnstileTask에서 필수) |
proxyLogin | string | 아니요 | 프록시 사용자 이름(프록시에 인증이 필요한 경우) (TurnstileTask 전용) |
proxyPassword | string | 아니요 | 프록시 비밀번호(프록시에 인증이 필요한 경우) (TurnstileTask 전용) |
userAgent | string | 아니요 | 브라우저 User-Agent예요. 결과에 userAgent가 있으면 토큰을 제출할 때 그 값을 사용하세요 (TurnstileTask 전용) |
websiteKey는 보통 0x로 시작해요. 찾는 방법은 Turnstile 파라미터 찾기를 참고하세요.
통과하지 못할 때: pageAction과 data
섹션 제목: “통과하지 못할 때: pageAction과 data”대부분은 websiteURL과 websiteKey만 전달하면 충분하고, 이 두 파라미터는 필요하지 않아요. websiteURL과 websiteKey가 모두 맞는데도 작업이 통과하지 못한다면, 웹페이지가 Turnstile을 호출할 때 action과 cData를 전달하는지 확인하세요. turnstile.render의 파라미터이거나 인증 위젯 요소의 data-action, data-cdata예요. 있다면 그대로 함께 전달하세요.
pageAction: 웹페이지의action값이에요. 예:logindata: 웹페이지의cData값이에요. 예:c0bd4b36-7419-4e18-83c6-378699f2a9a2
{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY", "pageAction": "login", "data": "c0bd4b36-7419-4e18-83c6-378699f2a9a2" }}요청 예제
섹션 제목: “요청 예제”{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY" }}curl -s https://api.yescaptcha.com/createTask \ -H 'Content-Type: application/json' \ -d '{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY" }}'
# Returns {"errorId":0,"taskId":"..."}; then poll every 5 seconds:curl -s https://api.yescaptcha.com/getTaskResult \ -H 'Content-Type: application/json' \ -d '{"clientKey": "YOUR_CLIENT_KEY", "taskId": "TASK_ID"}'import osimport time
import requests
API = "https://api.yescaptcha.com"CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"] # Read the clientKey from an environment variable
def call(method, payload): r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30) data = r.json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data
def solve(task): task_id = call("createTask", {"task": task})["taskId"] for _ in range(36): # Poll every 5 seconds, for up to about 3 minutes time.sleep(5) result = call("getTaskResult", {"taskId": task_id}) if result.get("status") == "ready": return result["solution"] raise TimeoutError(task_id)
solution = solve({ "type": "TurnstileTaskProxyless", "websiteURL": "https://example.com/login", "websiteKey": "0x4AAAAAAA_SITE_KEY",})print(solution["token"])const API = 'https://api.yescaptcha.com';const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable
async function call(method, payload) { const res = await fetch(`${API}/${method}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }), }); const data = await res.json(); if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`); return data;}
async function solve(task) { const { taskId } = await call('createTask', { task }); for (let i = 0; i < 36; i++) { // Poll every 5 seconds, for up to about 3 minutes await new Promise((r) => setTimeout(r, 5000)); const result = await call('getTaskResult', { taskId }); if (result.status === 'ready') return result.solution; } throw new Error(`timeout: ${taskId}`);}
const solution = await solve({ type: "TurnstileTaskProxyless", websiteURL: "https://example.com/login", websiteKey: "0x4AAAAAAA_SITE_KEY",});console.log(solution.token);websiteURL과 websiteKey를 대상 웹사이트의 값으로 바꾸세요.
반환 결과
섹션 제목: “반환 결과”{ "errorId": 0, "status": "ready", "solution": { "token": "0.ufq5RgSVZd11DPSX1brdrxnEs28KcVlKj2ORchqxSy2q9yAW6ciq3hriXDF4x...", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36" }}| 필드 | 유형 | 설명 |
|---|---|---|
token | string | 대상 웹사이트에 제출할 토큰이에요. 1회만 사용할 수 있으니 가능한 한 빨리 사용하세요 |
userAgent | string | 토큰을 발급받을 때 사용한 User-Agent예요. 토큰을 제출할 때 이 값을 사용하세요. 보낸 값과 다르면 이 값이 우선해요 |
token을 웹페이지의 cf-turnstile-response 필드(또는 대상 웹사이트 API가 요구하는 필드)에 넣어 제출하세요. 제출 요청의 User-Agent는 반환된 userAgent를 사용하세요.
처리 중일 때는 {"errorId": 0, "status": "processing"}가 반환돼요. 5초 후에 다시 조회하세요. 오류가 발생하면 errorCode에 따라 처리하세요. 자세한 내용은 오류 코드를 참고하세요.
자주 묻는 질문
섹션 제목: “자주 묻는 질문”토큰은 얼마 동안 유효한가요?
섹션 제목: “토큰은 얼마 동안 유효한가요?”일회용이에요. 받은 뒤 가능한 한 빨리 제출하세요. Turnstile 토큰은 보통 몇 분 안에 만료되며, 만료 시점은 Cloudflare가 결정해요.
제출했는데도 웹사이트에서 통과되지 않아요
섹션 제목: “제출했는데도 웹사이트에서 통과되지 않아요”websiteURL이 인증 위젯이 나타나는 페이지인지, websiteKey가 올바른지 확인하고, 제출할 때 반환된 userAgent를 사용하세요. 웹페이지가 action과 cData를 전달한다면 pageAction과 data로 함께 전달하세요. 위의 통과하지 못할 때를 참고하세요. 웹사이트가 IP도 함께 검사한다면 TurnstileTask를 사용하고, 제출할 때도 같은 프록시를 거치세요.