Menu

AntiGate 작업으로 CAPTCHA를 우회하는 방법

AntiGate 작업 튜토리얼에 관한 새 영상 버전의 경우, 여기에서 확인하실 수 있습니다.

수년간의 연구 개발 끝에 당사는 인간이 구축한 CAPTCHA 게이트를 로봇이 통과할 수 있도록 지원하는 범용 솔루션을 도입하였습니다. 바로 "AntiGate"라고 불리는 솔루션으로, 저희 인력들이 정확한 작업을 실행하기 위해 사용하는 시나리오 템플릿이라 할 수 있습니다.

특정 시점에서 앱은 새로운 유형의 CAPTCHA, 난독화 처리된 브라우저 스크립트 등으로 구성된 자동화 보호 "gateway"와 마주하게 되는데, 바로 여기서 AntiGate 작업이 본격적으로 시작됩니다. 여기서 사용자는 실제 사람과 유사한 브라우저 세션을 구축하도록 당사의 작업자 중 한 명에게 해당 권한을 위임하게 됩니다.
  • 첫째, 템플릿을 선택합니다. 여기서 기존의 템플릿을 사용하거나 본인만의 템플릿을 직접 생성할 수 있습니다. 여기서 템플릿은 작업자가 실행하는 단계별 지침으로 구성됩니다.
  • 둘째, 입력할 입력값, 입력값의 CSS 셀렉터, 혹은 여러분이 탐색해야 하는 웹 주소와 같이 템플릿에 필요한 추가 데이터를 기재합니다. 템플릿에 대해서는 잠시 후에 보다 자세히 설명하도록 하겠습니다.
  • 셋째, 프록시가 필요합니다 (선택 사항). 웹사이트에서 각 세션 쿠키를 정확한 IP 주소와 연관시키는 경우에는 프록시가 필요합니다.
이 세 가지가 갖춰지면 당사의 API를 통해 작업을 생성할 수 있습니다. 이때 작업자는 당사의 특수 브라우저 플러그인을 통해 사용자의 웹사이트로 이동하여 모든 시나리오 단계를 수동 또는 자동으로 실행합니다. 그리고 스크립트 마지막에 쿠키, localStorage 값, 브라우저 지문와 같은 모든 브라우저 세션 정보를 수집하여 사용자의 앱으로 다시 전송합니다. 해당 작업이 완료되면 이제 이 데이터를 사용하여 작업자 세션을 복원하고 마치 실제 사용자처럼 작업을 계속 진행하기만 하시면 됩니다. 정말로 멋지지 않나요? :)

AntiGate 템플릿이란?

AntiGate 템플릿은 작업자가 거쳐야 하는 정확한 시나리오를 정의합니다. 템플릿은 다양한 단계로 구성되며, 이러한 단계는 모두 순차적으로 실행됩니다. 즉, 한 단계가 완료되면, 작업자는 다음 단계로 넘어가며, 모든 단계가 완료되면, 작업이 완료되고, 작업자 세션의 스냅샷이 생성되어 사용자의 앱으로 다시 전송됩니다.

어떤 단계로 진행되나요?
  • 텍스트 입력 영역을 자동 혹은 수동으로 채웁니다.
  • 페이지에 텍스트 샘플이 페이지에 나타나거나 사라질 때까지 기다립니다.
  • CSS로 정의한 DOM 요소가 페이지에 나타날 때까지, 혹은 페이지에서 사라질 때까지 기다립니다.
  • 작업자의 현재 브라우저 URL 주소에 키워드가 나타날 때까지, 혹은 사라질 때까지 기다립니다.
템플릿의 "description for workers" 텍스트 영역을 통해 작업자가 진행해야 하는 다른 단계에 대해서 설명할 수 있습니다. 예제: "Solve a captcha and press the submit button".
그러면 예를 살펴보겠습니다. 우선, 개발자 센터로 이동하여 테스트용 무료 템플릿을 만들어 보시기 바랍니다. 걱정하지 마시고 편하게 진행하시면 된답니다!
클릭하여 템플릿 추가하기
클릭하여 예제 불러오기
단계 섹션 참고하기
자, 이제 데모 예제를 불러왔으며, 계정에 예제를 저장하여 나중에 직접 테스트해 보실 수 있습니다. 템플릿 속성의 전체 목록은 아래와 같습니다.
  • 템플릿 이름. 일단 저장된 후에는 수정할 수 없습니다. 그리고 템플릿을 게시하면 API에서 이 이름으로 템플릿을 사용할 수 있게 됩니다.
  • 고객을 위한 설명. 공개 템플릿의 경우, 당사의 템플릿 카탈로그에서 제공됩니다.
  • 작업자를 위한 설명. 페이지 상단에서 작업자에게 표시되는 텍스트입니다.
    작업자 인터페이스 예제
  • 변수. 영구 값 대신 단계에서 사용하기 위해 추가할 수 있는 변수 이름의 목록을 말합니다. 이 예제에서는 "login"과 "password"라는 두 개의 변수가 존재하며, 이 두 변수는 1단계와 2단계에서 데모 로그인 양식을 채우는 데 사용됩니다. 이를 통해 사용자는 템플릿에 영구 로그인 및 비밀번호를 하드코딩하는 대신 API를 통해 해당 값을 제공할 수 있게 됩니다.
    1단계와 2단계에 사용되는 변수
  • . 여기서 시나리오 단계와 순서를 편집하고 변경할 수 있습니다. 이 예제에서는 다음과 같이 진행됩니다:
    1. 텍스트 영역을 CSS 셀렉터 "#login"으로 자동으로 채워 넣습니다. 해당 텍스트 영역의 값은 변수 "login"에 의해 정의됩니다.
    2. 텍스트 영역을 CSS 셀렉터 "#password"로 자동으로 채워 넣습니다. 해당 텍스트 영역의 값은 변수 "password"에 의해 정의됩니다.
    3. 페이지에 제어 텍스트가 표시될 때까지 기다립니다. 해당 텍스트 영역의 값은 "Test passed with login"으로 영구 설정됩니다.

이제 템플릿을 저장하면 개발자 센터에 템플릿이 표시됩니다. 여기서 템플릿은 "Sandbox" 상태로, 해당 상태는 사용자면 사용할 수 있으며, API에서는 사용할 수 없음을 나타냅니다. 여기서 사용자는 직접 작업자처럼 새로 생성한 템플릿을 테스트해 볼 수 있습니다.

템플릿 테스트

이 시점부터 사용자는 Chrome 브라우저를 사용해야 합니다. 그리고 프로필 쿠키에 액세스할 수 있는 플러그인을 설치해야 하므로 이 브라우저에서 새 사용자 프로필을 생성할 것을 권장합니다.
작업자 인터페이스 예제
그런 다음, 템플릿 카드에서 "test" 버튼을 클릭합니다.
안내에 따라 플랫폼에 해당하는 플러그인을 다운로드합니다. 그런 다음 해당 플러그인을 적용하려면 페이지를 새로고침한 뒤 "login" 및 "password" 변수를 임의의 값으로 채우고 "Launch Test" 버튼을 클릭합니다. 그러면 다음과 같은 새 페이지가 열립니다:

주소 표시줄 부근을 보면 대상 페이지 상단에 플러그인이 추가된 파란색 바가 있으며, 이를 통해 작업자들은 할당된 작업을 파악하고 작업 실행을 제어할 수 있습니다.

다음으로, 변수 입력 시 로그인 및 비밀번호 영역이 숨겨져 있다는 점에 유의하시길 바랍니다. 작업자의 경우에는 개발자 콘솔을 통해 작업 데이터에 완전히 액세스할 수 있습니다만, 99.99%의 작업자는 굳이 이면에서 어떤 상황이 진행되고 있는지 검토하지 않으므로 의도적으로 숨겨져 있는 것입니다.
reCAPTCHA를 풀 때 "Sign In" 버튼을 클릭하면 템플릿의 최종 단계인 "WAIT_CONTROL_TEXT_PRESENT"를 통과하게 되며, 이에 따라 플러그인은 사용자의 템플릿에 영구적으로 정의된 "Test passed with login" 제어 문구를 검색합니다. 해당 과정을 거친 뒤에는 탭은 자동으로 닫히며 세션 스냅샷이 결과 영역에 표시됩니다.
결과 예제

여기서 동일한 스냅샷을 API에서 수신할 수 있습니다만, API에서 템플릿을 사용할 수 있도록 하려면, 우선 템플릿을 게시하여야 할 것입니다.

템플릿 게시

템플릿을 개시하려는 경우, 비공개 또는 공개 두 가지 옵션 중 하나를 선택하실 수 있습니다.
  • 비공개 템플릿의 경우, API 키로만 사용할 수 있으며, 다른 고객들은 사용할 수 없습니다. 해당 검토 및 게시 비용은 $1입니다.
  • 공개 템플릿의 경우, 모든 사람들이 사용할 수 있으며, 각 고객이 해당 템플릿에 지불하는 비용의 5%를 수수료로 얻게 됩니다. 또한, 템플릿에 문제가 발생할 경우를 대비하여, 고객들이 문의할 수 있도록 연락처를 남겨둬야 할 것입니다. 해당 검토 및 게시 비용은 $1입니다.
당사는 모든 템플릿을 신중하게 검토하고 있으며, 프로덕션 모드로 원활하게 전환하려면 다음과 같은 몇 가지 기본 요건을 충족하여야 합니다:
  • 어떠한 유형의 불법적인 활동이 있어서는 안 됩니다.
  • 기존의 템플릿을 복제하여 사용하여서는 안 됩니다.
  • 더미 템플릿이나 테스트 템플릿을 제출하여서는 안 됩니다.
  • 검토를 위해 예제 웹 주소와 변숫값을 제공하여야 하며, 당사가 테스트를 진행하여 모든 단계가 성공적으로 완료되었는지 확인할 것입니다.

API 요청

이상의 AntiGate 템플릿에 대하여 API에 작업 생성 요청은 다음과 같이 간단합니다:

curl -i -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -X POST -d '{
    "clientKey":"YOUR_API_KEY",
    "task":
        {
            "type":"AntiGateTask",
            "websiteURL":"https://anti-captcha.com/demo/?page=recaptcha_v2_textarea",
            "templateName":"Demo sign-in at anti-captcha.com #123456",
            "variables": {
                "login":"some value",
                "password":"some value"
            }
        }
}' https://api.anti-captcha.com/createTask

즉, "templateName" 및 "variables" 매개 변수를 넘겨주어, 템플릿을 채우는 것입니다.

작업 결과 사용

AntiGate 작업은 "cookies", "localStorage", "fingerprint", "url" 를 아우르는 솔루션을 반환합니다. 여기서 소프트웨어는 해당 요청에서 "쿠키"를 사용하여 "url"로 이동하고, 브라우저의 사용자 에이전트에 "fingerprint.self.navigator.userAgent" 값을 사용하는 작업을 수행하게 됩니다. 보다 복잡한 웹사이트에서는 일종의 최신 버전의 쿠키라 할 수 있는 localStorage에 중요한 데이터를 저장하며, 이 경우에는 실제로 자바스크립트를 실행하기에 앞서 해당 데이터를 페이지에 삽입하여야 합니다. 이러한 작업은 Puppeteer와 같은 개발 환경에서 수행할 수 있습니다. 이 주제는 별도의 문서로 다시 자세히 살펴보도록 하겠습니다.

자체 템플릿 생성

여기서 예제 템플릿을 불러올 필요 없이 위에 설명된 단계를 따라 하기만 하면 되며, 모든 세부 사항을 신중하게 입력하고 꼼꼼하게 단계를 추가하시기 바랍니다. 여기서 모든 단계는 순차적으로 실행되며, 플러그인은 현재 단계가 완료되어야 다음 단계의 실행을 진행한다는 점에 유의하시기 바랍니다. 그리고 언제든 템플릿을 저장하여 작업자의 브라우저 플러그인으로 테스트할 수 있으니 참고하시기 바랍니다.

비용

현재 당사는 작업 1,000건당 2달러로 가격을 책정하였습니다. 또한, 작업 실행이 진행되는 매 초마다 작업 가격의 1/60이 추가로 부과됩니다. 예컨대, 작업 비용이 0.002 달러이며, 작업자가 이를 푸는 데 20초 정도가 소요되었다고 가정해보도록 하겠습니다.
그러면 최종 비용은 0.00266달러 = 0.002 + (0.002 / 60 * 20)가 되겠습니다.