use std::time::Duration;
use drission::prelude::*;
const URL: &str = "https://auth.exa.ai/?callbackUrl=https%3A%2F%2Fdashboard.exa.ai%2F";
const EMAIL: &str = "12341423@gmail.com";
const TURNSTILE_TOKEN_JS: &str = "(() => { const e = document.querySelector('[name=cf-turnstile-response]'); return e ? e.value : ''; })()";
#[tokio::main]
async fn main() -> drission::Result<()> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "warn".into()),
)
.init();
let headless = matches!(
std::env::var("HEADLESS").ok().as_deref(),
Some("1") | Some("true")
);
println!("模式: {}", if headless { "无头" } else { "有头" });
let browser = Browser::launch(
BrowserOptions::new()
.headless(headless)
.window_size(1280, 800),
)
.await?;
let tab = browser.latest_tab().await?;
tab.get(URL).await?;
tokio::time::sleep(Duration::from_secs(2)).await;
let webdriver = tab.run_js("navigator.webdriver").await.unwrap_or_default();
let ua = tab.run_js("navigator.userAgent").await.unwrap_or_default();
let brands = tab
.run_js("JSON.stringify((navigator.userAgentData&&navigator.userAgentData.brands)||[])")
.await
.unwrap_or_default();
println!("navigator.webdriver = {webdriver}");
println!("userAgent = {ua}");
println!("uaData.brands = {brands}");
let email = tab.ele("css:input[type=email]").await?;
email.click().await?; email.input_human(EMAIL).await?;
println!("已填邮箱: {EMAIL}");
let mut token_len = 0usize;
for i in 0..30 {
tokio::time::sleep(Duration::from_millis(1000)).await;
let token = tab.run_js(TURNSTILE_TOKEN_JS).await.unwrap_or_default();
token_len = token.as_str().unwrap_or("").len();
println!(" [{i:>2}s] turnstile_token_len = {token_len}");
if token_len > 20 {
break;
}
}
if token_len <= 20 {
println!("\n未自动出 token,尝试交互式 Turnstile 可信点击…");
let _ = tab.pass_cloudflare(Duration::from_secs(15)).await;
let token = tab.run_js(TURNSTILE_TOKEN_JS).await.unwrap_or_default();
token_len = token.as_str().unwrap_or("").len();
}
if token_len > 20 {
println!("\n结果: 已过 CF 盾(Turnstile 有效 token,长度 {token_len})");
} else {
println!("\n结果: 未过(无 Turnstile token)。可重试,或检查出网 IP 是否被风控。");
}
browser.quit().await?;
Ok(())
}