cUrl Войти, затем cUrl Скачать - PullRequest
       20

cUrl Войти, затем cUrl Скачать

3 голосов
/ 09 августа 2011

Я пишу скрипт для загрузки файлов из защищенной паролем зоны пользователей. У меня это работает прямо сейчас с помощью вызова 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);

Так можно ли закрыть скручивание после входа в систему curl_exec и затем снова открыть вызов скручивания, чтобы загрузить файл с помощью файла cookie, который я сохранил во время входа в систему?

Ответы [ 3 ]

5 голосов
/ 09 августа 2011

Да, это возможно.

CURLOPT_COOKIEJAR - это путь записи для файлов 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);
3 голосов
/ 06 марта 2014

На 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);
}
0 голосов
/ 09 августа 2011

Да, выполните цикл CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE. Я вижу, вы уже используете CURLOPT_COOKIEJAR, поэтому вам, вероятно, стоит погрузиться только в * _COOKIEJAR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...