使用Curl存储会话cookie

时间:2017-11-01 21:58:32

标签: php curl

我想使用PHP脚本使用curl调用网站并在那里读取数据。问题是这个网站没有API。到目前为止,一切正常,但网站需要身份验证并检查cookie是否已保存。从那时起,遗憾的是PHP脚本不再起作用了。我不知道如何检查cookie存储,但我必须以某种方式管理Curl假装存储cookie。

你们有没有想法?

$agent = "Mozilla/5.0 Gecko/13.0 Firefox/13.0";
    $header[] = "Accept: text/vnd.wap.wml,*.*";
    $ch = curl_init($url);

    if ($ch)
        {
        curl_setopt($ch,    CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,    CURLOPT_USERAGENT, $agent);
        curl_setopt($ch,    CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch,    CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch,    CURLOPT_COOKIEJAR, "");
        curl_setopt($ch,    CURLOPT_COOKIEFILE, "");
        $postdata = "?username=username&password=password";
        curl_setopt($ch,    CURLOPT_POST, 1);
        curl_setopt($ch,    CURLOPT_POSTFIELDS, $postdata);
        $tmp = curl_exec ($ch);
        curl_close ($ch);
        }
    return $tmp;

1 个答案:

答案 0 :(得分:1)

cURL将保留其会话cookie,直到您关闭或重新初始化句柄,所以不要这样做,你应该没事。在此示例中,您从$url收到的任何Cookie都会传递到$new_url

$agent = "Mozilla/5.0 Gecko/13.0 Firefox/13.0";
$header[] = "Accept: text/vnd.wap.wml,*.*";
$postdata = ["username"=>"username", "password"=>"password"];
$ch = curl_init($url);
if (!$ch) {
    echo "ERROR!";
    return false;
}
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERAGENT      => $agent,
    CURLOPT_HTTPHEADER     => $header,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_COOKIEFILE     => "",
    CURLOPT_POSTFIELDS     => $postdata,
    CURLOPT_POST           => true,
]);
$tmp = curl_exec($ch);

$curl_setopt_array($ch, [
    CURLOPT_URL        => $new_url,
    CURLOPT_GET        => true,
    CURLOPT_POSTFIELDS => null,
    CURLOPT_POST       => false,
]);
$tmp = curl_exec($ch);

curl_close($ch);

return $tmp;

一些注意事项:CURLOPT_POSTFIELDS通过数组更安全。这样PHP就可以为您完成URL编码。 CURLOPT_COOKIEFILE设置为空字符串会将cookie存储在内存中,无需指定CURLOPT_COOKIEJAR。个人偏好,但我发现curl_setopt_array()更容易使用和阅读。