Menu

Obejście Recaptcha V2 z NodeJS i Puppeteer


Czego się dowiesz

  • Zainstaluj NodeJS i Webstorm IDE w świeżej instalacji Ubuntu OS.
  • Zainstaluj i zaimportuj moduły npm anticaptchaofficial i puppeteer.
  • Dowiesz się jak przesłać formularz ten z Recaptcha za pomocą skryptu NodeJS.
  • Dowiedz się jak pisać skrypty puppeteer, które otwierają Chromium w tle i ładują daną stronę.
  • Dowiedz się jak zrobić zrzut ekranu strony i zapisać go na dysku.
  • Dowiedz się jak wypełnić formularz za pomocą selektorów CSS.
  • Dowiedz się jak rozwiązywać Recaptcha v2, wypełniać ukryte pola textarea #g-recaptcha-response i przesyłać formularze.
  • Poszerz swoją wiedzę o Javascript ES6 i NodeJS.
Source code

Zainstaluj NodeJS i Webstorm IDE w świeżej instalacji Ubuntu OS.

  • Ubuntu OS: Instalacja Ubuntu OS nie jest wymogiem, ale zaleceniem. Uruchomienie NodeJS z Windows jest również możliwe, ale nasz kod może nie być kompatybilny.
  • Node JS: Pobierz NodeJS dla swojego systemu operacyjnego tutaj
  • Edytor kodu: Zalecane VS Code lub Atom. Oba są darmowymi IDE.

Zainstaluj curl i nodejs w Ubuntu:

apt update
apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt install -y nodejs

Zainstaluj i zaimportuj moduły npm anticaptchaofficial i puppeteer.

Zainstaluj moduły anti-captcha i Puppeteer npm:

npm install @antiadmin/anticaptchaofficial puppeteer

Utwórz nowy plik index.js i dodaj następujące elementy. Zamień "YOUR_API_KEY" na swój klucz z Ustawienia API :

const ac = require("@antiadmin/anticaptchaofficial");
      const pup = require("puppeteer");
      ac.setAPIKey('YOUR_API_KEY');

Dowiedz się jak pisać skrypty puppeteer, które otwierają Chromium w tle i ładują daną stronę.

Dodaj następujący kod, aby najpierw rozwiązać captcha, następnie wypełnić formularz z loginem i hasłem, wkleić g-response token do textarea z id="g-recaptcha-response" i przesłać formularz:

const login = 'mylogin';
const password = 'my strong password';

(async () => {

    console.log('solving recaptcha ...');
    let token = await ac.solveRecaptchaV2Proxyless('https://anti-captcha.com/demo?page=recaptcha_v2_textarea', '6LfydQgUAAAAAMuh1gRreQdKjAop7eGmi6TrNIzp');
    if (!token) {
        console.log('something went wrong');
        return;
    }

    console.log('opening browser ..');
    const browser = await pup.launch();

    console.log('creating new tab ..');
    const tab = await browser.newPage();

    console.log('changing window size .. ');
    await tab.setViewport({ width: 1360, height: 1000 });

    console.log('opening target page ..');
    await tab.goto('https://anti-captcha.com/demo?page=recaptcha_v2_textarea', { waitUntil: "networkidle0" });

    console.log('filling login input ..');
    await tab.$eval('#contentbox > form > div > div:nth-child(1) > span > input', (element, login) => {
        element.value = login;
    }, login);

    console.log('filling password input');
    await tab.$eval('#contentbox > form > div > div:nth-child(2) > span > input', (element, password) => {
        element.value = password;
    }, password);

    console.log('setting recaptcha g-response ...');
    await tab.$eval('#g-recaptcha-response', (element, token) => {
        element.value = token;
    }, token);

    console.log('submitting form .. ');
    await Promise.all([
        tab.click('#contentbox > form > div > div.tac.padding20px > button'),
        tab.waitForNavigation({ waitUntil: "networkidle0" })
    ]);

    console.log('making a screenshot ...');
    await tab.screenshot({ path: 'screenshot.png' });

    console.log('closing browser .. ');
    await browser.close();

})();

Można zauważyć, że najpierw rozwiązujemy captcha, a dopiero potem przechodzimy na stronę i wklejamy wynik. Działa to w przypadku Recaptcha, ponieważ znamy już sitekey i lifetime tokena wynosi 120 sekund.

Zrzut ekranu strony końcowej zapisujemy do pliku screenshot.png. Jeśli chcesz zobaczyć, co dzieje się w przeglądarce, wyłącz tryb bezgłowy:

console.log('opening browser ..');
//const browser = await pup.launch();
const browser = await pup.launch({ headless: false });

Poszerz swoją wiedzę o Javascript ES6 i NodeJS.

Dowiedziałeś się jak ominąć formularz z Recaptcha V2 w najprostszy sposób - z "g-recaptcha-response" textarea jako częścią formularza. Być może chcesz rozszerzyć swoją wiedzę:

Github

https://github.com/anti-captcha/solving-captcha-concepts/blob/master/tutorial1.js