2013-07-08 2 views
0

Я пытаюсь использовать cookie, который сохраняется, вместо входа в систему каждый раз, когда сайт посещается.Reuse cookie cURL PHP

<?php 
$uid = $_GET['uid']; 
$ch = curl_init(); 
$cookie_file = dirname(__FILE__) . '/cookie.txt'; 
curl_setopt($ch, CURLOPT_URL, "http://www.forum.net/member.php?action=do_login"); 
curl_setopt($ch, CURLOPT_REFERER, "http://www.forum.net/member.php?action=login"); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5"); 
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/cookie.txt'); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=USERNAME&password=PASSWORD"); 
$exec = curl_exec($ch); 
curl_setopt($ch, CURLOPT_URL, "http://www.forum.net/reputation.php?uid=" . $uid . "&page=1"); 
$exec = curl_exec($ch); 
echo $exec; 
?> 

Это не позволит мне повторно использовать куки, по какой-то причине, но вместо этого он просто регистрирует меня. Cookie.txt файл содержит печенье материал.

+1

Вы устанавливаете как '' CURLOPT_COOKIEJAR' и CURLOPT_COOKIEFILE' дважды, и конечный результат будет разные значения. '/ cookie.txt' сохранит файл в системном корне и' dirname (__ FILE__). '/ cookie.txt'' сохранит файл в том же каталоге, что и исполняемый скрипт. Убедитесь, что вы только устанавливаете каждый параметр один раз с одинаковым значением (возможно, последним). – DaveRandom

+0

Хорошо, я установил CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE в: dirname (__ FILE__). '/cookie.txt' - однако это не сработает. Обновлен OP с новым кодом. – MortenMoulder

+0

Возможный дубликат http://stackoverflow.com/questions/12885538/php-curl-and-cookies/ – ChrisF

ответ

0

У вас есть:

curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt'); 
...[snip]...  
curl_setopt($ch, CURLOPT_COOKIEFILE, '/cookie.txt'); 

Вы перезагружаем расположение cookiefile в корень вашей файловой системы, где процесс веб-сервер почти наверняка не имеет права на запись в файл.

Также убедитесь, что процесс веб-сервера МОЖЕТ писать файлы везде, где dirname(__FILE__) указывает на.

0

Вы устанавливаете оба значения: и CURLOPT_COOKIEFILE, а конечный результат будет отличаться. '/cookie.txt' сохранит файл в системном корне, а dirname(__FILE__) . '/cookie.txt' сохранит файл в том же каталоге, что и текущий исполняемый скрипт. Убедитесь, что вы только устанавливаете каждый параметр один раз с одинаковым значением (возможно, последним).

Вы также делаете два запроса с одним и тем же дескриптором - это не рекомендуемый подход и, скорее всего, семантически неверен, потому что вы получите POST на обе страницы, когда второй, вероятно, должен быть GET.

Я рекомендую хранить путь кувшина печенья в переменной в верхней части блока и передавать это. Это упрощает просмотр происходящего.

Я подозреваю, что вы хотите что-то более, как это:

<?php 

    // Username and password for login 
    $username = 'USERNAME'; 
    $password = 'PASSWORD'; 

    // Create the target URLs 
    // Don't forget to escape your user input! 
    $loginUrl = "http://www.forum.net/member.php?action=do_login"; 
    $reputationUrl = "http://www.forum.net/reputation.php?uid=" . urlencode($_GET['uid']) . "&page=1"; 

    // Referer value for login request 
    $loginReferer = "http://www.forum.net/member.php?action=login"; 

    // Note that __DIR__ can also be used in PHP 5.3+ 
    $cookieJar = dirname(__FILE__) . '/cookie.txt'; 

    // The User-Agent string to send 
    $userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5"; 


    // Create the cURL handle for login 
    $ch = curl_init($loginUrl); 

    // Set connection meta 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

    // Set header-related options 
    curl_setopt($ch, CURLOPT_REFERER, $loginReferer); 
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieJar); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieJar); 

    // Set request body 
    $bodyFields = array(
     'username' => $username, 
     'password' => $password 
    ); 
    $body = http_build_query($bodyFields); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $body); 

    // Execute the request 
    if (!curl_exec($ch)) { 
     exit("ERROR: Login request failed: " . curl_error($ch)); 
    } 
    curl_close($ch); 


    // Create the cURL handle for reputation scrape 
    $ch = curl_init($reputationUrl); 

    // Set connection meta 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

    // Set header-related options 
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieJar); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieJar); 

    // Execute the request 
    if (!$result = curl_exec($ch)) { 
     exit("ERROR: Reputation scrape request failed: " . curl_error($ch)); 
    } 

    // Output the result 
    echo $result; 
+0

Большое спасибо за организацию моего кода. Это действительно хорошо! Тем не менее ... Этот код дает мне эту ошибку: Ошибка синтаксиса: ошибка синтаксиса, неожиданность «ERROR: Ошибка входа в систему:» (T_CONSTANT_ENCAPSED_STRING) в C: \ myfile.php в строке 48 – MortenMoulder

+0

@Snorlax исправлено. Я всегда забываю, что ' exit' требует скобок, в отличие от 'echo' и' print' – DaveRandom

+0

Теперь это работает, но он все еще не использует файл cookie. Он регистрируется каждый раз, когда я посещаю файл. И да, файл cookie сделан, и . – MortenMoulder

Смежные вопросы