Télécharger en se faisant passer pour un navigateur avec cURL
Pour télécharger un fichier en PHP (page web, image, archive zip...), on utilise généralement la fonction file_get_contents
ou encore fopen
.
Ces fonctions sont très pratiques, sauf qu'elles ne permettent pas de personnaliser simplement la requête HTTP (les headers), à moins d'utiliser un contexte avec stream_context_create
.
Le problème c'est que certains sites bloquent l'accès à certains visiteurs (par exemple en fonction du User Agent), comme un serveur PHP ou un aspirateur de site. La solution pour éviter ces problèmes, c'est de se faire passer pour un navigateur ordinaire, en utilisant le User Agent.
Voici une fonction qui permet de télécharger en tant que Firefox, en utilisant l'extension PHP cURL :
<?php function downloadAsFirefox($url, &$info = null){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Suivre les redirections (302, 301) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Pas de vérification du certificat SSL curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0'); $content = curl_exec($ch); $info['curl_errno'] = curl_errno($ch); $info['curl_error'] = curl_error($ch); $info['http_code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if( $info['curl_errno'] !== 0 || in_array($info['http_code'], array(403, 404, 500, 503)) ){ return false; } return $content; } // Exemple d'utilisation $content = downloadAsFirefox('https://www.google.fr/images/srpr/logo4w.png', $info); print_r($info); ?>
Voici un billet similaire qui vous permettera d'en savoir plus sur rétro-compatibilité d'un fichier excel.
Si le téléchargement fonctionne, la fonction retourne les données téléchargées, et s’il échoue elle retourne false
.
Le second argument $info est optionnel, si il est défini, la fonction va placer dans cette variable (par référence) des informations sur le téléchargement. Cette technique de passage par référence permet d'éviter d'avoir à retourner une valeur composite comme un tableau et un objet, car on n’a pas systématiquement besoin des infos. D'ailleurs le 3éme argument la fonction preg_match
marche de la même manière.
La fonction suit les redirections 301 et 302, et ignore la validité du certificat SSL.
Allez donc jeter un oeil sur cette page : texte en chocolat.