Journal Filtre liferea pour lemonde.fr

Posté par  (site web personnel) .
Étiquettes : aucune
0
2
mai
2006

Il y a un truc qui m'énerve depuis longtemps sur le RSS du monde, les dépêches ont un corps vide disant d'aller sur le site.



J'ai donc fait vite fait un petit script qui bourrinement va chercher le contenu de la dépêche sur l'url indiquée et remplace le contenu du tag description.



Il suffit de dire à liferea de l'utiliser ("Utiliser un filtre de conversion" dans l'onglet "Source du flux") et voilà !



#!/usr/bin/ruby

require "rexml/document"
require 'uri'
require 'net/http'
require 'iconv'

doc = REXML::Document.new $stdin

doc.elements.each("//item") { |item|
if (item.elements['title'].text =~ /D\303\251p\303\252che/)
uri = URI.parse(item.elements['link'].text)
h = Net::HTTP.new(uri.host)
begin
resp,data = h.get(uri.path)
rescue
end
data.sub!(/^.*(.*?)<\/div.*\z/m, '\1')
data.sub!(/<img src="http:\/\/medias.lemonde.fr\/mmpub\/img\/let\/.\.gif" alt='(.)'/,'\1<')
data.gsub!(/<.*?>/, '')
data.gsub!(/\n/, '<br/>')
item.elements['description'].text = Iconv.iconv('UTF-8', 'ISO-8859-15', data)
end
}
doc.display
  • # Le même en bash ?

    Posté par  (site web personnel) . Évalué à -1.

    Dommage, il n'y a pas ruby sur slackware de base, en bash ça aurait été pas mal, d'autant que les depeches vides m'enerve aussi :)
    • [^] # Re: Le même en bash ?

      Posté par  (site web personnel) . Évalué à 2.

      J'ai hésité à le faire en bash, le corps de la boucle c'est facile par contre le remplacement du corps de <description> quand le titre contient une chaine c'est moins facile.

      Mais bon je ne doute pas que des gens vont essayer à la lecture de ce journal :)
    • [^] # [OT] Re: Le même en bash ?

      Posté par  . Évalué à 3.

      Dommage, il n'y a pas ruby sur slackware de base,
      Ça pourrait arriver bientôt. Extrait du Changelog de Current : Mon Apr 24 14:29:50 CDT 2006 [...] d/guile-1.8.0-i486-1.tgz: Upgraded to guile-1.8.0. I don't think anything in Slackware depends on guile any more, and that the only thing that ever did was a solitaire game in GNOME. Since the GNOME distributions for Slackware are already including their own guile packages, I'm considering this package for removal. How generally useful is it? Perhaps something like Ruby in the D series instead would be more useful.
    • [^] # Re: Le même en bash ?

      Posté par  . Évalué à 2.

      Pourquoi du bash ? C'est dommage, il n'y en a pas ssur FreeBSD de base.

      Du Ruby c'est bien. A la rigueur du perl, si on voulait reposer sur une base (quasi) universelle...
      • [^] # Re: Le même en bash ?

        Posté par  (site web personnel) . Évalué à 2.

        non, il n'y a pas de perl de base dans netbsd, et debian cherche à faire une distrib sans perl (pour les systèmes embarqués), et ne parlons même pas de ruby.
        Le mieux est clairement d'utiliser curl (ou équivalent) et awk.
        • [^] # Re: Le même en bash ?

          Posté par  . Évalué à 2.

          Pour Debian, c'est dur de virer Perl : perl-base est « required - essential » et/car beaucoup de paquets de base s'en servent.
  • # Ruby

    Posté par  . Évalué à 5.

    Je ne connais pas du tout Ruby, juste Perl (et de vagues notions de Python), mais ce petit script donne vraiment envie de le découvrir : la syntaxe semble agréable, bien orientée OO avec une once de fonctionnel, les libs complètes... Je sens que je vais m'y mettre. Merci.
  • # Zouper !

    Posté par  . Évalué à 1.

    Ca alors, c'est dans ma todolist pour demain !
    Bon, j'ai besoin d'un poil plus que ca, mais c'est toujours ca de gagner.
    Bien le merci et la licence ?
  • # Sinon pour akregator...

    Posté par  . Évalué à 4.

    J'ai remarqué il y a un moment, par hasard (c'est pour ça que je le poste ici, si d'autres ne l'ont pas vu... c'est bien caché) une option "Charger le site internet complet lors de la lecture des articles". Cela se trouve en effectuant un clic droit sur un flux, onglet Expert.

    Bon, évidement, vous avez droit à la pub, les menus, et votre lecteur de flux devient une sorte de navigateur "différent". J'aimait bien l'option de filtre de liferea... faudra que je regarde si ça peut se faire simplement...

    En fait le plus simple (enfin, "simple") serait de faire un petit deamon (à partir du filtre liferea peut-être ?), hop on fait tourner ça sur un port inocupé de sa machine, et tous les lecteurs de flux peuvent en profiter... je vais voir si c'est faisable... et si j'ai le temps.
    • [^] # Re: Sinon pour akregator...

      Posté par  . Évalué à 7.

      Bon, je suis arrivé à ça, mais mon perl est tellement rouillé (si tant est qu'il ait jamais été bon) et donc c'est assez limité : on a le droit qu'à une seule requete, puis ça plante. Mais si un (vrai, pas comme moi) mongeur passait par là et qu'il peut y jetter un coup d'oeuil, ça m'intéresserait...
      #!/usr/bin/perl
      #use strict;
      
      use File::Temp qw/ tempfile tempdir /;
      
      sub filtre {
          my $file;
          my $out;
          my $fh;
          my $outfh;
          ($file, $fh) = tempfile();
          ($out, $outfh) = tempfile();
      
          open FILE, ">$fh";
          print FILE $_[0];
          close FILE;
      
          system $_[1]." < ".$fh." > ".$outfh;
          system "echo >> ".$outfh;
          return $outfh;
      }
      
      
      use HTTP::Daemon;
      use HTTP::Response;
      use HTTP::Status;
      use LWP::UserAgent;
      
      my $d = new HTTP::Daemon;
      my $b = new LWP::UserAgent;
      
      print "Please contact me at: <URL:", $d->url, ">\n";
      while (my $c = $d->accept) {
          while (my $r = $c->get_request) {
              if ($r->method eq 'GET' &&  $r->url->path =~ /http/) {
      	    my $i = index($r->url->path, "http");
      	    my $cmd = substr($r->url->path, 0, $i);
      	    my $req = new HTTP::Request GET=>substr($r->url->path,$i);
      	    my $res = $b->request($req);
      
      	    if ($res->is_success($req)) {
      		$c->send_file_response(filtre($res->content, $cmd));
      		$c->close;
      	    } else {
      		$c->send_error(RC_FORBIDDEN);
      	    }
              } else {
                  $c->send_error(RC_FORBIDDEN)
              }
          }
          $c->close;
          undef($c);
      }
      
      En gros, il faudrait permettre au daemon html de tenir plusieurs requetes simultanées (fork ?), il faudrait (avant ça) qu'il puisse en gérer... plusieurs un après l'autre. Et il faudrait pouvoir choisir le port du serveur... Sinon, dans votre lecteur de flux, vous mettez comme adresse http://localhost:PORT/PATH/URL par exemple si au lancement le script vous dit port 50000, que vous voulez voir le rss du monde avec le script de pascal installé dans /home/vous/bin/monde ça donne plus ou moins : http://localhost:50000/home/vous/bin/mondehttp://www.lemonde(...) . Le pire c'est que je n'ai pas essayé avec un script réel, j'ai juste essayé avec /bin/cat, et ça marchait ;-). Si personne ne peut améliorer cette version stand-alone, je verrais si je peux faire une version pour mod_perl.
      • [^] # Re: Sinon pour akregator...

        Posté par  . Évalué à 7.

        Bon, pour commencer, il faut enlever le $c->close qui est 11 lignes avant la fin. Après c'est possible de faire plusieurs requetes une deriere l'autre.

        Ah, aussi, évitez de faire tournez le truc de façon visible : http://vous.com/bin/ls/http://autrechose ainsi que plein d'autres injections possibles ;-)

        Le gars qui a programmé ça est vraiment trop nul... ;-)
      • [^] # Re: Sinon pour akregator...

        Posté par  . Évalué à 5.

        c'est du perl ça ? ya pas trop de lignes ? :-)
      • [^] # Re: Sinon pour akregator...

        Posté par  . Évalué à -5.

        Merci, de la part de tous les utilisateurs de ruby, merci ; tu viens de nous éviter de longues explications du pourquoi ruby face à perl : pour les 3 ou 4 qui hesitaient encore (probablement des utilisateurs d'emacs en plus)
        • [^] # Re: Sinon pour akregator...

          Posté par  . Évalué à 4.

          moi j'ai pas compris ce que tu voulais dire... Ce que j'ai écrit n'est pas du tout équivalent au script plus haut. En plus mon script n'est pas du tout lisible, mais tu peux essayer de le rendre plus lisible avec sed
          (enfin, c'est l'idée : s/d/demon/ s/c/connexion/ s/r/requete/ s/req/requete/ s/res/resultat/ s/b/browser/ )

          les deux seuls trucs pas jolis sont : 1. je n'ai pas trouvé comment faire un appel de commande en pipant l'entrée et la sortie directment et 2. le découpage de la chaine, qui n'est déjà pas belle au départ ;-)

          Ensuite, j'ai jamais dit que j'était capable d'exploiter un language de script, je n'aime pas trop ça, je fait juste un truc "qui marche"

          (j'ai bien marché dedans, en plus)
          • [^] # Re: Sinon pour akregator...

            Posté par  . Évalué à 0.

            Hey oh les zamis, c'était une blague, allez revenez !
            Je sais bien que tu n'as pas fais la même chose, j'aime pas Perl, mais je sais lire :)
            C'était juste une taquinerie sur la syntaxe Perl (aka tractopele) vs Ruby (aka fleur des champs)
        • [^] # Re: Sinon pour akregator...

          Posté par  . Évalué à 1.

          Merci pour ceux qui code en Ruby avec Emacs ;)
  • # Proposer l'extension au dépôt Snownews ?

    Posté par  . Évalué à 2.

    Comme ce script peut intéresser du monde, il serait peut être bon de le proposer au site snownews, non ?

    http://kiza.kcore.de/software/snownews/snowscripts/
  • # Sage

    Posté par  (site web personnel) . Évalué à 2.

    Excellent, ce script, merci bien. Liferea est mon lecteur de RSSpar défaut. Mais des fois, j'utilise l'extension Sage, pour Firefox. T'as pas le même pour Sage ??? :-D
    • [^] # Re: Sage

      Posté par  . Évalué à 2.

      tout pareil, en plus il sent bon ton script.

      merci Pascal
  • # Tant qu'on y est...

    Posté par  . Évalué à 2.

    Est-ce que quelqu'un aurait un filtre pour virer les entrées de Michael Meeks sur planet.gnome.org?

    J'ai régulièrement envie de virer ce flux rien qu'à cause de lui.
  • # Marche pô...

    Posté par  . Évalué à 2.

    J'ai l'impression qu'il manque un truc là (le script n'ajoute aucun contenu aux item "Dépêche: ..."), et je soupçonne que c'est une balise <div class="ar-txt"> juste avant la parenthèse ouvrante, dans la regexp qui choppe le contenu du div intéressant.
    C'est probablement templeet qui l'aura mangé...

    Mais il faudra que j'attende un MAJ du flux pour être sûr (ou bien que qlq'un me dise si il est possible de forcer la relecture d'un flux dans Liferea, sans envoyer de timestamp HTTP).
  • # pointilleux

    Posté par  (site web personnel) . Évalué à 2.

    Je vais jouer le pointilleux mais :
    Bien que le site soit public, en allant chercher de manière systématique et automatique les derniers contenus en ligne, tu tombent probablement sur le droit des bases de données et tu dois avoir une autorisation pour ça.

    Je ne dis pas ça pour ce script là qui ne fait pas de mal, mais plus ppour prévenir car le diffuser avec liferea, avec une distrib ou dans un cadre plus grand peut poser problème.
    • [^] # Re: pointilleux

      Posté par  (site web personnel) . Évalué à 2.

      Moi, je vois un autre problème.
      Il me semble que lorsqu'on met en place un flux RSS, on peut choisir d'y inclure ou non le contenu de l'article.
      Manifestement, le journal Le Monde ne l'a pas souhaité. Est ce alors vraiment "éthique" de récupérer ainsi automatiquement des articles qui volontairement n'ont pas été inclus dans le RSS ?
      Ca me semble allez à l'encontre du choix de ce journal.
      • [^] # Re: pointilleux

        Posté par  . Évalué à 2.

        Ca me semble allez à l'encontre du choix de ce journal.

        Pas forcément : ils ont décidé de ne pas diffuser le corps à tout le monde. Rien ne dit qu'ils refuseraient de le faire pour ceux qui le souhaiteraient. Sauf que c'est lourd, pour eux (choix => gestion du choix => deux flux) et pour l'utilisateur (hou là, un choix). Et puis d'aucuns peuvent trouver que recevoir tout l'article alors qu'ils ne sont pas intéressés est plus lourd que de cliquer pour avoir l'article complet s'il les intéresse.
        Évidemment, on peut aussi penser qu'ils préfèrent que l'on visite leur site (avec les pubs ;o).

        Enfin, un robot qui récupère un contenu qu'un humain lira, ce n'est pas la même chose qu'un syphonage de site vers /dev/null simplement pour les ennuyer. C'est encore moins comparable aux gadgets qui pompent toutes les 5 min des sites de météo pour afficher de jolis nuages/soleil pour les 10 jours à venir.
    • [^] # Re: pointilleux

      Posté par  (site web personnel) . Évalué à 4.

      Redistribuer le RSS ainsi généré serait un problème. Télécharger une page et la modifier pour que la présentation soit plus conforme à mes gouts, pour moi c'est de la copie privée.
      • [^] # Re: pointilleux

        Posté par  (site web personnel) . Évalué à 2.

        La copie privée est une exception aux droits d'auteur. Sauf erreur de ma part l'automatisation du téléchargement d'une base de donnée relève d'un tout autre article de loi et n'est pas concerné par le droit d'auteur (et donc la copie privé).
        Quelqu'un pour confirmer/infirmer ? (de toutes façons ça reste théorique, personne ne t'embêtera pour ça je pense)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.