Twitter trends desde la shell

Twiter Trend desde Bash

Twiter Trend desde Bash

Se acabaron las vacaciones. El primer post de este año trata sobre un script que hice estas navidades.

La shell de GNU/Linux es muy potente. Hace tiempo vi una opción de la shell bash (por defecto en casi todas las distribuciones) que permite hacer conexiones TCP/IP de una forma sencilla y elegante.

Para demostrar su uso he decidido hacer un pequeño script bash que vaya mostrando el Top-Ten de las tendencias en Twitter. Una tendencia (trend) es una palabra que se usa masivamente en los tweets de todo el mundo. En fin de año, el hashtag #HappyNewYear fue un trend.

El script lo he desarrollado sobre la shell bash de Ubuntu. Por motivos de seguridad, la gente de Canonical deshabilita la opción de conexiones TCP/IP para bash, así que es necesario recompilar bash sin dicha restricción.

  1. Obtenemos el fuente:
    
    apt-get source bash
    cd bash-3.2/
    
    
  2. Editamos el archivo debian/rules y eliminamos la línea “--disable-net-redirections \
  3. Generamos el paquete:
            dkpg-buildpackage -rfakeroot
            

    Es posible que necesites instalar algunos paquetes necesarios para la generación. En mi caso fue sharutils.

  4. Instalamos nuestra “nueva” bash.
    sudo apt-get install ../bash-3.2*deb
    

Este es el código del script:


#!/bin/bash

GREEN='\e[0;32m'
BLUE='\e[0;34m'
RED='\e[0;31m'

NONE='\e[0m'

while [ 1 ]; do

exec 3<>/dev/tcp/search.twitter.com/80
echo -e "GET /trends/current.json\n\n" >&3
text=`cat <&3`

clear
echo -e $GREEN "Twitter current trends\n\n" $NONE
ind=1
while [ 1 ]; do
       textp=${text#*\"name\":\"}
       if [ "$textp" = "$text" ]; then
	       break
       else
           text="$textp"
       fi

       end=`expr index "$text" \"`
       trend=${text:0:(($end-1))}
       text=${text:$end}
       echo -e $ind. $BLUE $trend $NONE
       let ind++

done
sleep 10
echo -e $RED "\nupdating..." $NONE
done

Voy a explicar un poco el código (al pasar el salto)

  1. Las líneas 3-7 definen constantes para establecer los colores de la fuente en la shell (para darle un toque de colorido).
    GREEN='\e[0;32m'
    BLUE='\e[0;34m'
    RED='\e[0;31m'
    
    NONE='\e[0m'
    
    
  2. En 9 se define el bucle principal. En cada iteración se obtienen los datos de la web en formato JSON, se procesan, se muestran en pantalla y espera un tiempo para volver a empezar.
  3. Las líneas 11-13 son las más interesantes. Lo primero que hacemos es crear un descriptor de archivo con ID=3 hacia el servidor de Twitter. La sintaxis para una comunicación TCP/IP es: /dev/tcp/<host>/<port>. En nuestro caso es: /dev/tcp/search.twitter.com/80. Luego solicitamos la página  /trends/curent.json mediante un echo sobre el descriptor abierto antes. Con un simple ‘cat <& 3‘ leemos la respuesta del servidor de Twitter en formato JSON.
    exec 3<>/dev/tcp/search.twitter.com/80
    echo -e "GET /trends/current.json\n\n" >&3
    text=`cat <&3`
    
  4. Es necesario procesar el paquete JSON para obtener los trends. En el bucle definido en 18, voy procesando la cadena JSON buscando el patrón “name”:” y obteniendo el resto de la cadena. La condición de 20 sirve para comprobar cuando ha terminado de encontrar nuevos trends. Si la cadena original es igual a la procesada quiere decir que no ha encontrado nuevas coincidencias.
           textp=${text#*\"name\":\"}
           if [ "$textp" = "$text" ]; then
    	       break
           else
               text="$textp"
           fi
    
  5. Hay que delimitar el trend, por eso uso index en 26 para buscar las dobles comillas
           end=`expr index "$text" \"`
            
  6. Con las líneas 27 y 28, obtengo el trend y preparo el resto de la cadena para la siguiente iteración.
           trend=${text:0:(($end-1))}
           text=${text:$end}
            
  7. Sólo queda imprimir por pantalla el número del trend y su nombre (línea 29)
           echo -e $ind. $BLUE $trend $NONE
            
  8. Para no sobrecargar el servidor de Twitter, espera 10 segundos antes de empezar de nuevo (línea 33).
    sleep 10
    echo -e $RED "\nupdating..." $NONE
    

Os dejo una captura de pantalla.

TwitterTrendBash screenshot

TwitterTrendBash screenshot

En poco más de 30 líneas tenemos una herramienta de “marketing social” para Twitter usando la poderosa shell Bash.

Translate to:English

MenefanteMenéame TwitterTwitter

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: