Php cUrl登录,然后cUrl下载

Php cUrl登录,然后cUrl下载,php,curl,download,Php,Curl,Download,我正在编写一个脚本,从受密码保护的成员区域下载文件。通过使用curl调用登录然后下载,我现在就可以使用它了。但我试图解决的问题是,我可能希望有一个脚本登录并保存cookie,然后另一个脚本使用cookie下载所需的文件。现在我不确定这是否可能 这是我的工作代码: $cookie_file_path = "downloads/cookie.txt"; $fp = fopen($cookie_file_path, "w"); fclose($fp); $ch = curl_init(); curl

我正在编写一个脚本,从受密码保护的成员区域下载文件。通过使用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);
$cookie\u file\u path=“downloads/cookie.txt”;
$fp=fopen($cookie_文件_路径,“w”);
fclose($fp);
$ch=curl_init();
curl_setopt($ch,CURLOPT_头,false);
curl_setopt($ch,CURLOPT_NOBODY,false);
curl_setopt($ch,CURLOPT_URL,$loginUrl);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl\u setopt($ch,CURLOPT\u COOKIEJAR,$cookie\u文件\u路径);
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”);
卷曲设置($ch,卷曲设置桩,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$loginPostInfo);
curl_exec($ch);
//对一些已知数据进行硬编码
$downloadSize=244626770;
$chuckSize=1024*2048;
$filePath=“下载/file.avi”;
$file=fopen($filePath,“w”);
$download=0;
$startTime=微时间(真);
而($downloadSize<$downloadSize){
//下载
curl_setopt($ch,CURLOPT_RANGE,$download.“-”($download+$chuckSize-1));
curl_setopt($ch,CURLOPT_URL,$downloadUrl);
$result=curl\u exec($ch);
$nowTime=微时间(真);
fwrite($file,$result);
echo“\n\n进度:“.$downloadSize.”/“$downloadSize.”-%”(四舍五入($downloadSize/$downloadSize,4)*100);
$download+=$chuckSize;
//计算kbps
$totalTime=$nowTime-$startTime;
$kbps=$downloaded/$totalTime;
echo“\n下载:“.$download.”字节;
echo“\ntime:.round($totalTime,2);
回声“\nkbps:”(圆形($kbps/1024,2));
}
fclose($文件);
卷曲关闭($ch);

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

是的,请在CURLOPT_COOKIEJAR和CURLOPT_cookie文件上循环。我看到您已经使用了CURLOPT_COOKIEJAR,所以您可能只需要深入研究*_COOKIEJAR。

是的,这是可能的

CURLOPT_-COOKIEJAR
是cookies的写入路径,而
CURLOPT_-COOKIEFILE
是cookies的读取路径。如果您提供的
CURLOPT_-COOKIEFILE
路径与使用
CURLOPT_-COOKIEJAR
时的路径相同,cURL将跨请求保存cookie:

curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);

在ImpressPages上,我是这样做的:

//initial request with login data

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp');  //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

//another request preserving the session

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

当我关闭curl连接并再次打开它时,即使我将COOKIEJAR添加到循环中,它也不会工作。对不起,我建议您应该查看COOKIEFILE。我目前无法向您提供示例代码(iPhone)。当将CookieFile指向以前创建的COOKIEJAR时,您将在第二个cURL exec处登录。谢谢,这很有效,谢谢您对两者之间的解释。你太棒了!