C'est la première étape qui est la plus importante et la plus complexe (encore que :), et c'est donc celle-ci que je publie ici. Ce script donne notamment un bon exemple de manipulation de fichier XML par le DOM en Perl.
On remarque notamment une grande utilisation de certains modules Perl correspondant aux dates. Il faut noter que certains des modules ne sont pas accessibles en paquet Debian, il est alors nécessaire de les installer différemment (par CPAN[1] par exemple).
fetch_rss.pl
#!/usr/bin/perl # use LWP::Simple; use XML::LibXML; use DateTime; use DateTime::Format::HTTP; use DateTime::Format::DBI; use DBI; use strict; use warnings; my $db_type = "mysql"; my $db_user = "user"; my $db_pass = "xxx"; my $db_hostname = "hostname"; my $db_database = "database"; my $db_table = "rss"; my %friends = ( moi => 'http://www.everlong.org/blog/rss.php', yod => 'http://www.thedarksideoftheyod.net/blog/rss.php', 'yod (photoblog)' => 'http://www.thedarksideoftheyod.net/photoblog/index.php?x=rss', ben => 'http://www.dream-letter.net/rss.php', ); my $xmlparser = XML::LibXML->new(); my $dsn = "DBI:$db_type:database=$db_database;host=$db_hostname"; my $dbh = DBI->connect($dsn, $db_user, $db_pass) or die "La connexion à la base de données a échouée : " . $DBI::errstr; my $dateparser = DateTime::Format::DBI->new($dbh); my $sth = $dbh->prepare("INSERT IGNORE INTO $db_table SET who=?, title=?, link=?, date=?") or die "Erreur lors de la préparation sql : " . $dbh->errstr; foreach my $friend (keys %friends) { next unless $friends{$friend}; my $content = get($friends{$friend}) or warn("N'a pas réussi à prendre le rss de $friend"), next; my $rss; eval { $rss = $xmlparser->parse_string($content) }; do { warn $@; next; } if $@; my @items = $rss->getElementsByLocalName("item"); foreach my $item (@items) { my ($title, $link, $date); my $child = $item->firstChild(); while ($child) { next unless $child->localname; $title = $child->textContent if $child->localname =~ /^title$/; $link = $child->textContent if $child->localname =~ /^link$/; $date = $child->textContent if $child->localname=~ /^date$/; $date = $child->textContent if $child->localname=~ /^pubDate$/; } continue { $child = $child->nextSibling(); } if ($date) { $date = DateTime::Format::HTTP->parse_datetime($date); } else { $date = DateTime->now(); } $sth->execute($friend, $title, $link, $dateparser->format_datetime($date)) or die "L'éxecution SQL a échoué : " . $sth->errstr; } } $sth->finish; $dbh->disconnect();
Notes
[1] Accessible en ligne de commande par perl -MCPAN -e shell
4 réactions
1 De Thom - 23/05/2005, 17:36
moi j'ai pas compris ? le Perl est exécuté quand ? à chaque chargement de la page ?
2 De Félash - 23/05/2005, 17:42
Nan, en cron toutes les heures.
3 De Oncle O - 24/05/2005, 05:24
Je veux pas jouer les prof felash mais ton code est faux...
on dit pas "or die "La connexion à la base de données a échouée : " . $DBI::errstr;"
mais "a echoue"...
sinon pour le reste je sais pas
4 De Félash - 24/05/2005, 09:45
ah oué, t'as pas tort; ça me réussit pas l'IRC :)