Perl Mechanize

Perl es un poco cabrón, para los novatos como yo, pero tiene cosas guapas guapas. Un ejemplo WWW:Mechanize para hacer scripts que 'interactuen' con paginas web. Aquí pongo un script que se logea a una pagina web y se baja un informe que después pasea para incrustarlo en una wiki (dokuwiki), ademas como tengo varios centros, hago que el script solicite el informe para cada centro.

Hay que tener presente que:
  1. Tuve que analizar un poco el codigo javascript que tiene la web para conocer el enlace final del informe que necesitaba (u otra forma de hacerlo es con un navegador tradicional solicitar el informe mientras tienes un tcpdump -X o wireshark corriendo para ver que url solicita el navegador).
  2. Tengo la suerte que la web tiene la opcion de descargar el informe en formato tabla de calculo, aunque realmente es un texto con campos delimitados por tabuladores

#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Mechanize;

my $m = WWW::Mechanize->new( autocheck => 1 );
my %hotels = (
          ACV => "intern code from web",
          HCB => "intern code from web",
          HCG => "intern code from web",
          HCM => "intern code from web",
          HCV => "intern code from web");
my $centre;
my $wikifile="/home/wiki/data/pages/.../wiki-page.txt";
my $year;

# parser cap a dokuwiki
sub wiki {

   open(OUT, ">>", $wikifile);

   # pillar contenido web y parsear
   my $web = shift;
   my $centre = shift;
   $web =~ s/\x00//g;
   $web =~ s/\xff//g;
   $web =~ s/\xfe//g;
   $web =~ s/\t/\ \ \|\ \ /g;
   $web =~ s/\x09/\ /g;
   my @array = split('\n', $web);

   # 1era linea = cabeçera, quiero los mios
   shift @array;
   print OUT "\n===== $centre =====\n\n";
   print OUT "^ MES ^ RESERVAS ^ HABS/NITS ^ AVG. NITS ^ ANTELACIO ^ PREU MIG ^ EUROS ^ EUR EXTRA ^ TOTAL ^ . ^ . ^\n";
   foreach (@array)
   {
      print OUT "|   $_   |";
      print OUT "\n";
   }
   close(OUT);
}
# Año actual
(undef,undef,undef,undef,undef, $year,undef,undef,undef) = localtime(time);
$year += 1900;

#eliminamos archivo wiki anterior
unlink $wikifile;

# Auth
$m->get('https://paginaweb/login.jsp');
$m->form_id('login');
$m->field('username', 'usuario');
$m->field('password', 'password');
$m->submit();

# per cada centro
foreach (keys %hotels)
{
  # canvio de centro via formulario de la web
  $m->get('http://pagina web/reports.jsp');
  $m->form_name('change_hotel');
  $m->select('h_g_id', $hotels{$_});
  $m->field('change_hotel','true');
  $m->submit();

  # Pillo el centro actual del titulo de la web
  #$centre = $m->content();
  #$centre =~ /\<title\>(.*?)\|(.*?)\<\/title\>/;
  #print $1 ." \n";

  # pillo el informe y lo meto en la wiki
  $m->get("http://paginaweb/blabla/reportxls.jsp?report=blablabla");
  wiki ($m->content(), $_);
}

# user y group = www-data
chown 33, 33, $wikifile;

Comentarios