我有一个糟糕的 Twitter 登录自动化脚本。我已经在 21 行设置了等待,并编写了在 34 行等待的脚本。但是第 34 行的 driver.sleep 不起作用
'use strict';
const {Browser,Builder, By, Key} = require('selenium-webdriver');
const config = require('./config');
const {TOTP} = require('totp-generator');
function getRandomNum() {
const min = 5000;
const max = 10000;
return Math.random() * (max - min) + min;
}
function getToptpToken() {
const { otp, expires } = TOTP.generate(config.twitter.toptp.token);
return otp;
}
async function twitterLogin() {
const url = 'https://x.com/i/flow/login';
const driver = await new Builder().forBrowser(Browser.CHROME).build();
try{
await driver.manage().setTimeouts({ implicit: 20000 });
await driver.get(url)
const username = await driver.findElement(By.xpath("//input[@autocomplete='username']"));
await username.sendKeys(config.twitter.login);
await username.sendKeys(Key.RETURN);
const phoneNumber = await driver.findElement(By.xpath("//input"));
await phoneNumber.sendKeys(config.twitter.phone);
await phoneNumber.sendKeys(Key.RETURN);
const password = await driver.findElement(By.xpath("//input[@autocomplete='current-password']"));
await password.sendKeys(config.twitter.pass);
await password.sendKeys(Key.RETURN);
const totpToken = await driver.findElement(By.xpath("//input"));
await totpToken.sendKeys(Key.RETURN);
await driver.sleep(getRandomNum());
} catch (error){
if(error === 'NoSuchElementError'){
console.error(error.message);
}
}finally {
await driver.quit();
}
}
twitterLogin()
我用谷歌搜索,尝试了不同的等待组合......
UPD。可以关闭
您在 Twitter 登录自动化脚本中遇到的问题,特别是第 34 行的 driver.sleep 函数不起作用,可能是由于您的 Twitter 帐户禁用了双因素身份验证 (2FA)。您的脚本是在假设已启用 2FA 的情况下编写的,因此不需要在字段中输入 2FA 代码。
'use strict';
const {Browser,Builder, By, Key} = require('selenium-webdriver');
const config = require('./config');
const {TOTP} = require('totp-generator');
function getRandomNum() {
const min = 5000;
const max = 10000;
return Math.random() * (max - min) + min;
}
function getToptpToken() {
const { otp, expires } = TOTP.generate(config.twitter.toptp.token);
return otp;
}
async function twitterLogin() {
const url = 'https://x.com/i/flow/login';
const driver = await new Builder().forBrowser(Browser.CHROME).build();
try{
await driver.manage().setTimeouts({ implicit: 20000 });
await driver.get(url)
const username = await driver.findElement(By.xpath("//input[@autocomplete='username']"));
await username.sendKeys(config.twitter.login);
await username.sendKeys(Key.RETURN);
const phoneNumber = await driver.findElement(By.xpath("//input"));
await phoneNumber.sendKeys(config.twitter.phone);
await phoneNumber.sendKeys(Key.RETURN);
// 2FA check
try {
const twoFactorAuthField = await driver.findElement(By.xpath("//input[@id='challenge_response']")); // Update the XPath for the 2FA code field
if (twoFactorAuthField) {
const totpToken = getToptpToken();
await twoFactorAuthField.sendKeys(totpToken);
await twoFactorAuthField.sendKeys(Key.RETURN);
}
} catch (error) {
// 2FA field not found, continue
}
const password = await driver.findElement(By.xpath("//input[@autocomplete='current-password']"));
await password.sendKeys(config.twitter.pass);
await password.sendKeys(Key.RETURN);
await driver.sleep(getRandomNum()); // Random delay
} catch (error){
if(error.name === 'NoSuchElementError'){
console.error(error.message);
}
}finally {
await driver.quit();
}
}
twitterLogin()
在此代码中,我们添加了一个
try...catch
块来检查 2FA 代码字段是否存在。如果该字段存在,我们使用 getToptpToken()
函数获取 2FA 代码并将其输入该字段。如果没有,代码将继续下一步。
我们还确保使用
driver.sleep()
函数调用 getRandomNum()
函数以使用随机延迟时间。