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

求助:如何用PHP实现网站自动登录并保存指定格式Cookie

解决PHP cURL自动登录Comprasnet并获取Cookie的问题

我帮你排查了代码里的几个关键问题,这些问题导致你的自动登录流程没能正确获取和使用Cookie。下面是修正后的完整代码,以及每个修改点的说明:

修正后的代码

<?php 
// 核心配置参数
$loginUrl = 'https://www.comprasnet.gov.br/seguro/loginPortalFornecedor.asp';
$targetPageUrl = 'https://www.comprasnet.gov.br/pregao/fornec/Acompanhar.asp';
define('PERFIL', '1');
define('TXT_LOGIN', '*****'); // 替换成你的实际登录账号
define('TXT_SENHA', '*****'); // 替换成你的实际登录密码
define('ENVIA', '1');
define('USER_AGENT', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36');
define('COOKIE_FILE', 'cookie.txt');

// 确保Cookie文件存在且可读写
if (!file_exists(COOKIE_FILE)) {
    $fp = fopen(COOKIE_FILE, 'w');
    fclose($fp);
}
chmod(COOKIE_FILE, 0644);

// 构造登录POST参数
$postData = array(
    'perfil' => PERFIL,
    'txtLogin' => TXT_LOGIN,
    'txtSenha' => TXT_SENHA,
    'envia' => ENVIA
);

$curl = curl_init();

// 第一步:执行登录请求,保存会话Cookie
curl_setopt_array($curl, array(
    CURLOPT_URL => $loginUrl,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query($postData),
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_COOKIEJAR => realpath(COOKIE_FILE), // 将服务器返回的Cookie写入文件
    CURLOPT_USERAGENT => USER_AGENT,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_REFERER => $loginUrl,
    CURLOPT_FOLLOWLOCATION => true, // 允许自动跟随登录后的跳转,确保会话Cookie更新
    CURLOPT_HEADER => true, // 可选:开启后可以查看响应头,方便调试Cookie信息
    CURLOPT_HTTPHEADER => array(
        'Content-Type: application/x-www-form-urlencoded' // 明确告诉服务器POST数据格式
    )
));

$loginResponse = curl_exec($curl);

// 捕获cURL错误
if(curl_errno($curl)){
    throw new Exception(curl_error($curl));
}

// 第二步:访问目标页面,使用已保存的Cookie维持会话
curl_setopt_array($curl, array(
    CURLOPT_URL => $targetPageUrl,
    CURLOPT_POST => false, // 目标页面是GET请求,不需要POST数据
    CURLOPT_COOKIEFILE => realpath(COOKIE_FILE), // 从文件读取Cookie发送给服务器
    CURLOPT_USERAGENT => USER_AGENT,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_REFERER => $loginUrl,
    CURLOPT_FOLLOWLOCATION => true
));

$targetPageContent = curl_exec($curl);

// 输出目标页面内容,验证是否登录成功
echo $targetPageContent;

// 可选:输出Cookie文件内容,直观查看获取到的ASPSESSIONID类Cookie
echo "<br><br>已保存的Cookie内容:<br>";
echo nl2br(file_get_contents(COOKIE_FILE));

curl_close($curl);
?>

关键修改点说明

  1. Cookie读写逻辑修正
    原代码第二次请求时错误使用了CURLOPT_COOKIEJAR(这个参数是用来写入Cookie到文件的),正确的做法是用CURLOPT_COOKIEFILE来读取已保存的Cookie并发送给服务器,这样才能维持登录会话。

  2. 开启跳转跟随
    设置CURLOPT_FOLLOWLOCATION => true,因为登录成功后服务器通常会自动跳转到其他页面,这一步会自动完成跳转并更新会话Cookie,确保后续请求能正常使用登录状态。

  3. 添加Content-Type请求头
    明确告诉服务器POST数据是application/x-www-form-urlencoded格式,避免服务器无法正确解析你的登录参数。

  4. Cookie文件权限处理
    新增了Cookie文件的创建和权限设置,确保cURL有读写权限,避免因文件无法写入导致Cookie丢失。

  5. 调试辅助设置
    开启CURLOPT_HEADER => true可以查看响应头中的Cookie信息,最后还添加了输出Cookie文件内容的代码,方便你直观看到获取到的ASPSESSIONID类Cookie。

额外建议

  • 先把代码里的*****替换成你的实际账号和密码再测试。
  • 测试时可以先注释掉第二步的目标页面请求,只执行登录请求,查看$loginResponse的内容,确认是否登录成功(比如是否包含登录成功的提示或跳转地址)。
  • 注意:禁用CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER是为了调试方便,生产环境建议启用SSL验证,可以通过设置CA证书路径来实现,提升安全性。

内容的提问来源于stack exchange,提问作者John Pablo Martins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:57:09