как сохранить сессию в cURL в php? - PullRequest
21 голосов
/ 11 марта 2010

как мы можем поддерживать сессию в cURL?

У меня есть код, который отправляет данные для входа на сайт и успешно входит в систему. мне нужно, чтобы сеанс продолжался на сайте, чтобы продолжить.

вот мой код, который использовался для входа на сайт с помощью cURL

  <?php  
        $socket = curl_init();
        curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com");
    curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.com");
    curl_setopt($socket, CURLOPT_POST, true);
    curl_setopt($socket, CURLOPT_USERAGENT, $agent);
    curl_setopt($socket, CURLOPT_POSTFIELDS, "form_logusername=XXXXX&form_logpassword=XXXXX");
    curl_setopt($socket, CURLOPT_COOKIESESSION, true);
    curl_setopt($socket, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_setopt($socket, CURLOPT_COOKIEFILE, "cookies.txt");
    $data = curl_exec($socket);
    curl_close($socket); 
   ?>

Ответы [ 4 ]

15 голосов
/ 13 марта 2013

Вот лучший способ найти ссылку :

текст, представленный ниже, представляет собой «ремиксовую» версию содержимого blogpost :

 $useragent = $_SERVER['HTTP_USER_AGENT'];
 $strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';

session_write_close();

$ch = curl_init();
$ch = curl_init($rssFeedLink); 
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT, $useragent);
curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );

$response = curl_exec($ch); 
curl_close($ch); 

Что делает session_write_close()? Он завершает текущий сеанс и сохраняет данные сеанса. По-видимому, PHP не нравится, когда несколько скриптов играют с сеансом, поэтому он его блокирует. Помещение session_write_close гарантирует, что ваш текущий сеанс сохранен, чтобы вы могли получить его и использовать.

если вы не используете session_write_close(), будет создан новый идентификатор сеанса вместо текущего идентификатора сеанса.

Также PHPSESSID следует заменить именем переменной сеанса. Согласно рекомендациям OWSAP это должно быть что-то более общее, например anId .

Иногда вам необходимо отправить пользовательский агент с сообщением, поэтому я включил параметр CURLOPT_USERAGENT.

12 голосов
/ 06 марта 2014

Вот как вы делаете CURL с сессиями

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

Я видел это на ImpressPages

2 голосов
/ 11 марта 2010

Поскольку вы ссылаетесь на файл cookies.txt без какой-либо ссылки на папку, я думаю, что вы пытаетесь записать файл в папку, недоступную для записи. Поэтому сначала проверьте, действительно ли вы нашли файл cookies.txt и содержит ли он сессионные cookie-файлы.

0 голосов
/ 11 марта 2010

Я бы, вероятно, переместил этот код в функцию. После успешного входа в систему у вас теперь есть сеанс, связанный с файлом cookie, который есть в вашем файле cookie.txt. При последующих запросах просто продолжайте использовать этот файл cookie, и у вас должен быть действительный сеанс на этом сайте.

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