2011-08-08 62 views
3

我正在写一个脚本从密码保护成员区下载文件。我现在通过使用curl调用来登录然后下载。但我想解决的问题是,我可能希望有一个脚本登录并保存该cookie,然后另一个脚本使用该cookie来下载所需的文件。现在我不确定这是否可能。cUrl登录然后cUrl下载

这是我工作的代码:

$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); 

所以是有可能的登录curl_exec后关闭卷曲,然后再打开一个卷曲的呼叫使用我的登录部分中保存的cookie来下载文件?

回答

5

是的,这是可能的。

CURLOPT_COOKIEJAR是Cookie的写入路径,而CURLOPT_COOKIEFILE是Cookie的读取路径。如果您提供CURLOPT_COOKIEFILE与你同CURLOPT_COOKIEJAR做了同样的路径,袅袅将持续存在跨请求饼干:

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

谢谢,这工作,并感谢两者之间的解释。你摇滚! – gprime

0

是的,请在CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE循环。我看到你已经使用CURLOPT_COOKIEJAR,所以你应该只能潜入* _COOKIEJAR。

+0

当我关闭卷曲连接并再次打开,即使将COOKIEJAR添加到循环中也不起作用。 – gprime

+0

对不起,我觉得你应该看看COOKIEFILE。我目前无法提供示例代码(iPhone)。将COOKIEILE指向先前创建的COOKIEJAR时,您将在第二个cURL执行程序中登录。 – Martijn

3

在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); 
}