Les fonds d'écran bing
Par Akh le mardi, 04 juin 2013, 15:06 - Lien permanent
Microsoft fournit sur son site de recherche, mais aussi à une autre époque avec un thème et un flux RSS et actuellement avec une sorte de widget barre de recherche, des images se mettant en fond d'écran, une différente chaque jour.
J'avais repéré le dossier contenant les images nommées à la date du jour et au bout d'un certain temps je me suis dit il y en a certaines que je voudrais bien conservées, sauf que ... les petits filous ... seules les neuf dernières sont disponibles.
Or je voulais pouvoir faire mon marché quand l'envie m'en aurait pris, sans avoir à me soucier de quoi que ce soit.
Alors j'ai réfléchi et aussi (parce que je suis faignant, non en fait futé ) j'ai cherché sur le net une solution à mon problème
Et je n'ai rien trouvé ... En fait pas tout à fait, mais j'ai du construire ma propre solution.
Les solutions locales
Les solutions du genre tous les lundi je copie les nouvelles images de la semaine dans un autre dossier ne me convenait pas, et si j'oubliais ? Je ne voulais pas non plus avoir un rappel de ma messagerie ou de mon téléphone pour y penser.
Une tâche de synchronisation de dossier ou une simple copie au démarrage du PC, mouais un petit robocopy et zou ... mais pc éteint plus de neuf jours et zou aussi ...
Et puis en fait cette barre bing étant installée sur un pc au boulot (éteint lorsque je n'y suis pas), plus de neuf jours de congé et hop c'était foutu.
Internet
Une petite recherche sur internet pour trouver des galeries bing et ... en fait je n'en ai trouvé qu'une Bing Image Archive. Vous remarquerez l'image du jour n'est pas la même suivant le pays, ce qui me permet d'en déduire que les images du jours sont américaines avec la barre bing.
Par contre un gros inconvénient les images sont modifiées et perdent le copyright et la description. D'ailleurs je n'ai pas trouvé de galeries respectant ces trois critères 1920x1200, description et copyright.
Il y a aussi quelque solution logicielle, mais je n'ai vraiment pas accroché (genre devoir s'inscrire sur un site)
Investigation
Bon mais alors comment ça marche ? Car les photos sur mon PC elles respectent bien les trois critères.
J'aurais bien aimé pour mes investigations avoir sous la main un logiciel capable de me lister les échanges (en fait les urls) entre ma barre bing et le serveur bing, mais bon si jamais je tombe dessus par inadvertance je le mettrai de côté.
J'ai quand même découvert l'url de base d'un fichier XML http://www.bing.com/hpimagearchive.aspx?format=xml&idx=%d&n=1&mbl=1&mkt=en-ww. Ce fichier contient des informations nécessaires et suffisante pour récupérer l'image du jour.
Bon, joueur comme je suis, j'ai essayé la même url avec fr-fr en lieux et place du en-ww, mais il n'y a pas la résolution 1920x1200 de disponible (ce qui explique que ce soit les photos américaines que je retrouve sur mon bureau)
Donc en regardant ce fichier on trouve la ligne suivante :
<urlBase>/az/hprichbg/rb/TigersNestMonastery_ROW8010930537</urlBase>
Et hop c'est fini il suffit d'ajouter www.bing.com devant et _1920x1200.jpg derrière et on obtient l'url de l'image.
Une parenthèse
J'avais envisagé un instant (en fait j'ai galéré un certain temps avant de me rendre à l'évidence que ce n'était pas possible) d'afficher l'image du jour en réduction sur ce site en utilisant le javascript, c'était alors au client d'aller chercher le fichier XML pour récupérer l'url de l'image. Mais voilà pas possible, pour des raisons de sécurité (et c'est logique, même si cela ne m'arrange pas) il est impossible d'aller chercher des fichiers sur un autre site en javascript.
Le code
Pour que cela marche donc il faut un hébergement qui accepte le cross-domain. Quoi !!! Tout simplement que le serveur exécutant votre script puisse récupérer chez bing des fichiers. Or ce n'est pas le cas de free, en fait, plus le cas actuellement. J'ai donc hébergé mon code sur un autre hébergement.
Le code n'est pas compliqué du tout d'ailleurs je ne l'ai même pas commenté, le voici
<?php $url_xml = 'http://www.bing.com/hpimagearchive.aspx?format=xml&idx=%d&n=1&mbl=1&mkt=en-ww'; $dat_xml = file_get_contents($url_xml); $deb = stripos($dat_xml,'<urlbase>'); $fin = stripos($dat_xml,'</urlbase>',$deb); if($deb != 0) { $url_img = 'http://www.bing.com'.substr($dat_xml,$deb+9,$fin-$deb-9).'_1920x1200.jpg'; $dat_img = file_get_contents($url_img); $deb = strripos($url_img,'/'); $nam_img = substr($url_img,$deb+1); $nam_dir = "c:\\tmp\\"; if (!file_exists($nam_dir.$nam_img)) file_put_contents($nam_dir.$nam_img,$dat_img); header("Content-type: image/jpg"); echo $dat_img; } ?>
Pour résumé :
- on récupère le fichier xml
- on extrait le nom de la photo du jour
- on construit l'url de la photo du jour
- on récupère la photo
- on la sauvegarde si ce n'est déjà fait
- on retourne l'image, comme cela en appelant ce script php on reçoit en retour l'image du jour
Et voilà le tour est joué ...
See You Next Time !