2012-03-15 15 views
5

Mi collego a un servizio API che autentica gli utenti tramite i cookie. Faccio queste due istruzioni dal prompt dei comandi e funziona.Leggere cookie quando si usa Curl in php, come?

curl -d "u=username&p=password" -c ~/cookiejar https://domain/login 

curl -b https://domain/getData 

Ora voglio fare due file php equivalenti login.php e get_data.php con ricciolo.

Sto usando

curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 

in login.php

e

curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile); 

in get_data.php

Non sta funzionando. Il file del cookie viene creato ma il secondo ricciolo non lo sta leggendo. È questo il modo giusto per farlo? Devo leggere il file cookie separatamente e impostare l'intestazione Cookie? Qualsiasi aiuto sarebbe apprezzato. Grazie.

+0

In genere è preferibile impostare entrambe le opzioni dei cookie, indipendentemente dal fatto che lo script stia leggendo o scrivendo i cookie. –

+0

Il valore dell'intestazione 'Cookie' verrà automaticamente aggiunto alla richiesta di arricciatura in' get_data.php'? – Diode

+0

se questa particolare istanza di ricciolo può leggere il file cookie creato dall'altro script, quindi sì. –

risposta

14

Questo farà il trucco. Corro contro Google.com come esempio:

<?PHP 

// open a site with cookies 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0'); 
curl_setopt($ch, CURLOPT_HEADER ,1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER ,1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
$content = curl_exec($ch); 

// get cookies 
$cookies = array(); 
preg_match_all('/Set-Cookie:(?<cookie>\s{0,}.*)$/im', $content, $cookies); 

print_r($cookies['cookie']); // show harvested cookies 

// basic parsing of cookie strings (just an example) 
$cookieParts = array(); 
preg_match_all('/Set-Cookie:\s{0,}(?P<name>[^=]*)=(?P<value>[^;]*).*?expires=(?P<expires>[^;]*).*?path=(?P<path>[^;]*).*?domain=(?P<domain>[^\s;]*).*?$/im', $content, $cookieParts); 
print_r($cookieParts); 

?> 

Vedi other examples per il modo di analizzare in modo efficace, come stringa.

1

c'è un metodo per vedere le intestazioni delle richieste di arricciatura. Posso ottenerlo dall'istanza di ricciolo? o c'è qualche strumento come Fiddler per Mac (sto lavorando su Mac OS)?

Sì, è possibile ottenere le intestazioni di richiesta con il seguente:

<?php 
    ... 
    curl_setopt($ch, CURLINFO_HEADER_OUT, true); // enable tracking 
    $result = curl_exec($ch); 
    var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT)); // request headers 
?> 
0

In PHP 5.5.0 sembra che ora è possibile ottenere i biscotti in una sola riga ma ho solo tornare un array vuoto utilizzare questo con PHP 7.1.0:

CURLINFO_COOKIELIST - ottenere tutti i cookie noti

$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); 
+0

Anche io ho questi problemi, sei riuscito a risolverli in modo che CURLINFO_COOKIELIST emetta i cookie? Per me stava funzionando, ma quando ho aggiornato di recente tramite 'yum update -y' il risultato era sempre vuoto. – maddo7

+0

Prova a impostare 'curl_setopt ($ ch, CURLOPT_COOKIELIST, array (''));' con la prima richiesta. Questo l'ha risolto per me. – maddo7

Problemi correlati