Как я заставил Нейросеть написать рабочий код для решения Waf Амазон капчи не имея опыта в разработке

Наверное ни для кого не секрет, что нейросети сейчас обложены со всех сторон правилами и запретами и заставить ее написать для тебя скрипт, который будет обходить капчу с нуля просто нереально. По крайней мере я так думал, до этого дня.

Небольшой эпиграф — если в инструкции — как решить Амазон капчу джун может ногу сломить — можно вместо навыка Гугления применить навык — «спросить нейросеть».

Да, времена поменялись, и очень стремительно, теперь чтобы получить работающий код не обязательно унижаться на Стаке, выслушивая какое ты ничтожество, и уже не нужно прикидываться девушкой разработчиком, чтобы получить ответы на свои вопросы. Если уметь правильно их задавать. вы можете получить ответы у Нейросети.

Собственно к чему все это? Да к тому, что когда мне потребовалось решить капчу от Амазон, пресловутую Waf Captcha я пошел копать на сервис, которым постоянно пользуюсь при работе с Кей Коллектором, и некоторыми другими сервисами (Рукапча).

Ну и нашел там инструкцию, ссылку на которую собственно и привел выше. Как вам вероятно стало понятно из эпиграфа — для меня инструкция оказалось сложна для восприятия, вернее я понял, что надо использовать АПИ, но на этом все…

С Селениумом было реально проще.

Главная проблема при распознавании Waf Amazon captcha — малый таймаут, который выделяется на решение со стороны Амазона. Время на решение капчи ограничено и если ответа нет, то капча обновляется (у нее обновляются 2 параметра — iv и context).

Получается, что время жизни капчи ограничено примерно 30 секундами, в течение которых нужно успеть найти параметры на веб-странице, скопировать их, вставить в скрипт и запустить его, чтобы сервис 2капча мог решить капчу и вернуть корректный ответ. Я пытался справиться с этой задачей в течение пары часов, пытаясь выработать быстроту действий, но, к сожалению, на поиск и замену изменяемых параметров уходит не меньше 12-15 секунд. Таким образом, остается лишь 15-18 секунд на решение капчи сервисом, что для Амазон капчи кажется довольно нереалистичным.

Здесь требуется другая стратегия: поиск и вставка параметров должны выполняться автоматически скриптом. Однако, как человеку, который не сталкивался с чем-то более сложным, чем Ahrefs, написать такой скрипт?

Как я заставил Нейросеть написать рабочий код для решения Waf Амазон капчи не имея опыта  в разработке

Именно поэтому, на мой взгляд, инструкции, должны быть более детализированными, а не сводиться к фразам вроде "Просто используй API, разве ты не понимаешь?".

Решение было найдено мной за примерно три часа. И вот как новичку можно автоматизировать решение Amazon капчи.

Для этого нам потребуется GPT Chat и, в моем случае, это была премиум версия, так как она умеет изучать картинки (скриншоты) и собственно какая то инструкция по решению капчи в текстовом или видео формате.

Инструкции я не нашел, но нашел короткое видео, в котором показан процесс распознавания капчи Амазон на полном автомате, и все. Никакого пояснения и тем более текстового описания у меня не было.

Я получил видео от знакомого программиста, который запретил его публиковать, поскольку оно не анонимизировано. И, к слову, времени объяснить мне принцип работы скрипта, показанного на видео, у него тоже не было, поэтому и родился этот текст.

Давайте разберемся по порядку:

Я взял видео, сделал три скриншота и загрузил их в GPT Chat, попросив его преобразовать эти скриншоты в текстовый код.

На видео было видно, что в папке содержится несколько файлов, но показано содержимое только двух — index. js и inject. js. С них я и начал.

Чтобы не утомлять вас как именно я собирал код из скриншотов (пришлось немного повозиться, чтобы собрать код в единое целое), я покажу уже готовый код, который Чат собрал из разных кусочков:

// index.js import { launch } from 'puppeteer' import { Captcha } from '2captcha-ts' import { readFileSync } from 'fs' const solver = new Captcha(process.env.APIKEY) const target = 'УРЛ сайта где встречается капча' const example = async () => { const browser = await launch({ headless: false, devtools: true }) const [page] = await browser.pages() const preloadFile = readFileSync('./inject.js', 'utf8') await page.evaluateOnNewDocument(preloadFile) // Here we intercept the console messages to catch the message logged by inject.js script page.on('console', async (msg) => { const txt = msg.text() if (txt.includes('intercepted-params:')) { const params = JSON.parse(txt.replace('intercepted-params:', '')) const wafParams = { pageurl: target, sitekey: params.key, iv: params.iv, context: params.context, challenge_script: params.challenge_script, captcha_script: params.captcha_script } console.log(wafParams) try { console.log('Solving the captcha...') const res = await solver.solveRecaptchaV2(wafParams) console.log(`Solved the captcha ${res.id}`) console.log(res) console.log('Using the token...') await page.evaluate(token => { window.localStorage.inputCaptchaToken(token) }, res.data.captcha.voucher) console.log(e) } catch (e) { console.log(e) } } }) await page.goto(target) // Additional code to interact with the page after captcha is solved might be here... } example()
// inject.js console.clear = () => console.log('Console was cleared') const i = setInterval(() => { if (window.CaptchaScript) { clearInterval(i) let params = gokProps Array.from(document.querySelectorAll('script')).forEach(s => { const src = s.getAttribute('src') if (src && src.includes('captcha.js')) params.captcha_script = src if (src && src.includes('challenge.js')) params.challenge_script = src }) console.log('intercepted-params: ' + JSON.stringify(params)) } }, 5)

Естественно, я уточнил у Чата, как мне заставить код работать, на что получил рекомендацию использовать стандартную команду

node index.js

Но я же в этих ваших интернетах уже очень долго и понимаю, что код просто так не заработает, если на компе не установленно нужных библиотек, мой нейроконсультант и тут мне помог

Изучив код, который я дал ему в виде скриншотов, он порекомендовал установить следующие пакеты

Единственно, я не совсем понял, нафига тут нужен playwright, но кто я такой, чтобы сомневаться в компетенции Чата.

И соответсвенно код установки npm install puppeteer 2captcha-ts playwright (правда у меня через VS Code не получилось их поставить все вместе, вероятно виной всему кривые руки, я ставил по одному и через консоль)

npm install puppeteer
npm install 2captcha-ts
npm install playwright

Дальше интереснее, так как все что было до этого этапа я так или иначе знаю, а вот следующий блок для меня реально темный лес и я просто делаю то, что говорит мне мой нейроконсультант.

Итак, для корректной работы кода понадобился файл с кодировкой. env, причем он может быть без названия, а в этом файле должны быть следующие данные:

APIKEY=your_2captcha_api_key

Понятно, что вместо параметра your_2captcha_api_key я подставил свой ключ с сервиса.

Дальше было еще 6 рекомендаций, что надо делать чтобы код заработал, но

Как я заставил Нейросеть написать рабочий код для решения Waf Амазон капчи не имея опыта  в разработке

Соответсвенно после первого запуска магии не случилось, ничего не заработало, очень страноо, скажете вы…

Как я заставил Нейросеть написать рабочий код для решения Waf Амазон капчи не имея опыта  в разработке

Первая ошибка была связана с использованием синтаксиса ES6 import в Node. js. Для его использования нужно либо указать тип модуля в package. json, либо изменить расширение файла на. mjs.

Мне было лень указывать тип модуля в package. json и я пошел по пути наименьшего сопротивления, тупо переименовал расширение файла index с js на mjs.

Следующая ошибка была связана с подключаемым пакетом 2captcha-ts, но подробно описывать их не хочется, скажу лишь что я изменил код, отвечающий за запуск этого модуля несколько раз, добавил логирование и проверку корректности подключения файла. env.

И это все равно не сработало, скрипт продолжал выдавать ошибку за ошибкой и упорно не хотел работать. Я сравнил скриншот и код который мне вытащил оттуда Чат и нашел небольшую опечатку, которая и была корнем проблемы.

Но, как оказалось, и это не помогло — выпала ошибка apikey is not defined in. env file

Это мы пофиксили добавлением нового пакета:

npm install dotenv

После этого встреилось еще пару опечаток, которые Чат пытался решить через изменения структуры кода, но надо было просто внимательно сравнить скриншот и сам код.

И в конце концов код файла index. js из вот такого:

// index.js import { launch } from 'puppeteer' import { Captcha } from '2captcha-ts' import { readFileSync } from 'fs' const solver = new Captcha(process.env.APIKEY) const target = 'УРЛ сайта где встречается капча' const example = async () => { const browser = await launch({ headless: false, devtools: true }) const [page] = await browser.pages() const preloadFile = readFileSync('./inject.js', 'utf8') await page.evaluateOnNewDocument(preloadFile) // Here we intercept the console messages to catch the message logged by inject.js script page.on('console', async (msg) => { const txt = msg.text() if (txt.includes('intercepted-params:')) { const params = JSON.parse(txt.replace('intercepted-params:', '')) const wafParams = { pageurl: target, sitekey: params.key, iv: params.iv, context: params.context, challenge_script: params.challenge_script, captcha_script: params.captcha_script } console.log(wafParams) try { console.log('Solving the captcha...') const res = await solver.solveRecaptchaV2(wafParams) console.log(`Solved the captcha ${res.id}`) console.log(res) console.log('Using the token...') await page.evaluate(token => { window.localStorage.inputCaptchaToken(token) }, res.data.captcha.voucher) console.log(e) } catch (e) { console.log(e) } } }) await page.goto(target) // Additional code to interact with the page after captcha is solved might be here... } example()

Превратился в вот такой index. mjs

// index.mjs import 'dotenv/config'; import { launch } from 'puppeteer' import Captcha from '2captcha-ts'; import { readFileSync } from 'fs' // Проверка наличия APIKEY в .env if (!process.env.APIKEY) { console.error("APIKEY is not defined in .env file"); process.exit(1); // Завершение выполнения, если ключ не найден } const solver = new Captcha.Solver(process.env.APIKEY); const target = 'УРЛ сайта где встречается капча' const example = async () => { const browser = await launch({ headless: false, devtools: true }) const [page] = await browser.pages() const preloadFile = readFileSync('./inject.js', 'utf8') await page.evaluateOnNewDocument(preloadFile) // Here we intercept the console messages to catch the message logged by inject.js script page.on('console', async (msg) => { const txt = msg.text() if (txt.includes('intercepted-params:')) { const params = JSON.parse(txt.replace('intercepted-params:', '')) const wafParams = { pageurl: target, sitekey: params.key, iv: params.iv, context: params.context, challenge_script: params.challenge_script, captcha_script: params.captcha_script } console.log(wafParams) try { console.log('Solving the captcha...') const res = await solver.amazonWaf(wafParams) console.log(`Solved the captcha ${res.id}`) console.log(res) console.log('Using the token...') await page.evaluate(async (token) => { await ChallengeScript.submitCaptcha(token); window.location.reload () }, res.data.captcha_voucher); } catch (e) { console.log(e) } } else { return } }) await page.goto(target) // Additional code to interact with the page after captcha is solved might be here... } example()

В коде выше не забудьте подставить верный урл, где требуется решение (если будете применять).

А из вот такого inject. js

console.clear = () => console.log('Console was cleared') const i = setInterval(() => { if (window.CaptchaScript) { clearInterval(i) let params = gokProps Array.from(document.querySelectorAll('script')).forEach(s => { const src = s.getAttribute('src') if (src && src.includes('captcha.js')) params.captcha_script = src if (src && src.includes('challenge.js')) params.challenge_script = src }) console.log('intercepted-params: ' + JSON.stringify(params)) } }, 5)

В вот такой inject. js

// console.clear = () => console.log('Console was cleared') let counter = 0; const MAX_ATTEMPTS = 2000; // Примерно 10 секунд при интервале в 5 мс console.log('Начинаем поиск CaptchaScript...'); const i = setInterval(() => { console.log(`Попытка ${counter}: Проверяем наличие CaptchaScript...`); if (window.CaptchaScript || counter > MAX_ATTEMPTS) { clearInterval(i); if (!window.CaptchaScript) { console.log('CaptchaScript не найден'); } else { console.log('CaptchaScript найден'); let params = gokuProps; Array.from(document.querySelectorAll('script')).forEach(s => { const src = s.getAttribute('src'); if (src && src.includes('captcha.js')) params.captcha_script = src; if (src && src.includes('challenge.js')) params.challenge_script = src; }); console.log('intercepted-params: ' + JSON.stringify(params)); } } counter++; }, 5);

И скрипт заработал. Вот прям совсем. Решил капчу и продолжает ее решать при каждом запуске.

Получается будущее наступило, старик. Но это не точно.

Что вам делать с этой информацией? Ну, блин, мне очень нравиться совет — живи теперь с этим. Но, советы раздавать не хочется. Смотрите сами, может пригодится кому для своих проектов…

Начать дискуссию