2016-08-08 1 views
0

Il existe un site pour rechercher des numéros de téléphone. Je dois faire un php script ou un curl command pour pouvoir rechercher d'un cron job. Lorsque je visite la page de recherche, un cookie "session" est créé, qui est utilisé pour obtenir les résultats. Sur la page de résultats, au cas où le cookie est manquant ou contient des informations erronées, la recherche ne donne pas de résultats. J'ai donc pensé visiter la page de recherche, récupérer le cookie, puis post ce cookie, avec les paramètres de recherche dont j'ai besoin pour la page de résultat, qui est différent (l'action du formulaire de la page de recherche le montre).Le cookie php cURL n'est pas transmis

La première partie est terminée. Je suis en mesure de saisir le cookie, l'analyse syntaxique soit l'en-tête:

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'https://www.eofcom.admin.ch/eofcom/public/searchEofcom_InaFree.do'); 
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0'); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_HEADER, 1); 
curl_setopt($curl, CURLOPT_VERBOSE, true); 
$result = curl_exec($curl); 
curl_close($curl); 

preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); 
$cookiesStringToPass = ''; 
$cookies = array(); 
foreach($matches[1] as $item) { 
    parse_str($item, $cookie); 
    $cookies = array_merge($cookies, $cookie); 
} 
$cookiesStringToPass = ''; 
foreach ($cookies as $name=>$value) { 
    if ($cookiesStringToPass) { 
     $cookiesStringToPass .= ';'; 
    } 
    $cookiesStringToPass .= $name . '=' . addslashes($value); 
} 
// $cookiesStringToPass now contains the cookie names and values 

ou le stocker dans un fichier en utilisant:

curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookies.txt'); 
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookies.txt'); 

Jusqu'à présent, si bon. Maintenant, dans la deuxième partie, où je dois soumettre/poster les informations pour obtenir le résultat (encore une fois, c'est une page différente de la recherche), devrait passer le nom/valeur du cookie, ce qui ne se passe pas. Soit je définir explicitement la cookie dans le header, comme ceci:

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, "https://www.eofcom.admin.ch/eofcom/public/listEofcom_InaFree.do"); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Cookie: '.$cookiesStringToPass, 
    'Content-Type: application/x-www-form-urlencoded' 
)); 
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS, "nrt=2&pnp=000221&doSearchFreeByNumber=Search"); 
curl_setopt($curl, CURLOPT_COOKIESESSION, true); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,0); 
curl_setopt($curl, CURLOPT_HEADER , 1); 
curl_setopt($curl, CURLOPT_VERBOSE, 1); 
$result = curl_exec($curl); 
curl_close($curl); 

ou je mis le fichier généré avant:

curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookies.txt'); 

le résultat est le même: un autre cookie est généré. Puisque les valeurs sont différentes, je n'obtiens pas le résultat.

Essayé de fonctionner dans la même session (donc sans fermer la boucle de la boucle après la première demande), même résultat. Je suis conscient que le fichier cookie n'est pas créé jusqu'à ce que la connexion est fermée, et aussi, que l'ordre de la curl_setopt est important, a essayé de jouer avec eux aussi. Pourtant, à partir d'un navigateur, cela fonctionne très bien.

Quelqu'un pourrait-il me dire ce qui se passe? Pourquoi le cookie n'est pas défini (ou ignoré?! ...)? Même si c'est une demande https, je ne suis pas au courant qu'il aurait besoin d'une sorte de certificat ou un tel (dans ce cas, probablement la demande ne retournerait pas la page, se plaindre à ce sujet ...).

Merci d'avance.


Edit: oublié de mentionner, j'ai aussi essayé d'utiliser

curl_setopt($curl, CURLOPT_COOKIE, $cookiesStringToPass); 

sans succès.


Edit 2: a également essayé de reconstruire l'ensemble header, car il provient du serveur, et ont aussi essayé d'inclure le referrer, en vain.


Edit 3: A partir de la ligne de commande, le dumping l'en-tête de la page de recherche:

curl -v --dump-header headers https://www.eofcom.admin.ch/eofcom/public/searchEofcom_InaFree.do > aa.html 

puis la réutiliser pour POST à la page de résultats

curl -v -L -b headers --data "nrt=2&pnp=000991&doSearchFreeByNumber=Search" https://www.eofcom.admin.ch/eofcom/public/listEofcom_InaFree.do > ab.html 

encore produit le même, mauvais résultat, cette fois le cookie est réglé correctement.

+0

'curl_setopt ($ curl, RETURN_TRANSFER, 1);' pourrait éventuellement le faire. – McStuffins

+0

@Robert, déjà essayé ça aussi. 'CURLOPT_RETURNTRANSFER' ne transfère réellement que la sortie vers une variable. Mais merci. –

Répondre

0

Le problème n'était pas lié au cookie. Il y avait une deuxième session id, définie par javascript sur l'action du formulaire, sous la forme d'un paramètre get. Une fois cela passé aussi, tout a fonctionné comme prévu.

+0

Salut Andrew, j'ai le même problème. Il y a une deuxième session en cours de création quelque part, que je n'arrive pas à comprendre comment l'attraper ou trouver comment elle est créée ... pourriez-vous me donner un coup de main? Merci – Kitara

+0

Désolé pour le commentaire en retard, donnez plus de détails si vous ne l'avez pas déjà compris. Nous devrions trouver un autre endroit pour parler, SO n'est pas pour discuter. Ou vous pouvez poster une question et écrire ici le lien. –

+0

J'ai été capable de le comprendre! Merci! – Kitara