Puppeteer:如何在没有提交按钮的情况下绕过 FUNCAPTCHA

问题描述

我将进入正题。我正在尝试使用 2captcha 的 API 绕过 Twitch 的登录 funcaptcha。一切正常:我的机器人与 2captcha 通信的速度足够快,验证码不会超时,并且我的机器人接收验证验证码和登录所需的令牌,除了没有提交按钮实际通过登录。 据我所知,我已经浏览了关于这个问题的每个 Github 帖子、每个 stackoverflow 帖子,我能找到的最佳解决方案是浏览 devtools 中的 Google Network 选项卡以查找一个函数手动调用这将模拟一个按钮并让您通过验证码。由于我的编码能力有限,我能够找到一个引用 ArkoseEnforcement 的函数和“回调”这个词,我相信这是我想要找到的。在尝试清除源选项卡和网络选项卡后,我能找到的最好的是:

Best I could find

我一直在尝试实现这个功能一个小时但没有成功,我还尝试查看“回调”和“ArkoseEnforment.funcaptcha_events”等。

enter image description here

我真的不知道如何将它们实现到我的代码中,如果您能帮助我从哪里开始,我将不胜感激。

//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”值:

enter image description here

这是验证码界面的样子(没有按钮):

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)