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
相关产品推荐
相关产品推荐

