Il faut savoir que depuis la mi-août la page de présentation de cette image du jour a changé, la résolution des photos aussi, elles sont parfois plus intéressantes.

La page en question est la suivante http://photography.nationalgeographic.com/photography/photo-of-the-day/

Elle est complexe et la syntaxe n'est pas terrible, mais on peut y repérer la date, un nom de fichier possible et enfin l'url de l'image. Tout ceci grace aux balises meta renseignées dans la partie head, super ! LOL

La date

C'est intéressant si vous voulez sauvegarder les photos au fur et à mesure dans un dossier dont le nom reprend l'année puis le mois.

On trouve donc cette ligne :

    <meta property="gsa_publish_date" content="Wed Sep 07 00:02:23 EDT 2016"/>

C'est un format de date standard pour PHP un simple strtotime fera l'affaire

L'url du fichier

Il ne faut pas se contenter de l'image réduite afficher par la page, mais aller chercher celle qui se cache en définition maximale

on trouve donc cette ligne :

<meta property="og:image" content="http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7pS2VP2wnKyN8wxywmXtY0-FwsgxqjPRbpTgzTM-4Z30DkZQigI-ffcxgLZ92xfyyK4w3V4-0Uul32h2rdcdOo_jWt8cNPKGuiBY-Dk-OB2gP5y5skOpUoq1u5_1FZjehakvsjilhprNoxpOHi9hCtCid-0V5d4UO_IFtTtTPgq0y6pB4fcmgHr9FR9T7lFiPiXu9OG19A/"/>

J'ai bien essayé de comprendre ce que pouvait cacher ce codage, pas trouvé :-( C'est pour cela qu'il faut trouver un nom à cette photo, syntaxiquement correct et le plus unique possible, tout en conservant une certaine description de la photo.

Un nom de fichier

A la recherche d'un nom explicite on trouve cette ligne toujours dans les meta :

<meta property="og:url" content="http://www.nationalgeographic.com/photography/photo-of-the-day/2016/9/india-rainforest-snake/"/>

La fin de l'url nous suffira !

Le script PHP

<?php
	$nam_dir = "D:\\NationalGeographic\\";
	
	$url_xml = 'http://photography.nationalgeographic.com/photography/photo-of-the-day/';

	$dat_xml = file_get_contents($url_xml);
	
	$deb = stripos($dat_xml,'<meta property="gsa_publish_date');
	$deb = stripos($dat_xml,'content="',$deb);
	$deb = stripos($dat_xml,'"',$deb);
	$fin = stripos($dat_xml,'"',$deb+1);
	$dir_img = substr($dat_xml,$deb+1,$fin-$deb-1);
	$dir_img = strtotime($dir_img);
	$dir_img = date("Y_m",$dir_img);

	$deb = stripos($dat_xml,'<meta property="og:image"');
	$deb = stripos($dat_xml,'content="',$deb);
	$deb = stripos($dat_xml,'"',$deb);
	$fin = stripos($dat_xml,'"',$deb+1);

	if($deb != 0) {
		$url_img = substr($dat_xml,$deb+1,$fin-$deb-1);
		$dat_img = file_get_contents($url_img);

		$deb = stripos($dat_xml,'<meta property="og:url"');
		$deb = stripos($dat_xml,'content="',$deb);
		$deb = stripos($dat_xml,'"',$deb);
		$fin = stripos($dat_xml,'"',$deb+1);
		$nam_img=substr($dat_xml,$deb+1,$fin-$deb-2);
		$deb = strripos($nam_img,'/');
		$nam_img='\\'.substr($nam_img,$deb+1).'.jpg';

		if (!file_exists($nam_dir.$dir_img)) mkdir($nam_dir.$dir_img);
		if (!file_exists($nam_dir.$dir_img.$nam_img)) file_put_contents($nam_dir.$dir_img.$nam_img,$dat_img);

		header("Content-type: image/jpg");
		echo $dat_img;
		}
?>

Ce script permet donc de sauvegarder dans un sous-dossier dont le nom est la concaténation de l'année et le mois, du dossier D:\NationalGeographic\, la photo du jour sous un nom de fichier correct.

Pour résumé :

  • on récupère le fichier HTML
  • on recherche la date
  • on extrait la date
  • on la met sous la bonne forme
  • on recherche l'url de la photo
  • on l'extrait
  • on recherche le nom de fichier de la photo
  • on l'extrait
  • si le sous-dossier année_mois n'existe pas on le crée
  • si la photo n'existe pas on la sauvegarde
  • on renvoie la photo

Ceci ne reste valable que tant que ces informations restent valides chez National Geographic, on verra bien combien de temps cela durera ...

Bye ! LOL