Meteo

Un article de Linuxette.

Jump to: navigation, search

Ce script permet de récupérer les informations METAR proche de chez vous. Il vous suffit de modifier la variable 'LFBL=xxx' pour votre ville (ou le code de la ville la plus proche). La sortie se fait soit avec du code html, soit en texte simple. Vous pouvez trouver une page contenant le résultat de ce script réactualisé à chaque chargement, ici: http://www.suinot.org. ( si un simple copier/coller de ce code ne semble pas fonctionner, cela vient peut-être de la syntaxe Mediawiki, qui n'apprécie pas certaines lignes de perl. Dans ce cas, écrivez moi, je vous ferais parvenir le code au format texte.)

A présent, le code:

   #!/usr/bin/perl -w
   # ----------------------------------------------------------
   # Par R. Suinot
   # Le 16 nov 2007
   # Derniere version: 18/04/2007
   # ----------------------------------------------------------
   # Parametre: si 0 -> affichage pour php
   #             si 1 -> sauvegarde en fichier log
   # ----------------------------------------------------------
   # ToDo:
   # utilisation des images
   # Taille: 512x256
   # Lib: PHP & GD
   # sauvegarde en fichier en fonction du mois et de l'annee
   # ex: nom de fichier pour novembre 2007: metar-11-2007.info
   # ligne du fichier: <heure> <temperature> <presion> <vitesse du vent> <direction du vent>
   # ----------------------------------------------------------
   
   #!/usr/bin/perl -w
   use Geo::METAR;
   use LWP::UserAgent;
   use strict;
   
   my $type = shift @ARGV;
   unless (defined $type and $type =~ /^[01]$/)
   {
           die "Usage: $0 <0|1>\n";
   }
   
   my $ua = new LWP::UserAgent;
   my $m = new Geo::METAR;
   my $metar;
   my $short_taf;
   my $long_taf;
   
   my $req = new HTTP::Request GET => "http://fr.allmetsat.com/metar-taf/france.php?icao=LFBL";
   
   my $response = $ua->request($req);
   print "<table>\n";
   if (!$response->is_success) {
       if ($type) {
               # type = 1 (mode console)
               # erreur dans la réponse: pas de message.
               } else {
               # type = 0 (mode html)
               print "<tr><td>Informations meteo actuelles indisponibles: </td></tr> \n";
               print "<tr><td>".$response->error_as_HTML;
               my $err_msg = $response->error_as_HTML;
               warn "$err_msg\n\n";
               print "</td></tr>";
               die "$!";
       }
   } else {
       my $page; 
       $page = $response->as_string;                   # grap response
       my @data=split (/\n/, $page);
       my $code;
       foreach $code (@data) {
               if ($code =~ m/METAR/){
                       my @liste=split(/<b>/, $code);
                       foreach (@liste){
                               if (/METAR/) {
                                       $metar=$';
                                       # ici, la ligne resemble a ca: :</b> LFBL 171300Z 07014KT CAVOK 04/M05 Q1022 NOSIG<br>
                                       /<br>/;
                                       $metar = $`;
                                       $metar =~ /<\/b>/;
                                       $metar = $';
                               } elsif (/short-TAF/) {
                                       $short_taf=$_;
                                       /<br>/;
                                       $short_taf = $`;
                                       $short_taf =~ /<\/b>/;
                                       $short_taf = $';
                               } elsif (/long-TAF/) {
                                       $long_taf=$_;
                                       /<br>/;
                                       $long_taf = $`;
                                       $long_taf =~ /<\/b>/;
                                       $long_taf = $';
                               }
                       }
               }
       }
   
       if (length($metar)<10) {
               if ($type) {
                       # type = 1 (mode console)
                       # erreur dans la réponse: pas de message.
               } else {
                       # type = 0 (mode html)
                       print "<tr><td> Meteo: informations METAR invales. </td></tr> \n";
                       die "Meteo: informations METAR invales.";
               }
       }
   
       $m->metar($metar);
   
       my $heure = $m->TIME;
       my $c_temp = $m->TEMP_C;
       my $pression = $m->ALT_HP;
       my $vent = $m->WIND_KTS;
       my $ms = ($vent*0.5144);
       my $kmh = ($vent*1.852);
       my $dir_deg = $m->WIND_DIR_DEG;
       my $direction;
       if ($dir_deg =~ /VRB/i) {
               $direction = "Variable";
       } else {
               if ($dir_deg < 15) {
                       $direction = "Nord";
               } elsif ($dir_deg < 30) {
                       $direction = "Nord/Nord-est";
               } elsif ($dir_deg < 60) {
                       $direction = "Nord-est";
               } elsif ($dir_deg < 75) {
                       $direction = "Est/Nord-est";
               } elsif ($dir_deg < 105) {
                       $direction = "Est";
               } elsif ($dir_deg < 120) {
                       $direction = "Est/Sud-est";
               } elsif ($dir_deg < 150) {
                       $direction = "Sud-est";
               } elsif ($dir_deg < 165) {
                       $direction = "Sud/Sud-est";
               } elsif ($dir_deg < 195) {
                       $direction = "Sud";
               } elsif ($dir_deg < 210) {
                       $direction = "Sud/Sud-ouest";
               } elsif ($dir_deg < 240) {
                       $direction = "Sud-ouest";
               } elsif ($dir_deg < 265) {
                       $direction = "Ouest/Sud-ouest";
               } elsif ($dir_deg < 285) {
                       $direction = "Ouest";
               } elsif ($dir_deg < 300) {
                       $direction = "Ouest/Nord-ouest";
               } elsif ($dir_deg < 330) {
                       $direction = "Nord-ouest";
               } elsif ($dir_deg < 345) {
                       $direction = "Nord/Nord-ouest";
               } else {
                       $direction = "Nord";
               }
       }
       if ($type) {
               # type = 1 (mode console)
               # print "$heure $c_temp $pression $vent $dir_deg\n";
               end_fichier($heure,$c_temp,$pression,$vent,$dir_deg);
           } else {
               # type = 0 (mode html)
               print " Informations METAR à $heure. \n";
               print "<tr>\n";
               print "<td>  Temp        : $c_temp C </td>";
               print "\n";
               print "<td>  Pression : $pression hPa </td>\n";
               print "</tr><tr>\n";
               print "<td>  Vent        : $vent kts ( $ms m.s / $kmh km/h.)</td>";
               print "\n";
               print "<td>  Direction: $direction ($dir_deg deg. ) </td>\n";
               print "</tr>\n";
       }
   
   #   $m->dump;
   print "</table>\n";
   
   }
   exit;
   
   sub end_fichier
   {
       my ($secondes, $minutes, $heures, $jour_mois, $mois,
               $an_offset, $jour_semaine, $jour_calendaire, $heure_ete) = localtime(time);
       my ($a,$b,$c,$d,$e) = @_;
       my $annee= 1900 + $an_offset;
       my $nom="/var/log/metar_".$mois."_".$annee.".info";
       # ouverture du fichier
   print "$a $b $c $d $e";
   #        open (FIC, ">>$nom") or die "open $nom: $! \n";
   #        print (FIC "$a $b $c $d $e\n");
   #        close (FIC);
   }
   __END__