Commit 3e6db370 authored by Travis Fischer's avatar Travis Fischer

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

parent 71de95ab
...@@ -21,6 +21,7 @@ specifiers: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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
......
...@@ -9,6 +9,7 @@ import type { Browser, Page, Protocol, PuppeteerLaunchOptions } from 'puppeteer' ...@@ -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()) ...@@ -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({ ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -453,6 +480,8 @@ async function waitForRecaptcha(
timeoutMs?: number timeoutMs?: number
} = {} } = {}
) { ) {
await solveSimpleCaptchas(page)
if (!hasNopechaExtension) { if (!hasNopechaExtension) {
return return
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment