cUrl登录然后cUrl下载

gpr*_*ime 3 php curl download

我正在编写一个脚本来从受密码保护的成员区域下载文件.我现在通过使用curl调用登录然后下载它.但我想解决的问题是我想要一个脚本登录并保存cookie然后另一个脚本使用cookie来下载所需的文件.现在我不确定这是否可行.

这是我的工作代码:

$cookie_file_path = "downloads/cookie.txt";
$fp = fopen($cookie_file_path, "w");
fclose($fp);

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);

curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $loginPostInfo);
curl_exec($ch);

// harddcode some known data
$downloadSize = 244626770;

$chuckSize = 1024*2048;        
$filePath = "downloads/file.avi";

$file = fopen($filePath, "w");

$downloaded = 0;
$startTime = microtime(true);

while ($downloaded < $downloadSize) {            
    // DOWNLOAD
    curl_setopt($ch, CURLOPT_RANGE, $downloaded."-".($downloaded + $chuckSize - 1));

    curl_setopt($ch, CURLOPT_URL, $downloadUrl);
    $result = curl_exec($ch);

    $nowTime = microtime(true);
    fwrite($file, $result);

    echo "\n\nprogress: ".$downloaded."/".$downloadSize." - %".(round($downloaded / $downloadSize, 4) * 100);

    $downloaded += $chuckSize;

    // calculate kbps
    $totalTime = $nowTime - $startTime;            
    $kbps = $downloaded / $totalTime;

    echo "\ndownloaded: ".$downloaded." bytes";
    echo "\ntime: ".round($totalTime, 2);
    echo "\nkbps: ".(round($kbps / 1024, 2));
}

fclose($file);
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

那么可以在登录curl_exec之后关闭curl,然后再次打开curl调用以使用我在登录部分保存的cookie下载文件吗?

net*_*der 5

是的,这是可能的.

CURLOPT_COOKIEJAR是cookie的写入路径,而cookie CURLOPT_COOKIEFILE是cookie 的读取路径.如果您提供CURLOPT_COOKIEFILE的路径与您使用的路径相同CURLOPT_COOKIEJAR,则cURL将跨请求保留cookie:

curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
Run Code Online (Sandbox Code Playgroud)