Skip to content

Instantly share code, notes, and snippets.

@2captcha
Last active August 13, 2020 10:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 2captcha/caada70373fa0dd838a71d6352c8dc0f to your computer and use it in GitHub Desktop.
Save 2captcha/caada70373fa0dd838a71d6352c8dc0f to your computer and use it in GitHub Desktop.
const puppeteer = require('puppeteer-extra')
const { getToken, reportAnswer } = require('./solver.js') // get it here https://gist.github.com/2captcha/e5e8b0cc3ee1c6865a40d4d772d12c1a
const targetUrl = 'https://www.google.com/search?q=kurwa&num=100'
const testSettings = {
numOfBrowsers: 1, //number of browser instances to launch
interval: 10, // interval between launch of each instance in seconds
headless: false,
ua: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}
const proxy = {
ip: '1.2.3.4',
port: 1234,
protocol: 'http',
username: 'login',
password: 'password',
uri() { return `${this.protocol}://${this.ip}:${this.port}` },
proxyType() { return this.protocol.toUpperCase() },
proxyString() { return `${this.username}:${this.password}@${this.ip}:${this.port}`.toString() }
}
let cookiesToString = (cookies) => {
let cookiesArray = cookies.map((cookie) => {
if (cookie.name !== 'test_cookie') {
return `${cookie.name}:${cookie.value}`
}
})
return cookiesArray.join(';')
}
const browserParams = {
headless: testSettings.headless,
slowMo: 123,
devtools: false,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
`--proxy-server=${proxy.uri()}`
]
}
let doThatSingle = async (browser) => {
let pageParams = []
const [page] = await browser.pages()
await page.authenticate({
username: proxy.username,
password: proxy.password
})
page.on('request', async (r) => {
if (r.url().includes('https://www.gstatic.com/recaptcha/') || r.url().includes('https://www.google.com/recaptcha/api.js')) {
r.abort()
} else {
r.continue()
}
})
const getCaptchaParams = async () => {
return await page.evaluate(async () => {
return await new Promise((resolve, reject) => {
resolve({
sitekey: document.querySelector('#recaptcha').dataset.sitekey,
callback: document.querySelector('#recaptcha').dataset.callback,
datas: document.querySelector('#recaptcha').dataset.s,
q: document.querySelector('input[name=q]').value,
url: document.querySelector('#recaptcha').baseURI
})
})
})
}
await page.setViewport({
width: 1200,
height: 1000
})
await page.setUserAgent(testSettings.ua)
await page.setRequestInterception(true)
await page.waitFor(2000)
try {
await page.goto('https://google.com/')
} catch (e) {
await page.waitFor(1000)
await page.goto('https://google.com/')
}
await page.waitFor(1000)
await page.goto(targetUrl)
let intervalId = setInterval(async () => {
try {
await page.waitForSelector('#recaptcha', { timeout: 1000 })
clearInterval(intervalId)
let allCookies = await page._client.send('Network.getAllCookies')
let cookiesString = cookiesToString(allCookies.cookies)
await page.waitFor(1000)
let captchaParams = await getCaptchaParams()
try {
let captcha = await getToken({
googlekey: captchaParams.sitekey,
datas: captchaParams.datas,
pageurl: captchaParams.url,
cookies: cookiesString,
userAgent: testSettings.ua,
proxy: proxy.proxyString(),
proxytype: proxy.proxyType()
})
let nextUrl = captchaParams.url + '&g-recaptcha-response=' + captcha.token
let finalResponse = await page.goto(nextUrl)
console.log(`Response status: ${finalResponse.status()}`)
if (finalResponse.status() === 200) {
console.log('Hooray!')
await reportAnswer(captcha.id, true)
} else {
console.log('Fail :(')
// Rotate proxy and try again
await reportAnswer(captcha.id, false)
}
await page.close()
await browser.close()
} catch (e) {
await page.close()
await browser.close()
}
} catch (e) {
await page.goto(targetUrl)
}
}, 2000)
}
for (i = 0; i < testSettings.numOfBrowsers; i++) {
setTimeout(() => {
puppeteer.launch(browserParams).then((browser) => {
doThatSingle(browser).catch(e => {
console.log(e)
})
})
}, i * testSettings.interval * 1000)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment