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.
'curl_setopt ($ curl, RETURN_TRANSFER, 1);' pourrait éventuellement le faire. – McStuffins
@Robert, déjà essayé ça aussi. 'CURLOPT_RETURNTRANSFER' ne transfère réellement que la sortie vers une variable. Mais merci. –