我要直奔主题了。我正在尝试使用 2captcha 的 API 绕过 Twitch 的登录功能。一切正常:我的机器人与 2captcha 通信的速度足够快,验证码不会超时,并且我的机器人接收到验证验证码和登录所需的令牌,除了没有提交按钮来实际登录。据我所知,我浏览了所有关于此问题的 Github 帖子、每个 stackoverflow 帖子,我能找到的最佳解决方案是查看 devtools 中的 Google Network 选项卡以查找手动调用的函数将模拟一个按钮并让您通过验证码。由于我有限的编码能力,我能够找到一个引用 ArkoseEnforcement 和“回调”这个词的函数,我相信这是我想要找到的。在尝试清除源选项卡和网络选项卡后,我能找到的最好的是:
我一直在尝试实现这个功能一个小时但没有成功,我还尝试查看“回调”和“ArkoseEnforment.funcaptcha_events”等。
我真的不知道如何将它们实现到我的代码中,我将不胜感激关于从哪里开始的任何帮助。
//require packages
require('dotenv').config(); const fs = require('fs'); const puppeteer = require('puppeteer'); const https = require('https');
//define varibles
var usernames = []; var pkValue; var surl = process.env.SURL ; var pk = process.env.PUBLICKEY ; var api = process.env.APIKEY;
const readFile = fs.readFileSync("accounts.txt").toString().split("\n");
//read accounts
console.log(`Reading ${readFile.length} lines.`);
for(i in readFile) {
(readFile[i].toLowerCase().startsWith("u") ? usernames.push(readFile[i].slice(10).replace("\r", "")) : null);
}
//get captcha
//retreive stream keys
async function getKey(username) {
const browser = await puppeteer.launch({headless:false}); const page = await browser.newPage(); const navigationPromise = page.waitForNavigation()
//get captcha
function getCaptcha(captchaID) {
https.get(`https://2captcha.com/res.php?key=${api}&action=get&id=${captchaID.slice(3)}`, (response) => {
var dataRes = '';
response.on('data', (chunk) => {
dataRes += chunk;
})
response.on('end', () => {
if (dataRes.toLowerCase()==="capcha_not_ready") {
setTimeout(() => {getCaptcha(captchaID)}, 5000)
}
else {
pkValue = dataRes.slice(3)
console.log(pkValue);
page.evaluate((pkValue) => {
//add token to val
document.querySelector('#FunCaptcha-Token').value = pkValue;
//submit form
//somehow need to submit the form here.
}, pkValue)
}
})
})
}
await page.goto(`https://dashboard.twitch.tv/u/${username}/settings/stream`, { waitUntil: ['networkidle2'] })
await page.setViewport({ width: 1920, height: 880 })
await page.waitForSelector('.sc-AxjAm #login-username')
await page.click('.sc-AxjAm #login-username')
await page.type('.sc-AxjAm #login-username', username)
await page.waitForSelector('.sc-AxjAm #password-input')
await page.click('.sc-AxjAm #password-input')
await page.type('.sc-AxjAm #password-input', process.env.PASSWORD)
await page.waitForSelector('.sc-AxjAm > .sc-AxjAm:nth-child(3) > .ScCoreButton-sc-1qn4ixc-0 > .ScCoreButtonLabel-lh1yxp-0 > .sc-AxjAm', {visible:true})
await page.click('.sc-AxjAm > .sc-AxjAm:nth-child(3) > .ScCoreButton-sc-1qn4ixc-0 > .ScCoreButtonLabel-lh1yxp-0 > .sc-AxjAm')
await page.waitForSelector('#FunCaptcha-Token')
//request 2captcha funcaptcha
await https.get(`https://2captcha.com/in.php?key=${api}&method=funcaptcha&publickey=${pk}&surl=${surl}&pageurl=https://dashboard.twitch.tv/u/${username}/settings/stream`, (response) => {
var data = '';
response.on('data', (chunk) => {
data += chunk;
})
response.on('end', () => {
setTimeout(() => {getCaptcha(data)}, 20000)
})
})
.on('error', (e) => {
console.log(e);
})
await page.waitForSelector('.sc-AxjAm:nth-child(2) > .sc-AxjAm > .ScCoreButton-sc-1qn4ixc-0 > .ScCoreButtonLabel-lh1yxp-0 > .sc-AxjAm', {visible:true,timeout:0})
var streamkey = await page.evaluate(() => document.querySelector('.sc-AxjAm:nth-child(2) > .sc-AxjAm > .ScCoreButton-sc-1qn4ixc-0 > .ScCoreButtonLabel-lh1yxp-0 > .sc-AxjAm').innerHTML);
await navigationPromise
await fs.appendFile('userkeys.txt', `${username}:${streamkey}`, e => console.log(`error: ${e}`))
}
console.log(`Getting keys.`);
(async () => {
for(i in usernames) {
await getKey(usernames[i]);
}
})();
//https://dashboard.twitch.tv/u/stokeshester/settings/stream trying to login as soon as I enter this link
这是我的代码记录 funcaptcha 的“tc-token”值的示例:
这是验证码界面的样子(无按钮):