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.

6 commentaires :
commentaire n°7526 par Nabgrergy@rvmail.xyz
Nabgrergy@rvmail.xyz dimanche 5 septembre 2021, 10:18
<a href=https://buystromectolon.com/>;Stromectol</a>
commentaire n°7979 par Empaway@swmail.xyz
Empaway@swmail.xyz samedi 18 septembre 2021, 11:37
https://buylasixshop.com/ - Lasix
commentaire n°8267 par Reacick@oourmail.xyz
Reacick@oourmail.xyz jeudi 23 septembre 2021, 20:34
https://buyplaquenilcv.com/ - Plaquenil
commentaire n°8310 par assulpabe@rqmail.xyz
assulpabe@rqmail.xyz vendredi 24 septembre 2021, 12:35
<a href=https://buyplaquenilcv.com/>;plaquenil dosage for covid 19</a>
commentaire n°8982 par Aidenry@supmail.xyz
Aidenry@supmail.xyz dimanche 31 octobre 2021, 21:57
<a href=https://abuylasixshop.com/>;Lasix</a>
commentaire n°9025 par NaisseWab@rqmail.xyz
NaisseWab@rqmail.xyz mardi 2 novembre 2021, 20:21
<a href=https://astromectoli.com/>;Stromectol</a>
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é