Une question qui revient souvent : Comment récupérer des informations disponibles sur d’autres sites ?
Par exemple, le nombre de visiteur connecté sur un site, le nombre d’inscrit, la météo, et pleins d’autres.
Beaucoup croient qu’il faut se connecter à leur BDD, ou qu’il faut avoir leurs scripts …
Que nini, c’est beaucoup plus simple !
Réfléchissons un peu :
Quand nous voulons afficher en Php « Hello World« , nous écrivons ceci :
<?php echo 'Hello World'; ?>
Et quand on regarde la source … nous voyons Hello World.
Si nous voulons afficher un compteur de connecté, nous utiliserons echo, print ou autre fonction qui affichera ce compteur.
Ce nombre sera donc visible dans la source !
Voyez-vous où je souhaite en venir ?
Le code source de la page va nous être d’une grande aide, étant donné qu’il contient les informations générées par Php (enfin, celles que Php a affichées, pas le code Php, encore heureux
)
Pff, c’est bien beau, et je fais quoi avec le code source ? J’en veux pas moi ! Je veux mon nombre de connecté !
Et les regex, vous les oubliez ?
Grâce à elles, nous pourrons sélectionner une certaine partie du code source, et ensuite pouvoir l’afficher O_o
Consignes et contraintes :
- Nous allons chercher la source d’un site voulue et la stocker dans une variable (fonction : file_get_contents())
- Nous allons supprimer les tabulations et sauts de ligne que contient cette variable. Pourquoi ? Tout simplement car pour la suite, nous pourrons rencontrer des « beugs », ça ne pourrait pas fonctionner. (fonction : str_replace())
- Nous allons, grâce à une regex, prendre une partie bien précise de ce code source. (fonction : preg_match_all())
- Si jamais il y a plusieurs pattern, nous pourrons choisir de sélectionner ce qu’il y a dans le 2ème, 8ème, etc…
Par exemple, si dans la source il y a
<div>Bonjour</div> et <div>Coucou</div>
, nous pourrons choisir de sélectionner le contenu du 2ème div. (Grâce aux « matches », qui créeront un tableau, de la fonction preg_match_all)
- Étant donné qu’un tableau commence au numéro 0, pour que ça soit plus clair, nous commencerons à 1.
- Enfin, nous créerons une fonction pour utiliser plus clairement notre script. La fonction s’appellera getInfo et prendra en paramètres : La source du site, le début du pattern, la fin du pattern et le numéro (le premier sera 1) qui permettra de dire à la regex de prendre le premier, deuxième, troisième,…, résultat.
Les explications sont un peu longues, mais le code est en réalité très court :rire:
Note : Je suis conscient que mettre le début du tableau à 1 au lieu de 0 est inutile, mais peut-être plus clair pour certains d’entre vous.
Correction :
A noter que parfois, certains sites ne nous laissent pas obtenir des informations avec Php.
Ils bloquent l’accés quand l’user-agent est Php (ou quelque chose comme ça
) pour éviter le nombre trop importants de requêtes ou autres …
function getInfo($source,$debut,$fin,$return) { // Notre fonction permettant d'obtenir des informations sur un autre site
$source = str_replace("\\\n", "", $source); // On supprime les retours chariots du code source
$source = str_replace(' ','',$source); // On supprime les tabulations
preg_match_all('`'.$debut.'(.+)'.$fin.'`',$source,$resultat); // Regex : Prend en parametre le début du pattern transmis à la fonction, la fin du pattern, la source, et crée un tableau avec les résultats trouvés.
$return--; // Etant donné que le premier résultat d'un tableau est 0, nous allons le transformé en 1
return $resultat[1][$return]; // On retourne le résultat voulu dans $return, le numéro du résultat. Le 1 correspond à : "Ne pas conserver la mise en forme", mettez 0 si vous voulez le contraire.
}
$source = file_get_contents('http://monsite.com'); // On prend la source du site voulue dans la fonction file_get_contents
echo getInfo($source,'
<div id="test">','</div>
', 1); // On affiche le résultat en appelant une fonction : on fait passer en paramêtre : la source, le début du pattern, la fin du pattern, et le numéro du résultat voulue (par défaut : 1)
?>
Pourquoi ne pas obtenir la source dans la fonction ?
Tout simplement car si vous voulez obtenir plusieurs informations du même site, vous utiliserez la variable $source.
Si vous transmettez l’url au lieu de la source et que dans la fonction, vous obtenez la source, vous ferez 2 file_get_contents !
Et ceci augmente considérablement le temps d’exécution de la page !
Voilà, c’est terminé.
PS : Désolé si je n’ai pas bien expliqué le nombre dans le paramètre de la fonction, le 1, mais sachez qu’il sert si par exemple, vous avez ceci dans la source :
<div id="test">Bonjour</div> <div id="test">Coucou</div> <div id="test">Hello</div>
Vous aurez toujours le même pattern, preg_match_all va nous renvoyer un tableau contenant les 3 résultats, et grâce à ce nombre nous choisirons d’afficher soit le 1er,2ème ou 3ème
PS2 : Si quelqu’un n’aurait pas compris pourquoi supprimer les retours chariots et tabulations, c’est tout simplement pour le bon fonctionnement de notre regex, si vous affichez la source, vous verrez que tout le code est collé, sans aucun vide, nous pourrons alors appliquer les regex sans soucis.
