免责声明:
亲爱的追随者们!
我们想分享一篇很有独到见解的文章,详细介绍了在亚马逊平台上解答验证码的有效方法。虽然这篇文章不是我们撰写的,但我们认为与社区分享有价值的信息非常重要。我们希望这篇文章对您有所帮助和启发!
引言---如果您正在制作教学,那么将其执行到底,否则对于初级开发者,如何解决亚马逊验证码上的说明非常难以理解。
这是怎么回事?当我需要解决亚马逊的验证码(臭名昭著的Waf验证码)时,我开始在GSA Ranker和其他一些服务(2captcha)工作时经常使用的服务中查找信息。
我在那里找到了说明,并在上面贴了链接。正如您可能会从引言中理解的那样,我什么都不明白,或者更确切地说,我明白需要使用API,但仅此而已......
有了Selenium就容易多了
主要问题是亚马逊方给出的解答方案超时时间太短。解答验证码的时间有限,如果没有响应,验证码就会刷新(它的两个参数将会更新---iv和上下文)
结果证明验证码刷新超时大约为30秒,在这段时间内,您需要找到页面上的参数并复制粘贴到脚本代码中,然后运行。之后,2captcha应该会求解并返回正确答案。我尝试这样做了几个小时但毫无结果,制定了一套常规动作;但是,唉,搜索和替换不断变化的参数至少需要12-15秒,只剩下15-18秒的时间让该服务解答验证码,这在当前现实中听起来相当不可思议。
在此我们需要一种不同的方法,脚本应该搜索并插入参数,但是一个一生中从未处理过比Ahrefs更复杂的事情的人怎么能编写它呢?这就是为什么我认为像文章中提到的那些教学需要更详细,而不仅仅是"只需使用API,你是笨蛋吗?"
解决办法
找到所有的解答方案后,我花了大约3个小时。让我告诉你一名初级开发者如何完全自动化解答亚马逊验证码。
你需要GPT Chat,就我的情况来说,还需要视频识别亚马逊验证码(你不需要这个,因为我会给你现成的文件)。
我从一名程序员朋友那里得到了这段视频,但他不允许我公开,因为视频没有匿名。 然而,你会不停地唠叨问我要证据,然后我就会因为没有人相信而服用抗抑郁药物,所以我在最后拿到最终脚本时重制了这段视频,并很乐意将其附在本文末尾,以展示我对观众的无尽奉献!
那么,让我们一步一步来。
我拍了视频,做了3张截图,上传到GPT Chat,并让它帮我把这段代码转写成文字。
该视频包含若干文件,但只显示了其中两个文件的内容---index.js和inject.js---就是我开始的地方。 我就不赘述破译截图的细节了(将截图中的代码编译成一个单元有点麻烦,但最终我得到了这两个文件的两段代码:
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 = 'URL of website where you faced CAPTCHA'
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
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)
我询问Chat如何让代码工作,建议我使用标准命令。
node index.js
但我已经在这些互联网街道上呆了很长时间,明白如果必要的库没有安装在计算机上,代码就不会工作。在这个问题上我的神经顾问也帮了忙。
检查代码后,我以截图的形式发送给他,他建议安装以下包:
因此,安装代码是npm install puppeteer 2captcha-ts(虽然我无法使用VS Code将它们全部一起安装,可能是因为我的手太笨拙了,但我使用控制台挨个安装)。
npm install puppeteer
npm install 2captcha-ts
接下来才是有趣的地方,因为到目前为止,我对所有事情都有所了解,但下一步对我来说是一个真正的谜,我只是按照我的神经顾问告诉我的去做。
因此,为了使代码正确运行,需要使用扩展名为.env的文件。它可以不命名,但应包含以下数据:
APIKEY=your_2captcha_api_key
据了解,我从服务中插入了自己的密钥,而非"your_2captcha_api_key"参数。
关于如何使代码工作还有6条建议,但是......
第一次运行和第一个错误发生了。
该错误与在Node. js中使用语法ES6导入有关。要使用它,您需要在package.json中指定模块类型或将文件扩展名更改为.mjs。
我懒得在package.json中指定模块类型,所以我选择了阻力最小的方法,简单地将文件扩展名从.js更改为.mjs。
下一个错误与导入的package 2captcha-ts包有关,但我并不想详细讨论它。只想说我修改了负责运行该模块的代码几次,添加了日志记录,并检查了连接.env文件的正确性。
尽管如此,它还是不起作用。脚本不断出现错误并顽固地拒绝运行。我比较了截图和Chat从中提取的代码,发现了一处小小的输入错误,这就是问题的根源。
事实证明,即使这样也无济于事---出现了一个错误:.env文件中未定义APIKEY
我们通过添加新的包修复了此问题:
dotenv npm install dotenv
之后,我又遇到了几处输入错误,Chat试图通过改变代码结构来解决,但我只需要仔细比较截图和代码本身。
最终,index.js文件的代码如下所示:
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 = 'URL of website where you faced CAPTCHA'
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
js
// index.js
import 'dotenv/config';
import { launch } from 'puppeteer'
import Captcha from '2captcha-ts';
import { readFileSync } from 'fs'
if (!process.env.APIKEY) {
console.error("APIKEY is not defined in .env file");
process.exit(1); // Terminate execution if key not found
}
const solver = new Captcha.Solver(process.env.APIKEY);
const target = 'URL of website where you faced CAPTCHA'
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()
在上面的代码中,别忘了在需要解决方案的地方替换正确的URL(如果您决定应用它)。
从这个inject.js:
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:
js
// console.clear = () => console.log('Console was cleared')
let counter = 0;
const MAX_ATTEMPTS = 2000; // Approximately 10 seconds at 5 ms intervals
console.log('Let's start searching for CaptchaScript...');
const i = setInterval(() => {
console.log(`Attempt ${counter}: Checking for CaptchaScript...`);
if (window.CaptchaScript || counter > MAX_ATTEMPTS) {
clearInterval(i);
if (!window.CaptchaScript) {
console.log('CaptchaScript not found');
} else {
console.log('CaptchaScript found');
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);
终于,脚本运行了。完整地运行。它解答了验证码,并在每次运行时继续解答。
www.bilibili.com/video/BV1RV...
看来未来已经到来了,伙计。但这并不确定。
如何处理这些信息?好吧,该死的,我真的很喜欢这个建议---现在就接受它吧。但是我不想提供建议。用你的方式来,也许有人会发现这对他们的项目有用......
有关验证码识别的更多提示和技巧,请务必查看我们的BiliBili频道,我们将深入研究这一主题。此外,您可以在我们的GitHub资源库中找到更多现成的解决方案。敬请关注更多独到见解内容和更新!