скручиваемое печенье не создается в случае успеха - PullRequest
3 голосов
/ 29 марта 2010

Я использую cUrl (PHP) для отправки запроса на вход и сохранения ответа в файле cookie. Во втором запросе я передаю cookie в заголовке и публикую данные, чтобы проверить это.

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

$cookiefile="/var/www/html/dimdim/cook.txt";
$url_log="http://my.dimdim.com/api/auth/login";
$p_log='request={"account":"bin6k","password":"password","group":"all"}';
$url_ver="http://my.dimdim.com/api/auth/verify";
$p_ver='request={"account":"bin6k","password":"password","group":"all"}';

$ch = curl_init();
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

curl_setopt($ch, CURLOPT_URL,$url_log);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $p_log);

ob_start();      // prevent any output
$retval=curl_exec ($ch); // execute the curl command
ob_end_clean();  // stop preventing output
curl_close ($ch);
//print_r($retval);
unset($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_URL,$url_ver);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $p_log);

$buf2 = curl_exec ($ch);

curl_close ($ch);

echo "<PRE>".htmlentities($buf2);

Ответы [ 3 ]

3 голосов
/ 03 июля 2010

У меня была такая же проблема, используйте это для запуска в Windows Localhost Server

curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/cookies.txt");
0 голосов
/ 29 мая 2010

Попробуйте эту функцию, добавлена ​​опция cookijar:

function execute($toLoad) {

    if ( !preg_match( '/^http/', $toLoad ) ) {
        $toLoad = 'http://'.$toLoad;
    }
    $cookiefile = APP_PATH.'tmp/cookie.txt';
    $data = array();    
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($ch, CURLOPT_TIMEOUT,10);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.6) Gecko/20091216 Fedora/3.5.6-1.fc11 Firefox/3.5.6 GTB6");
    curl_setopt($ch, CURLOPT_URL, $toLoad); // The page to download
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, 'http://somesite.com/' ); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);    

    $data['data'] = curl_exec($ch);
    $data['status'] = curl_getinfo($ch);

    //$this->out(curl_error($ch));   
    //$this->out(curl_getinfo($ch));     
    //$this->out('');
    //$this->out($data);
    //$this->out('');

    curl_close($ch);

    return $data;
}

Вы также можете попробовать прочитать заголовок возвращенных данных для Set-Cookie: SOMEKEY

и затем в curlopt использовать

if ($header) {
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Cookie:'.$header)); 
} 

Спасибо

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

Попробуйте также добавить туда curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);.

Кроме того, нет необходимости запускать новый экземпляр curl для каждого запроса. Вы можете повторно использовать один и тот же экземпляр для нескольких запросов. Просто установите соответствующий CURLOPT (url, postfields, get и т. Д.) Каждый раз, и curl разберутся внутри.

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