feat: add logic to solve simple captchas in addition to recaptchas

pull/163/head
Travis Fischer 2022-12-17 16:43:40 -06:00
rodzic 71de95ab97
commit 3e6db370ea
3 zmienionych plików z 44 dodań i 1 usunięć

Wyświetl plik

@ -44,6 +44,7 @@
"puppeteer-extra": "^3.3.4", "puppeteer-extra": "^3.3.4",
"puppeteer-extra-plugin-recaptcha": "^3.6.6", "puppeteer-extra-plugin-recaptcha": "^3.6.6",
"puppeteer-extra-plugin-stealth": "^2.11.1", "puppeteer-extra-plugin-stealth": "^2.11.1",
"random": "^4.1.0",
"remark": "^14.0.2", "remark": "^14.0.2",
"strip-markdown": "^5.0.0", "strip-markdown": "^5.0.0",
"uuid": "^9.0.0" "uuid": "^9.0.0"

Wyświetl plik

@ -21,6 +21,7 @@ specifiers:
puppeteer-extra: ^3.3.4 puppeteer-extra: ^3.3.4
puppeteer-extra-plugin-recaptcha: ^3.6.6 puppeteer-extra-plugin-recaptcha: ^3.6.6
puppeteer-extra-plugin-stealth: ^2.11.1 puppeteer-extra-plugin-stealth: ^2.11.1
random: ^4.1.0
remark: ^14.0.2 remark: ^14.0.2
strip-markdown: ^5.0.0 strip-markdown: ^5.0.0
tsup: ^6.5.0 tsup: ^6.5.0
@ -39,6 +40,7 @@ dependencies:
puppeteer-extra: 3.3.4_puppeteer@19.4.0 puppeteer-extra: 3.3.4_puppeteer@19.4.0
puppeteer-extra-plugin-recaptcha: 3.6.6_puppeteer-extra@3.3.4 puppeteer-extra-plugin-recaptcha: 3.6.6_puppeteer-extra@3.3.4
puppeteer-extra-plugin-stealth: 2.11.1_puppeteer-extra@3.3.4 puppeteer-extra-plugin-stealth: 2.11.1_puppeteer-extra@3.3.4
random: 4.1.0
remark: 14.0.2 remark: 14.0.2
strip-markdown: 5.0.0 strip-markdown: 5.0.0
uuid: 9.0.0 uuid: 9.0.0
@ -3224,6 +3226,13 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/random/4.1.0:
resolution: {integrity: sha512-6Ajb7XmMSE9EFAMGC3kg9mvE7fGlBip25mYYuSMzw/uUSrmGilvZo2qwX3RnTRjwXkwkS+4swse9otZ92VjAtQ==}
engines: {node: '>=14'}
dependencies:
seedrandom: 3.0.5
dev: false
/read-pkg-up/8.0.0: /read-pkg-up/8.0.0:
resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -3412,6 +3421,10 @@ packages:
is-regex: 1.1.4 is-regex: 1.1.4
dev: true dev: true
/seedrandom/3.0.5:
resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==}
dev: false
/semver/5.7.1: /semver/5.7.1:
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
hasBin: true hasBin: true

Wyświetl plik

@ -9,6 +9,7 @@ import type { Browser, Page, Protocol, PuppeteerLaunchOptions } from 'puppeteer'
import puppeteer from 'puppeteer-extra' import puppeteer from 'puppeteer-extra'
import RecaptchaPlugin from 'puppeteer-extra-plugin-recaptcha' import RecaptchaPlugin from 'puppeteer-extra-plugin-recaptcha'
import StealthPlugin from 'puppeteer-extra-plugin-stealth' import StealthPlugin from 'puppeteer-extra-plugin-stealth'
import random from 'random'
import * as types from './types' import * as types from './types'
@ -17,7 +18,6 @@ puppeteer.use(StealthPlugin())
let hasRecaptchaPlugin = false let hasRecaptchaPlugin = false
let hasNopechaExtension = false let hasNopechaExtension = false
const __filename = url.fileURLToPath(import.meta.url)
const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
/** /**
@ -129,6 +129,7 @@ export async function getOpenAIAuth({
await page.type('#username', email, { delay: 20 }) await page.type('#username', email, { delay: 20 })
await delay(100) await delay(100)
// NOTE: this is where you may encounter a CAPTCHA
if (hasNopechaExtension) { if (hasNopechaExtension) {
await waitForRecaptcha(page, { timeoutMs }) await waitForRecaptcha(page, { timeoutMs })
} else if (hasRecaptchaPlugin) { } else if (hasRecaptchaPlugin) {
@ -367,6 +368,8 @@ async function checkForChatGPTAtCapacity(
do { do {
try { try {
await solveSimpleCaptchas(page)
const res = await page.$x("//div[contains(., 'ChatGPT is at capacity')]") const res = await page.$x("//div[contains(., 'ChatGPT is at capacity')]")
isAtCapacity = !!res?.length isAtCapacity = !!res?.length
@ -446,6 +449,30 @@ async function waitForConditionOrAtCapacity(
}) })
} }
async function solveSimpleCaptchas(page: Page) {
try {
const verifyYouAreHuman = await page.$('text=Verify you are human')
if (verifyYouAreHuman) {
await delay(2000)
await verifyYouAreHuman.click({
delay: random.int(5, 25)
})
await delay(1000)
}
const cloudflareButton = await page.$('.hcaptcha-box')
if (cloudflareButton) {
await delay(2000)
await cloudflareButton.click({
delay: random.int(5, 25)
})
await delay(1000)
}
} catch (err) {
// ignore errors
}
}
async function waitForRecaptcha( async function waitForRecaptcha(
page: Page, page: Page,
opts: { opts: {
@ -453,6 +480,8 @@ async function waitForRecaptcha(
timeoutMs?: number timeoutMs?: number
} = {} } = {}
) { ) {
await solveSimpleCaptchas(page)
if (!hasNopechaExtension) { if (!hasNopechaExtension) {
return return
} }