banneer2

Réducteur d'URL tinad:

Collez l'adresse du site:

Rechercher sur le blog du grouik:

atom.jpgPour coder un flux RSS ou un flux ATOM sur un site, il faut d'abord savoir comment l'organiser. Ne nous prenons pas la tête dans les normes et standards, spécifications RFC... Dotclear l'a fait. Sous forme d'un fichier de template, c'est plus facile à appréhender. Dans un premier temps j'utilise ces derniers, en ajoutant mes commentaires pour faire ce mémo. Plus loin, j'ai noté la façon de générer les dates au bon format et d'encoder le contenu des éléments du flux.

Structure

l’entête

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <feed xmlns="http://www.w3.org/2005/Atom"
  3. xmlns:dc="http://purl.org/dc/elements/1.1/"
  4. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  5. xml:lang="fr">
  6.  
  7. <title type="html">__LE TITRE DU FLUX ENCODÉ POUR L'XML__</title>
  8. <subtitle type="html">__LA DESCRIPTION DU SITE ENCODÉ XML__</subtitle>
  9. <link href="__LA PROPRE ADRESSE DE CE FLUX__" rel="self" type="application/atom+xml"/>
  10. <link href="__L'URL DU SITE__" rel="alternate" type="text/html"> title="__LE TITRE DU SITE__"/>
  11. <updated>__LA TOUTE DERNIERE DATE DE MODIFICATION__</updated>
  12. <author>
  13. <name>__L'AUTEUR__</name>
  14. </author>
  15. <id>L URL DU SITE</id>
  16. <generator uri="__BAH HEU L'ADRESSE DE VOTRE SITE__">__SELFMADE__</generator>

Chaque élément du flux:

chaque élément du flux commence par <entry> et est cloturé par </entry>

  1. <entry>
  2. <title>LE TITRE DE LELEMENT</title>
  3. <link href="SON URL" rel="alternate" type="text/html" title="SON TITRE" />
  4. <id>SON URL</id>
  5. <published>DATE DE PUBLICATION</published>
  6. <updated>LA DERNIERE DATE DE MODIFICATION</updated>
  7. <author><name>NOM DE L'AUTEUR</name></author>
  8. <dc:subject>SUJET, LA CHEZ DOTCLEAR ILS METTENT LA CATEGORIE</dc:subject>
  9. <dc:subject>SUJET IDEM, UN TAG PAR EXEMPLE</dc:subject>
  10. <content type="html">LE CONTENU</content>
  11. <link rel="enclosure" href="URL DE L'EVENTUELLE PIECE JOINTE" length="SA TAILLE" type="SON TYPE" />
  12. <wfw:comment>L'URL DES EVENTUELS COMMENTAIRES</wfw:comment>
  13. <wfw:commentRss>LE FLUX DES COMMENTAIRES</wfw:commentRss>
  14. </entry>

Et on termine notre fichier par:

  1. </feed>

Headers HTML

Le fichier Php, apache va l'envoyer avec comme mime type "text/html", il suffit de préciser dès le début du script php:

  1. header('Content-type: application/atom+xml');

Le format des dates.

C'est le format ATOM, et je n'ai pas trouvé comment faire en sorte que MySQL le fournisse de la bonne manière directement. Pour récupérer le timestamp UNIX (format différent du timestamp MySQL), on fait la requête de cette manière:

  1. SELECT UNIX_TIMESTAMP(createdtime) .....

createdtime est le nom de la colonne.

En en PHP pour obtenir la date au format ATOM à partir du timestamp unix, c'est simplement comme ça:

  1. $DateAtom=date(DATE_ATOM, $VariableTimestampUnix);

L'encodage de l'HTML

Bah oui, on fournit des éléments au format html qui est un langage balisé tout comme le XML (l'ATOM est du XML),Pour qu'il n'y ait pas de confusion, il faut modifier ça.

Tout ce qui se trouve dans des balises indiquant type="html" ou type="text/html" doit etre traité préalablement. La function htmlentities de PHP doit être utilisée, avec l'option ENT_QUOTES. de cette manière:

  1. htmlentities($string,ENT_QUOTES);

Quelques liens:

Conclusion

Si j'ai écrit ce billet c'est parce que j'ai mis un flux ATOM au nouveau site Tinad Image board Bon la structure de la base de données n'est pas un secret., voici en exemple le script PHP qui génère le flux ATOM de l'image board. Si ça peut aider de l'avoir sous les yeux.

  1. <?php
  2. // by Gnieark 01/2011 http://blog-du-grouik.tinad.fr
  3. header('Content-type: application/atom+xml');
  4. echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
  5. <feed xmlns="http://www.w3.org/2005/Atom"
  6. xmlns:dc="http://purl.org/dc/elements/1.1/"
  7. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  8. xml:lang="fr">
  9. <title type="html">Image Board Tinad</title>
  10. <subtitle type="html">Board tinad est un image board, un site de partage de medias, francophone, sans inscription, anonyme</subtitle>
  11. <link href="http://board.tinad.fr/atom.php" rel="self" type="application/atom+xml"/>
  12. <link href="http://board.tinad.fr" rel="alternate" type="text/html" title="Image Board Tinad"/>
  13. <?php
  14. function username($string)
  15. {
  16. if ($string == ''){
  17. return 'Anonyme';
  18. }else{
  19. return ($string);
  20. }
  21. }
  22. function contenu($id,$img,$comment)
  23. {
  24. //je fais le choix de mettre les commentaires dans le cotenu de l'élément sur ce site
  25. $html="<p><a href=\"http://board.tinad.fr/images/".$img."\"><img src=\"http://board.tinad.fr/images/thumb-".$img."\" alt=\"image\"/></a><br />".$comment."</p>";
  26.  
  27. $rscomment=mysql_query("SELECT createdtime, media_filename, media_fileext,media_hasthumb,titre,commentaire,user_pseudo,id
  28. FROM reponses
  29. WHERE parent='".$id."' ORDER BY createdtime DESC");
  30. while ($rcomment=mysql_fetch_row($rscomment))
  31. {
  32. $html.="<p><b>R&eacute;ponse de ".username($rcomment[6])." ".$rcomment[0]."</b></p><p>";
  33. if ($rcomment[1]!= "")
  34. {
  35. $html.="<a href=\"http://board.tinad.fr/images/".$rcomment[1].".".$rcomment[2]."\">
  36. <img src=\"http://board.tinad.fr/images/thumb-".$rcomment[1].".".$rcomment[2]."\" alt=\"img\" /></a><br />";
  37. }
  38. $html.=$rcomment[5]."</p>";
  39. }
  40. return $html;
  41. }
  42. include ("config.php");
  43. if (!mysql_connect($config['mysql_host'], $config['mysql_user'], $config['mysql_password'])) {
  44. echo 'Impossible de se connecter à MySQL';
  45. }
  46. mysql_query("USE ".$config['mysql_database']);
  47.  
  48. //Pour récupérer la date de modification la plus récente:
  49. $rupdtedtime=mysql_query("SELECT UNIX_TIMESTAMP(updatetime) FROM posts ORDER BY updatetime LIMIT 0,1");
  50. $rsupdtedtime=mysql_fetch_row($rupdtedtime);
  51. $updtedtime=$rsupdtedtime[0];
  52.  
  53. //Requete pour trouver les 20 derniers éléments
  54. $sql="SELECT
  55. UNIX_TIMESTAMP(createdtime), media_filename, media_fileext, titre, commentaire, id,user_pseudo, nbe_reponses, UNIX_TIMESTAMP(updatetime)
  56. FROM
  57. posts
  58. ORDER BY
  59. createdtime DESC
  60. LIMIT 0,20";
  61. $rs=mysql_query($sql);
  62.  
  63.  
  64. ?>
  65. <updated><?php echo date(DATE_ATOM, $updtedtime);?></updated>
  66. <author>
  67. <name>Gnieark</name>
  68. </author>
  69. <id>http://board.tinad.fr/</id>
  70. <generator uri="http://board.tinad.fr/">SELFMADE</generator>
  71. <?php
  72. while ($r=mysql_fetch_row($rs))
  73. {
  74. //Là commence l'affichage des elements:
  75. ?>
  76. <entry>
  77. <title>Post <?php echo $r[5]." Par ".htmlentities(username($r[6])." - ".$r[3],ENT_QUOTES); ?></title>
  78. <link href="http://board.tinad.fr/index.php?post=<?php echo $r[5]; ?>" rel="alternate" type="text/html" title="<?php echo htmlentities($r[3]." Par ".username($r[6]),ENT_QUOTES); ?>" />
  79. <id>http://board.tinad.fr/index.php?post=<?php echo $r[5]; ?></id>
  80. <published><?php echo date(DATE_ATOM, $r[0]);?></published>
  81. <updated><?php echo date(DATE_ATOM, $r[8]);?></updated>
  82. <author><name><?php echo username($r[6]); ?></name></author>
  83. <content type="html"><?php echo htmlentities(contenu($r[5],$r[1].".".$r[2],$r[7]),ENT_QUOTES); ?></content>
  84. </entry>
  85. <?php
  86. }
  87. ?>
  88.  
  89. </feed>

Commentaires

1. Le vendredi, février 4 2011, 12:52 par Ellny
gravatar

Pour la date au format Atom, il suffit d'enregistrer avec date("c") dans un champ de la BDD

2. Le vendredi, février 4 2011, 17:46 par gnieark
gravatar

oui, à condition d'enregistrer la date dans un champs text ou varchar Intéressant, pour se simplifier les conversions.

La limite, c'est que tu ne pourras plus faire de ORDER BY tadate, car ton champs texte il va le classer par ordre alphabétique. mais en effet si ton appli n'en a pas besoin, faut pas se géner.

3. Le samedi, février 19 2011, 19:33 par coenonympha
gravatar

Bonsoir,

merci pour ce tutorial bien sympa et très complet ! J'ai justement à cette occasion suivi ce tuto pour créer le flux RSS du site de mon école. Tout marche à peu près mais j'ai l'impression que le flux ne marche pas très bien suivant les applications. Par exemple, le marque page dynamique de Firefox ne m'affiche aucun article, pareil quand j'essaye d'importer le flux dans un groupe LinkedIn...

Pourriez-vous m'expliquer d'où cela peut venir ?

Voici l'adresse du flux : http://imac.alwaysdata.net/rss.php .

Merci par avance

4. Le samedi, février 19 2011, 22:47 par gnieark
gravatar

Bonjour,

Tous les éléments de votre flux ont le même id
http://imac.alwaysdata.net/index.ph...

Vu la façon dont est fait votre site, c'est pas évident car chaque actualité n'a pas une URL propre. Peut être qu'en modifiant un peu la structure du site et en ajoutant des ancres aux titres des actualités, puis dans le flux atom fournir dans l'id l'URL avec le lien vers l'ancre genre http://imac.alwaysdata.net/index.ph...

ça passera mieux au niveau des agrégateurs

5. Le dimanche, février 20 2011, 10:49 par coenonympha
gravatar

Bonjour,

merci de votre réponse rapide, j'ai donc modifié en conséquence la structure de ma page d'actualité, elle peut maintenant prendre un id en paramètre pour afficher la news correspondante. Je génère donc maintenant dans mon flux des id propres à chaque article mais mon problème reste entier : curieusement le marque page dynamique firefox ne m'affiche tjs pas d'articles :(.

6. Le dimanche, février 20 2011, 11:53 par Gnieark
gravatar

De chez moi ça marche:

iwacrss.jpg

Et ça passe sans erreur au w3c validate:
http://validator.w3.org/feed/check....

Et j'ai testé sous google reader, c'est OK aussi.

Je rajouterai juste un petit détail, pour chaque entry de préciser le link alternate:

par exemple:
<link href="http://board.tinad.fr/index.php?pos..." rel="alternate" type="text/html" title="poney Par Anonyme" />

ça permet d'avor un lien vers la page originale depuis le flux

7. Le dimanche, février 20 2011, 17:39 par coenonympha
gravatar

Bonsoir,

les marques pages dynamiques marchent maintenant que j'ai ajouté le lien. Par contre, l'importation de ce flux reste tjs un problème dans des applications comme facebook ou linkedin mais, je m'en passerai : ce n'est pas grave.

Merci en tout cas pour votre aide.

8. Le dimanche, février 20 2011, 22:54 par gnieark
gravatar

Bonsoir, de rien au contraire, ça me fait plaisir d'avoir des retours, Ellny et toi se sont appuyés sur ce billet, c'est plutot cool.

Pour facebook, J'ai fait divers essais, à la moindre erreur html dans les contenus des billets, au moindre caractere qu'il n'aime pas, ou si certaines balises ont un style qui est indiqué dans la balise et pas dans le CSS, il rejete tout le flux.

Il y a peu de flux qui passent par facebook, et je me demande si ce n'est pas une stratégie de leur part... autant avant ils étaient dans un objectif d'attirer les gens vers facebook (donc s'ouvraient aux flux), à présent ils sont dans l'idée de les maintenir captif. donc éviter qu'ils rédigent ailleurs et inciter à la création d'applications facebook dont ils ont le contrôle.

Une solution alternative pour publier automatiquement sur facebook, c'est d'utiliser ping fm (il a des défauts) ou de coller le lien à la main à chaque nouvel article.

Ajouter un commentaire

Nom ou pseudo:
Adresse email:
Site web (facultatif):
Commentaire:

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : http://blog-du-grouik.tinad.fr/trackback/816

Fil des commentaires de ce billet

Dans la même catégorie:
dev web


Creer un tchat (chat) en AJAX php

bulle_tchat-406.jpg
Un tchat, mélangeant les techniques suivantes: javascript, AJAX, PHP, mysql et JSON, en moins de 150 lignes. Il y a quelques mois Hempstar proposait sur ce blog sa version du chat. Comme j'ai énormément progressé dans ces langages de programmation, je me demandais si je saurai le faire, en quelques

Lire la suite...



Php, générer un e-mail avec plusieurs pièces jointes.

E-mail
Voici une fonction pour envoyer un e-mail en PHP avec des pièces jointes quelque soit leur extension (ou presque). La machine qui m'a servi à faire les tests est un champs MX du domaine, et l'adresse de l'expéditeur appartient au domaine (ça aide.) Le résultat des essais: Vers une boite e-mail free

Lire la suite...


setAttribute - Patch pour internet explorer - Javascript

Internet explorer interprète mal ou pas du tout la function setAttribute. Ci dessous mon prototype à insérer en début de script pour patcher ce navigateur. Il manque surement des cas particuliers que je n'ai pas pris en compte, il suffira de rajouter des "case" dans ce prototype.

Lire la suite...


Le sélecteur de dates en javascript Version 0.3.1

calendriers.jpg
Edit du 17/11/2011, passage en version 0.3.1 pour patcher internet explorer. test ok sur IE8 et IE 9, les autres versions n'ont pas été testées. L'objet de ce codage est de permettre l'intégration simple (#feignasse) sur des sites web d'un sélecteur de date plus sexy que 3 listes déroulantes. Je me

Lire la suite...


Un filtre antispam supplémentaire pour dotclear

kill the spam
J'ai remarqué que les spammeurs qui sévissent sur mon blog, ont souvent ces deux points communs: Le nom de l'auteur contient la description du site dont il fait la promotion, souvent plus de trois mots. Il a renseigné un lien vers un site internet, évidemment. Vu que dans les commentaires légitimes,

Lire la suite...


Propulsé par Dotclear