Scarnox · Blog

보이지 않는 PopularCaptcha 풀기: 차이점과 보낼 값

보이지 않는 PopularCaptcha는 captcha처럼 보이지 않습니다. "나는 사람입니다" 체크박스가 없습니다. 사이트가 자체 JavaScript에서 PopularCaptcha를 호출하는데, 보통 방문자가 제출 버튼을 누를 때 호출하며, 방문자가 사람인지 확신하지 못할 때만 챌린지를 보여 줍니다. 자동화 스크립트 입장에서는 위젯을 알아채기가 더 어렵지만, 풀이 자체는 여전히 요청 한 번입니다.

Scarnox는 보이지 않는 변형을 포함해 오늘날 PopularCaptcha를 풉니다. is_invisible 플래그 하나만 설정하면, 보이는 위젯에 보내는 것과 같은 요청을 보내면 됩니다. 다른 captcha 유형은 출시 예정입니다.

보이지 않는다는 것을 알아보는 방법

판단은 페이지의 겉모습이 아니라 sitekey의 설정이 합니다. 확신이 없다면 sitekey 찾기를 하고, 페이지의 JavaScript에서 위젯 옵션을 확인하세요.

보낼 값

같은 엔드포인트와 같은 작업 유형을 쓰고, is_invisible을 true로 설정해 추가하세요.

{
  "captcha_type": "PopularCaptchaTaskProxyless",
  "site_key": "10000000-ffff-ffff-ffff-000000000001",
  "site_url": "https://example.com/login",
  "is_invisible": true
}

다른 예시와 마찬가지로 Authorization: Bearer 헤더에 키를 담아 보내세요. 호출은 토큰이 준비될 때까지 블로킹되며, 폴링은 필요 없습니다. 약 185초의 타임아웃을 사용하세요.

토큰 돌려주기

보이지 않는 연동은 거의 항상 폼 필드가 아니라 콜백을 사용합니다. 사이트는 data-callback 속성이나 render()에 넘기는 옵션에서 위젯에 함수 이름을 전달합니다. 그 함수를 토큰과 함께 호출하면, 사이트 자체 코드는 방문자가 챌린지를 통과한 것처럼 계속 진행합니다.

await page.evaluate((t) => {
  document.querySelectorAll('[name="h-captcha-response"]').forEach((el) => { el.value = t; });
  const cb = document.querySelector("[data-sitekey]")?.dataset.callback;
  if (cb && typeof window[cb] === "function") window[cb](t);
}, token);

숨겨진 필드도 함께 설정해도 해가 없으며, 제출 시 그 필드를 읽는 사이트도 커버됩니다.

타이밍이 평소보다 더 중요합니다

보이지 않는 위젯에서는 챌린지가 언제 실행될지를 사이트가 결정하며, 보통 방문자가 제출하는 순간입니다. 따라서 그 순간에 풀어야 합니다. 더 일찍 풀지 마세요. 가장 쉬운 패턴은 스크립트에서 버튼을 누르기 직전에 풀이를 실행하고, 콜백을 호출한 뒤 제출하는 것입니다.

토큰은 약 2분 안에 만료됩니다. 페이지 로드 중에 가져온 토큰을 1분 뒤에 쓰면 거부될 가능성이 높습니다.

흔한 실수

보이지 않는 sitekey를 일반 보이는 작업으로 보내면, 사이트가 거부하는 토큰이 나올 수 있습니다. API가 토큰을 돌려주는데 사이트가 거부한다면, 다음 순서로 확인하세요.

  1. is_invisible이 true로 설정되어 있나요?
  2. 사이트가 콜백을 호출하나요? 그리고 폼이 제출되기 전에 호출하나요?
  3. site_url이 보이지 않는 위젯이 실행되는 페이지인가요?
  4. 그래도 사이트가 토큰을 거부한다면, 문제가 풀이를 수행한 IP에 묶여 있을 수 있습니다. 프록시 vs 프록시리스 풀이와 비교해 보세요.

보이지 않는 흐름을 안전하게 테스트하기

보이지 않는 위젯은 손으로 테스트하기 어렵습니다. 챌린지는 제출 때만 실행되고, 대부분의 경우 아무것도 보여 주지 않고 통과하기 때문입니다. 다음 순서로 테스트하세요.

  1. 무료 체험 가이드의 스모크 테스트를 사용해, is_invisible을 true로 설정한 풀이가 토큰을 돌려주는지 확인하세요.
  2. 그 토큰으로 브라우저 콘솔에서 사이트 콜백을 직접 호출하고, 폼이 계속 진행하는지 지켜보세요.
  3. 스크립트에서 폼을 제출하고, 다음에 나오는 페이지를 확인하세요.
  4. 가능하다면 두 번째 네트워크에서 실행을 반복해, 토큰이 풀이한 IP에 묶여 있지 않은지 확인하세요.

테스트는 직접 소유한 폼이나, 테스트해도 되는 사이트의 스테이징 복사본에서 하세요. 직접 통제하지 않는 실제 계정에서는 보이지 않는 흐름을 절대 실행하지 마세요.

보이지 않는 제출 한 번의 이벤트 순서

제대로 작동하는 연동은 다음 순서를 따릅니다.

  1. 방문자 또는 스크립트가 폼을 채웁니다.
  2. 스크립트가 페이지에서 sitekey와 페이지 URL을 읽습니다.
  3. 스크립트가 is_invisible을 true로 설정해 풀이 엔드포인트를 호출하고 토큰을 기다립니다.
  4. 스크립트가 응답 필드에 토큰을 넣고 사이트의 콜백을 호출합니다.
  5. 사이트 코드가 토큰을 붙여 폼을 제출합니다.

3단계가 5단계보다 훨씬 일찍 일어나면, 폼이 제출되기 전에 토큰이 만료될 수 있습니다. 간격은 가능한 한 짧게 유지하세요.

사이트가 보이지 않는 토큰을 거부할 때

거부가 항상 토큰의 문제는 아닙니다. 풀이 요청을 바꾸기 전에 다음을 확인하세요.

이 점검을 마친 뒤에야 프록시 문제로 넘어가세요. 대부분의 거부는 IP가 아니라 콜백이나 세션에서 생깁니다.

다음 단계

무료 체험 크레딧으로 카드 없이 시작하세요. 계정을 만들고 직접 소유한 페이지에서 보이지 않는 sitekey를 테스트해 보세요.