Télécharger en se faisant passer pour un navigateur avec cURL

Avril 2013

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.

0 commentaire
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré