Sitemap
Press enter or click to view image in full size

Bypassing CAPTCHAs with Headless Chrome

9 min readDec 3, 2018

--

Press enter or click to view image in full size
Amazon’s CAPTCHA fallback
Press enter or click to view image in full size

How 2Captcha works

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

Automating with Puppeteer

Using Puppeteer

$ npm install puppeteer
const puppeteer = require('puppeteer');const chromeOptions = {
headless:false,
defaultViewport: null};
(async function main() {
const browser = await puppeteer.launch(chromeOptions);
const page = await browser.newPage();
await page.goto('https://old.reddit.com/login');
})()
Press enter or click to view image in full size
await page.type('#user_reg', 'some_username');
await page.type('#passwd_reg', 'SuperStrongP@ssw0rd');
await page.type('#passwd2_reg', 'SuperStrongP@ssw0rd');
await page.click('#register-form button[type=submit]');
Press enter or click to view image in full size
const chromeOptions = {
headless:false,
defaultViewport: null,
slowMo:10,
};

Wiring up 2Captcha

Press enter or click to view image in full size
const formData = {
method: 'userrecaptcha',
key: apiKey, // your 2Captcha API Key
googlekey: '6LeTnxkTAAAAAN9QEuDZRpn90WwKk_R1TRW_g-JC',
pageurl: 'https://old.reddit.com/login',
json: 1
};
const response = await request.post('http://2captcha.com/in.php', {form: formData});const requestId = JSON.parse(response).request;
`http://2captcha.com/res.php?key=${apiKey}&action=get&id=${reqId}`;
async function pollForRequestResults(
key,
id,
retries = 30,
interval = 1500,
delay = 15000
) {
await timeout(delay);
return poll({
taskFn: requestCaptchaResults(key, id),
interval,
retries
});
}
function requestCaptchaResults(apiKey, requestId) {
const url = `http://2captcha.com/res.php?key=${apiKey}&action=get&id=${requestId}&json=1`;
return async function() {
return new Promise(async function(resolve, reject){
const rawResponse = await request.get(url);
const resp = JSON.parse(rawResponse);
if (resp.status === 0) return reject(resp.request);
resolve(resp.request);
});
}
}
const timeout = millis => new Promise(resolve => setTimeout(resolve, millis))
const response = await pollForRequestResults(apiKey, requestId);
const js = `document.getElementById("g-recaptcha-response").innerHTML="${response}";`
await page.evaluate(js);

What can you do now?

--

--

Jarrod Overson
Jarrod Overson

Written by Jarrod Overson

I write about JavaScript, Rust, WebAssembly, Security. Also a speaker, O'Reilly Author, creator of Plato, CTO @Candle