Sunteți pe pagina 1din 5

DESARROLLO Perl: Scripting

Evitamos las molestas pginas de bienvenida WiFi

APROBADO RPIDO
navegador. POR MICHAEL SCHILLI

Un script en Perl ahorra a los usuarios la molesta tarea de pulsar en las pginas de bienvenida del proveedor de WiFi, acepta automticamente los trminos de uso y permite acceder lo ms rpido posible sin un

ntes de que los hoteles, cibercafs o aeropuertos dejen que los nuevos usuarios accedan a sus redes WiFi, redirigen las peticiones del navegador (Figura 1), haciendo que sus potenciales clientes tengan primero que lidiar con una pgina de bienvenida (Figura 2). Al llegar a esa pgina, lo que se ve son trminos de uso sin fin que nadie lee de todos modos casillas de verificacin que tenemos que habilitar, anuncios o las tres cosas. Los proveedores de WiFi configuran estas pginas de bienvenida como obstculos que les permiten centralizar el registro de direcciones MAC del cliente en la red WiFi y recordar al usuario sus obligaciones como internauta ejemplar. Una vez que hemos pasado por todas estas etapas obligatorias, el punto de acceso baja su puente levadizo y nos da el acceso web y la capacidad de abrir conexiones TCP arbitrarias a Internet (Figura 3).

Sin Web No Hay Acceso


En algunos casos, los usuarios ni siquiera quieren acceder a la web, sino que slo desean abrir un tnel SSH. Luego, con un terminal abierto y el navegador cerrado, se sorprenden de que se les asigne una direccin IP, aunque el cortafuegos, obviamente, est bloqueando el acceso a Internet. El script Perl splash descrito en este artculo ayuda a los usuarios con este dilema colndose a travs de los formularios web que se encuentran entre el usuario con muchas ganas de empezar y el acceso pleno a Internet. Para ello, splash pulsa en todos los enlaces, activa todas las casillas, acepta todas las cookies y las enva gentilmente de regreso al proveedor de WiFi, que piensa que se trata de un ser humano real y vivo que est utilizando su navegador para toda esta comunicacin.

Figura 1: El usuario ha solicitado google.com, pero previamente la red WiFi lo lleva a la pgina de bienvenida del proveedor.

48

Nmero 72

WWW.LINUX- MAGAZINE.ES

Perl: Scripting DESARROLLO

Figura 2: El WiFi del hotel redirige la primera peticin del navegador a una pgina de bienvenida.

Figura 3: Los usuarios simplemente tienen que pulsar para acceder a los trminos de usuario, y podrn navegar durante 24 horas.

Tcticas de Plugin Flexibles


Pero, cmo puede un sencillo script manejar lo que podran ser miles de configuraciones diferentes de pginas de bienvenida? Los proveedores de WiFi podran crear complejas formas o incluso utilizar su artillera pesada como animaciones Flash o JavaScript para defenderse de los scripts automticos. Para contrarrestar esto, el script confa en una estrategia de plugin que permite al usuario, o a un tercero, modificarlo para controlar los nuevos mtodos. Cada plugin prueba su propio enfoque para flanquear la pgina de bienvenida. Por ejemplo, el plugin ClickAllLinks.pm se hace camino pulsando en todos los enlaces de la pgina, mientras que CheckBoxFill.pm

habilita todas las casillas de verificacin que aparecen en el primer formulario web antes de pulsar el botn enviar. Los usuarios slo tienen que aadir nuevos plugins en el directorio de plugins, a continuacin el script los recoge automticamente, sin necesidad de ninguna configuracin, y lo intenta con ellos como una nueva tctica. Cada vez que un plugin completa su ejecucin, el script Splash hace una peticin a http:// www. google. com para ver si realmente devuelve la pgina web o si aparece otra pgina de bienvenida en el camino. Si el

intento de acceso no se realiza correctamente, el script lo intenta con el siguiente plugin. De lo contrario, nos devuelve un mensaje de xito y finaliza.

Abajo con el Muro


La Figura 4 muestra cmo reacciona el script si la conexin de red no est activa porque el usuario no ha seleccionado ninguna de las redes WiFi disponibles o no ha introducido la contrasea WPA. Mientras las peticiones a Google devuelvan errores, o se congelen durante ms de cinco segundos, el script se

Listado 2: ClickAllLinks.pm
01 ############################# 02 package SplashJumper::Plugin:: ClickAllLinks; 03 ############################# 04 # Mike Schilli, 2010 05 # (m@perlmeister.com) 06 ############################# 07 use Log::Log4perl qw(:easy); 08 09 ############################# 10 sub register { 11 ############################# 12 return click-all-links, 13 10; 14 } 15 16 ############################# 17 sub process { 18 ############################# 19 my ($self, $mech) = @_; 20 21 for 22 my $link ($mech->links()) 23 { 24 25 INFO Clicking on , 26 $link->url(); 27 my $resp = 28 $mech->get($link); 29 30 INFO Got , 31 length($resp->content()), 32 bytes back; 33 34 $mech->back(); 35 } 36 } 37 38 1;

Listado 1: SplashJumper.pm
01 ############################ 02 package SplashJumper; 03 ############################ 04 # Mike Schilli, 2010 05 # (m@perlmeister.com) 06 use strict; 07 use warnings; 08 use Module::Pluggable 09 require => 1; 10 11 sub new { 12 bless {}, shift; 13 } 14 15 1;

WWW.LINUX- MAGAZINE.ES

Nmero 72

49

DESARROLLO Perl: Scripting

Figura 4: Si la conexin de red est desactivada, el script intenta alcanzar el servidor de Google a intervalos de 5 segundos.

ejecucin, lo lgico es ejecutar los plugins con mayores Figura 5: Si el script encuentra una pgina de bienvenida, aplica prioportunidades de mero el mtodo click-all-links. xito en primer lugar. de objetos WWW::Mechanize::Link y utiliza Los dos plugins que veremos aqu definen un bucle for para iterar sobre la lista. La funprioridades de 10 y 50, respectivamente, de cin INFO, importada de los tesoros de modo que el script siempre probar ClicLog4perl, le indica al usuario curioso qu AllLinks primero antes de aplicar la tctica enlace est pulsando actualmente el plugin. que Check- BoxFill muestra en el Listado 3. El mtodo get() del simulador de navegador Cuando se ejecuta un plugin de contraejecuta a continuacin la peticin web. ataque a la pgina de bienvenida, el script Mecanizar con Autocheck llama a su mtodo process() y le pasa el El control explcito de errores no se realiza simulador de navegador $mech, un objeto de aqu porque WWW:: Mechanize se ejecuta la clase WWW::Mechanize. Este mdulo El Mejor Primero en modo autocheck de forma predetermiCPAN es perfecto para capturar pginas web, El Listado 2 muestra un tpico plugin con el nada. Genera una excepcin por cada error analizar su contenido y profundizar en sus mdulo ClickAllLinks. Cuando se carga el que encuentra, y el bloque eval{} agrupado enlaces. A menudo se utiliza para implescript principal del plugin, llama al mtodo alrededor de la llamada al plugin en el script mentar screen scrapers, ya que proporciona register(), que devuelve el nombre de la tcprincipal (vase el Listado 4, lnea 81) los ms o menos un conjunto completo de funtica actual y un nmero de prioridad. El agrupa antes de que el programa principal cionalidades del navegador (excepto el script principal ordena los plugins numricapase a gestionar el error. cdigo JavaScript o plugins de Flash), acepta mente en base a los nmeros de prioridad En la lnea 30 (Listado 2), el plugin utiliza cookies automticamente, y los devuelve al que reporta, llamando a los plugins con a continuacin la instruccin INFO para indiservidor. menor valor en primer lugar. Esto significa car el nmero de bytes devueltos al pulsar el En el plugin Click-AllLinks, el mtodo que los plugins pueden decidir entre ellos enlace, y el mtodo back() en la lnea 34 links() identifica todos los enlaces de la quin va primero. Para reducir el tiempo de pulsa el botn Atrs del navegador virtual pgina de bienvenida recuperados en forma para volver a la pgina de bienvenida. El plugin CheckBoxFill del Listado 3 utiListado 3: CheckBoxFill.pm liza un enfoque diferente. Busca a travs del 01 ############################# 19 archivo HTML de la pgina de bienvenida 02 package SplashJumper::Plugin:: 20 $mech->form_number(1); con el objetivo de encontrar el primer formuCheckBoxFill; 21 lario de la web y luego utiliza la instruccin 03 ############################# 22 my @inputs = form_number(1) para configurarla como 04 # Mike Schilli, 2010 23 $mech->current_form current_form. El mtodo find_input() extrae 05 # (m@perlmeister.com) 24 ->find_input(undef, todos los campos de entrada de tipo casilla 06 ############################# 25 checkbox); de verificacin del formulario, y el bucle for 07 use Log::Log4perl qw(:easy); 26 de las lneas 27-29 los selecciona a todos lla08 27 for my $input (@inputs) { mando a sus mtodos check(). La lnea 32 09 ############################# 28 $input->check(); llama entonces a submit_form() para enviar 10 sub register { 29 } el formulario web de vuelta al servidor, antes 11 ############################# 30 de que la lnea 34 vuelva a la pgina de bien12 return checkbox-fill, 50; 31 INFO Submitting form 1; venida para asegurarse de que el prximo 13 } 32 $mech->submit_form( plugin encuentra las condiciones de partida 14 33 form_number => 1); normales. 15 ############################# 34 $mech->back(); Este mtodo hace posible controlar pginas 16 sub process { 35 } de bienvenida como las que se muestran en 17 ############################# 36 las Figuras 6 y 7, las cuales requieren que el 18 my ($self, $mech) = @_; 37 1; usuario marque una casilla de verificacin y luego pulse un botn que enva el formulario.

toma un breve descanso y luego lo intenta de nuevo. Una vez que el cliente tiene una direccin IP y las peticiones web al menos muestran la pgina de bienvenida, el script lanza un plugin tras otro en la pared artificial (Figura 5) hasta que finalmente la derrumba. El Listado 1 muestra la clase de base SplashJumper para todos los plugins, la cual simplemente define un constructor. Tira del mdulo Module::Pluggable de CPAN y le pasa el parmetro require => 1. El mdulo comprueba entonces el subdirectorio SplashJumper/Plugin en busca de los archivos .pm, ejecuta una instruccin require, y los carga en el script activo.

50

Nmero 72

WWW.LINUX- MAGAZINE.ES

Perl: Scripting DESARROLLO

El Listado 4 finalmente muestra el programa principal, Splash. Empieza por definir en la lnea 13 la URL de prueba, que el script recupera para descubrir si la conexin a Internet est activa. La pgina de Google es perfecta para esto, porque es ligera y es muy probable que est disponible en una conexin a Internet que funcione. La lnea 16 inicializa el entorno de trabajo Log4perl en el nivel DEBUG para dar al usuario informacin detallada sobre el plugin en ejecucin en ese momento y las acciones que est llevando a cabo en el navegador virtual. Gracias a la utilizacin de Module::Pluggable, los objetos de la clase de base SplashJumper disponen de un mtodo plugins() que devuelve una lista de todos los plugins instalados en el subdirectorio de Plugin. La lnea 28 comprueba si cada plugin proporciona un mtodo register(), como se requiere, y omite plugins no implementados correctamente, devolviendo un mensaje de error en este sentido al mismo tiempo. Los plugins correctamente implementados devuelven sus tcticas como $algo en la lnea 35 y su prioridad numrica preferida en la variable $order. El script empaqueta la

informacin que encuentra en una matriz y empuja una referencia al final de la matriz @ways. La lnea 44 ordena los elementos de esta matriz numricamente por el campo order, de manera que un plugin con una prioridad de 10 ejecuciones se Figura 6: La red WiFi del aeropuerto de San Diego requiere que el usuaejecuta antes rio marque una casilla de verificacin y entonces enva el formulario (before) que un web. plugin con una prioridad de 50. tar acceder al servidor de Google. Al final El simulador de navegador del bloque, que Perl repite ejecutando un WWW::Mechanize establece su tiempo de redo, al menos la red local WiFi est funcioespera a cinco segundos en la lnea 50. Esto nando y al cliente se le asigna una direccin significa que el bloque del bucle de las IP vlida. Sin embargo, el proveedor de lneas 53 a 62 slo se congela en el mtodo WiFi an podra haber encaminado las petiget() durante cinco segundos antes de darse ciones a www.google.com a un servidor por vencido, durmiendo durante cinco interno que produce la pgina de bienvesegundos , y a continuacin vuelve a intennida.

DESARROLLO Perl: Scripting

error que se produzca en el plugin, y la lnea 88 comprueba la variable $@ para ver si ha sucedido algo.
Figura 6: La red WiFi del aeropuerto de San Diego requiere que el usuario marque una casilla de verificacin y entonces enva el formulario web.

ClickAllLinks.pm SplashJumper/Plugin/U CheckBoxFill.pm

Instalacin

El bucle for de las lneas 65 a 95 intenta burlar la pgina de bienvenida con una gran variedad de plugins, y una vez que la URL de la ltima solicitud es igual a la URL de prueba (es decir, no se redirige a la pgina de bienvenida), la lnea 72 decide que la pgina de bienvenida ha sido derrotada y la conexin a Internet est abierta. Si no es este el caso, la lnea 85 llama al mtodo process() para el prximo plugin en lnea con igual o mayor prioridad. El bloque eval{} de las lneas 81 a 86 atrapa cualquier

Para asegurarnos de que el script encuentra el mdulo SplashJumper, ste deber estar instalado en la ruta de la bsqueda del script %INC: la forma ms sencilla de hacerlo es poner los dos en el mismo directorio. Los plugins se almacenan en el recin creado subdirectorio SplashJumper/Plugin, de modo que el diseo del archivo se parece a esto:
splash SplashJumper.pm SplashJumper/Plugin/U

Algunos plugins adicionales podran controlar mltiples formularios web, o incluso sortear los trucos de JavaScript. Tambin necesitan almacenarse en el directorio Plugin. Su mtodo register() tiene que asignar un nombre para la tctica, y decide una prioridad para definir el orden en que se ejecutar. Despus de abrir la tapa de su porttil en el aeropuerto, slo tiene que lanzar el script splash. Su salida nos indica cmo lucha nuestro guerrero de bolsillo en su nuevo entorno y si logra vencer esos obstculos artificiales. I

RECURSOS
[1] Listados de este artculo: http:// www.linux-magazine.es/Magazine/ Downloads/72

Listado 4: Splash
01 #!/usr/local/bin/perl -w 02 ############################# 03 # splash - Traverse WiFi 04 # Splash Pages 05 # Mike Schilli, 2010 06 # (m@perlmeister.com) 07 ############################# 08 use strict; 09 use SplashJumper; 10 use WWW::Mechanize; 11 use Log::Log4perl qw(:easy); 12 13 my $url = 14 http://www.google.com; 15 16 Log::Log4perl->easy_init( 17 $DEBUG); 18 19 my $sj = SplashJumper->new(); 20 21 my @ways = (); 22 23 for 24 my $plugin ($sj->plugins()) 25 { 26 27 if ( 28 !$plugin->can(register)) 29 { 30 ERROR $plugin cant do, 31 register(); 32 next; 33 } 34 35 my ($algo, $order) = 36 $plugin->register(); 37 38 push @ways, 39 [ $algo, $plugin, 40 $order ]; 41 } 42 43 # sort by plugin priority 44 @ways = sort { 45 $a->[2] <=> $b->[2] 46 } @ways; 47 48 my $mech = 49 WWW::Mechanize->new(); 50 $mech->timeout(5); 51 52 # wait until network is up 53 { 54 INFO Trying $url; 55 eval { $mech->get($url); }; 56 if ($@) { 57 INFO 58 Connection down, retrying; 59 sleep 5; 60 redo; 61 } 62 } 63 64 # try to get past splash page 65 for my $ways (@ways) { 66 eval { $mech->get($url); }; 67 68 my $current_url = 69 $mech->response->request 70 ->uri; 71 72 if ($current_url eq $url) { 73 INFO Link is up.; 74 last; 75 } else { 76 INFO Link still down; 77 } 78 79 my ($algo, $plugin, $order) 80 = @$ways; 81 82 eval { 83 INFO Processing splash , 84 page $current_url , 85 with algo $algo; 86 $plugin->process($mech); 87 }; 88 89 if ($@) { 90 ERROR 91 Algo $algo failed ($@); 92 } else { 93 INFO 94 Plugin $algo succeeded; 95 } 96 }

52

Nmero 72

WWW.LINUX- MAGAZINE.ES

S-ar putea să vă placă și