You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP cURL实现带动态Token的站点自动登录求助

实现带动态Token的PHP登录脚本

核心实现步骤

1. 先获取动态Token

动态Token是站点的防CSRF验证机制,必须先从登录页面获取,常见有两种获取方式:

方式一:从跳转后的URL中提取Token

如果访问登录页时,服务器会重定向到带Token的URL(比如/account.php?token=xxx),可以通过cURL获取最终URL并解析:

// 初始化cURL会话
$ch = curl_init();
$baseLoginUrl = 'https://目标站点域名/account.php';

// 配置基础cURL选项,确保会话保持和内容返回
curl_setopt_array($ch, [
    CURLOPT_URL => $baseLoginUrl,
    CURLOPT_FOLLOWLOCATION => true, // 跟随重定向
    CURLOPT_RETURNTRANSFER => true, // 返回内容而非直接输出
    CURLOPT_COOKIEJAR => 'site_cookies.txt', // 保存cookie到本地文件
    CURLOPT_COOKIEFILE => 'site_cookies.txt' // 后续请求读取该cookie
]);

// 执行请求,获取页面内容和最终访问的URL
$pageHtml = curl_exec($ch);
$finalUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

// 正则匹配URL中的Token参数
preg_match('/token=([^&]+)/', $finalUrl, $tokenMatches);
$loginToken = $tokenMatches[1] ?? '';

方式二:从页面表单的隐藏字段提取Token

如果Token嵌入在登录表单的隐藏input中(比如<input type="hidden" name="token" value="xxx">),直接从页面HTML中匹配:

// (承接上面的cURL初始化和请求,拿到$pageHtml后)
preg_match('/<input type="hidden" name="token" value="([^"]+)"/i', $pageHtml, $tokenMatches);
$loginToken = $tokenMatches[1] ?? '';

2. 发送带Token的登录POST请求

拿到Token后,构造完整的POST参数,提交登录请求:

// 替换成你实际的账号密码,以及站点表单对应的字段名
$postParams = http_build_query([
    'email' => 'your_account@example.com',
    'password' => 'your_password_here',
    'token' => $loginToken, // 带上刚才获取的动态Token
    'login_submit' => 'Sign In' // 替换成站点实际的提交按钮参数(看浏览器开发者工具的表单字段)
]);

// 构造登录请求的URL:如果Token需要放在URL参数里,就拼接进去
$loginPostUrl = 'https://目标站点域名/account.php';
if (!empty($loginToken)) {
    $loginPostUrl .= '?token=' . urlencode($loginToken);
}

// 更新cURL选项,发送POST请求
curl_setopt_array($ch, [
    CURLOPT_URL => $loginPostUrl,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $postParams,
    CURLOPT_HEADER => true // 可选,开启后可以查看响应头,辅助判断登录状态
]);

// 执行登录请求
$loginResult = curl_exec($ch);

// 验证登录是否成功:检查响应内容中是否包含站点登录后的特征文本(比如"控制面板"、"欢迎回来")
if (strpos($loginResult, '控制面板') !== false) {
    echo '登录成功,可以继续处理链接转换操作';
    // 这里可以添加后续提交链接到控制面板的代码
} else {
    echo '登录失败,建议输出$loginResult查看站点返回的错误信息';
    // echo $loginResult; // 调试时打开,查看站点返回的具体内容
}

// 关闭cURL会话
curl_close($ch);

关键注意事项

  • Cookie必须持久化:CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE是保持会话的核心,没有这两项,登录请求会被站点视为新会话,直接验证失败。
  • 字段名要完全匹配:所有POST参数的字段名(比如提交按钮的name属性)必须和站点实际表单一致,你可以通过浏览器F12的「网络」面板,查看真实登录请求的Form Data来确认。
  • HTTPS兼容性:如果站点是HTTPS,测试阶段可以临时添加CURLOPT_SSL_VERIFYPEER => false和CURLOPT_SSL_VERIFYHOST => false跳过证书验证,生产环境建议配置合法的CA证书。
  • 调试技巧:开启CURLOPT_VERBOSE => true可以输出详细的请求日志,方便排查请求发送过程中的问题。

内容的提问来源于stack exchange,提问作者blueboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:45:28