Поэтому у меня есть сценарий, который получает URL-адрес в качестве параметра get и, следовательно, пытается записать содержимое этой страницы в файл. На страницах, не прошедших проверку подлинности, он работает нормально, но он ломается, когда я пытаюсь использовать его на страницах, требующих проверки подлинности.
В частности, это страницы, к которым я уже подключился , поэтому я предположил, что выполнение стандартного запроса cURL со всеми моими установленными в настоящий момент файлами cookie будет работать, но это не так. Первоначально я получаю ответ 302, но если я установил «FOLLOWLOCATION» в true, я попал на страницу входа на сайт вместо страницы, которую я хотел.
$client = curl_init(); //curl_setopt($client, CURLOPT_HEADER, true); curl_setopt($client, CURLOPT_RETURNTRANSFER, true); curl_setopt($client, CURLOPT_FOLLOWLOCATION, true); curl_setopt($client, CURLOPT_URL, $pageToLoad); /* Supposedly libcurl loads all cookies auto-magically if you don't set CURL_COOKIESESSION if (isset($_SERVER['HTTP_COOKIE'])) { curl_setopt($client, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']); } */ $response = curl_exec($client); curl_close($client);
У меня есть ощущение, что мне нужно установить файл cookiejar для этого, чтобы он работал («тонущий», потому что у моего скрипта нет разрешений на запись на dev-сервере), но что вы думаете?
EDIT: Итак, будучи идиотом, получается, что у меня есть доступ на запись … в любом случае, создала временную папку в моем домашнем каталоге, где я проверил, что мой скрипт может писать:
$fname = '/home/temp/cookies.txt'; if( $save = fopen($fname, 'w') ) { fwrite($save, 'testing'); }
Запустите скрипт, и низко и созерцайте, «тестирование» появляется в первой строке.
Я добавил следующие два строки в мой запрос cURL:
curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/temp/cookies.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, '/home/temp/cookies.txt');
И ничто не изменилось в моем сценарии. Файл cookie.txt по-прежнему просто говорит «тестирование» и не содержит в нем куки, а также не изменяет время последнего доступа, что для меня означает, что эти строки ничего не делают.
Любые дальнейшие мысли? Я немного в тупике: \
Да, вам понадобятся оба параметра CURLOPT_COOKIEFILE
и CURLOPT_COOKIEJAR
. в «файловой» версии можно загрузить файлы cookie. в банке должны храниться файлы cookie, когда объект curl завершается. Они могут быть одним и тем же файлом.
Если у вас нет прав на запись на сервере для создания фактического файла (очень странно, если у вас не было хотя бы записи perms on / tmp или эквивалентного), вы можете использовать файл памяти, используя php://memory
,
Вот мой любимый образец для таких задач:
$loginUrl = 'http://www.remote_site.de/login.php'; $loginFields = array('username' => 'username', 'password' => 'password'); getUrl($loginUrl, 'post', $loginFields); //now you're logged in and a session cookie was generated $remote_page_content = getUrl('http://www.remote_site.de/some_page.php'); function getUrl($url, $method='', $vars='') { $ch = curl_init(); if ($method == 'post') { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); $buffer = curl_exec($ch); curl_close($ch); return $buffer; }
Поэтому я достал необработанный код cURL, который у меня был, и скопировал в каком-то конкретном коде Zend из другого проекта, и, похоже, он работал по большей части (не совсем уверен, почему …). Единственные другие проблемы, с которыми я столкнулся с CoSign (http://cosign.sourceforge.net/) и использование прокси-файлов. Спасибо тем, кто предложил ответы!