En esta ocasión vamos a dar una pinceladas sobre cómo podemos conectarnos a la API de Twitter para volcar en nuestro ordenador los tweets que se van publicando sobre algún tema a medida que van apareciendo en la red. Es decir, nos conectaremos a la que se conoce como Streaming API.
Recibir los tweets en tiempo real nos permite hacer cosas tan curiosas como emojitracker que muestra en tiempo real los emoticonos que se están utilizando, o también podríamos hacer seguimiento de algún acontecimiento al mismo tiempo que sucede mediante análisis de sentimieno, o... ¿nos comentas que se te ocurre en los comentarios más abajo?

emojitracker: monitorización en tiempo real del uso de emoticonos en Twitter.
¿Qué necesito?
Vamos a utilizar Python para este ejemplo (aunque bien podría haberse abordado con otro lenguaje de programación) e instalaremos también algunos paquetes adicionales que nos van a simplificar la vida.
Así que, si aún no lo has hecho, debes instalarte Python y después estos paquetes adicionales:
$> pip install tweepy
Con la línea anterior instalamos tweepy, una librería que nos va a simplificar sobremanera la utilización de la API de Twitter con Python.
¿Qué es una API?
API es la abreviatura de Application Programming Interface, es decir, la interfaz que nos permite conectarnos programáticamente a una aplicación, lo que podríamos llamar el contrato que establece una aplicación con su entorno con una serie de claúsulas del tipo "si tú me preguntas de esta manera, yo te respondo de esta otra"; y gracias a ellas podemos hacer programas que colaboren unos con otros.
Twitter, como muchas otras aplicaciones online ofrecen una API que nos permite hacer programas que utilicen sus datos y también aportar datos a través de otras aplicaciones. Prácticamente cualquier aplicación que tengamos en nuestro teléfono móvil se estará comunicando continuamente con una servidor en internet para intercambiar datos.
En el caso de las APIs de internet algo imprescindible es la identificación de quién está haciendo la llamada y qué acciones puede realizar. Como podrás suponer, mi móvil tiene acceso a mis datos y el tuyo a los tuyos, y todos queremos que esto sea así; esta vinculación se consigue a través de credenciales, parejas de claves públicas/privadas, autenticación,...
Ni hoy ni aquí, es el momento ni el lugar para hablar largo de esto, espero que con esta brevísima introducción te hayas hecho una mínima idea, pero siempre tendrás internet a mano para consultar más.
1) Obteniendo las claves
Lo primero que vamos a tener que hacer es darnos de alta en Twitter e indicar que queremos crear una aplicación como desarrolladores para que nos generen las claves y tokens de acceso que tendremos que utilizar a continuación. Quizá suena más complicado de lo que es:
Necesitas crearte una cuenta en Twitter.
Después tendrás que crear una nueva aplicación en https://apps.twitter.com/.
Y en la pestaña Keys and access tokens podrás generar un access_token. Ahora deberías tener acceso a cuatro numerajos como estos:
consumer_key = 'qjKzLb55Ddq9uTirHRSLh2fn1' consumer_secret = 'crUCVcphcM6CM1EhNmQcknLMHV4lIdRIovwF42A8943b7pMghh' access_token = '332912007-O2ZZQqICUcRNaImFuuVzyQCstVGo6giphaaJ5Pvu' access_token_secret = 'I7hTnSJhefdmRZFaHIxeX5gtQkuurYxUV01jOwDI89yoL'Ten en mente que cualquiera que acceda a estos datos podrá publicar en Twitter usando tu cuenta, y borrar tus tweets... así que trátalos con cuidado y no se los dejes a nadie.
2) El esqueleto del programa
Cuando uno programa hay que ser muy ordenado (y utilizar un control de versiones), así que vamos a crear el esqueleto de un programa al que después vamos a ir dotando de funcionalidad.
Crea un directorio en tu ordenador con el nombre que vaya a tener tu programa y dentro de él vamos a poner dos archivos:
secret.py run.py
En el primero de ellos, secret.py, debes poner tus claves y tokens:
consumer_key = 'qjKzLb55Ddq9uTirHRSLh2fn1' consumer_secret = 'crUCVcphcM6CM1EhNmQcknLMHV4lIdRIovwF42A8943b7pMghh' access_token = '332912007-O2ZZQqICUcRNaImFuuVzyQCstVGo6giphaaJ5Pvu' access_token_secret = 'I7hTnSJhefdmRZFaHIxeX5gtQkuurYxUV01jOwDI89yoL'
y en el segundo es donde vamos a escribir el código de nuestra aplicación, empecemos por lo más sencillo, sólo para ver que funciona:
import tweepy from secret import consumer_key, consumer_secret, access_token, access_token_secret if __name__ == '__main__': print("===== My Application =====") # Here starts my program # End print("c'est fini!")
Esta separación es muy útil si queremos compartir nuestro programa con otras personas, así podremos pasarles el archivo con el código, run.py, sin necesidad de tener que borrar las claves que no queremos compartir. ¡Importante! Si lo estás guardando con algún sistema de control de versiones acuérdate de indicar que debe ignorar el archivo secret.py para que no lo suba a internet.
Y ahora la prueba de fuego, vamos a ver si nuestro esqueleto de programa funciona:
Abre una consola de comandos (pantalla negra) y ve hasta el directorio donde estén los dos archivos anteriores.
Ejecuta run.py utilizando Python, es decir, tendrás que escribir:
python run.py
3) Un programa que funcione
Antes de conectarnos al stream de Twitter vamos a comprobar que todo está en su sitio. Para ello podemos modificar el archivo run.py con el código que aparece a continuación:
import tweepy from secret import consumer_key, consumer_secret, access_token, access_token_secret def get_auth(): auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) return auth if __name__ == '__main__': print("===== My Application =====") # Get an API item using tweepy auth = get_auth() # Retrieve an auth object using the function 'get_auth' above api = tweepy.API(auth) # Build an API object. # Test it works api.update_status('Hola @lingwars! Estoy mandando este tweet desde mi ordenador') # End print("c'est fini!")
¡Pruébalo! ¿Qué ha pasado? ¿Nada? ¿Algo? Este momento es crucial, no sigas adelante si estás obteniendo algún tipo de error al ejecutar el programa anterior.
4) Conexión al stream
Y ya por fin, vamos a por el tiempo real. Gracias a la librería tweepy hacer esto es tan sencillo como se muestra en el siguiente trozo de código que puedos poner en tu archivo run.py:
import tweepy from secret import consumer_key, consumer_secret, access_token, access_token_secret def get_auth(): auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) return auth class MyStreamListener(tweepy.StreamListener): def on_status(self, status): # When a tweet is published it arrives here. print(status.text.encode("ascii", errors='replace')) # Console output may not be UTF-8 print("-"*10) if __name__ == '__main__': print("===== My Application =====") # Get an API item using tweepy auth = get_auth() # Retrieve an auth object using the function 'get_auth' above api = tweepy.API(auth) # Build an API object. # Connect to the stream myStreamListener = MyStreamListener() myStream = tweepy.Stream(auth=api.auth, listener=myStreamListener) print(">> Listening to tweets about #python:") myStream.filter(track=['python']) # End print("c'est fini!")
Ejecútalo como ya sabes y espera:
python run.py
Como podrás imaginar, Twitter no nos está enviando todos los tweets que se publican en el mundo (eso tiene un precio), pero quizá la muestra sea suficientemente significativa para nuestros propósitos.
¿Y ahora qué?
Puedes jugar con el programa anterior modificando pequeñas partes a tu antojo. Seguro que tienes muchas ideas para probar, pero puedes empezar por alguna de éstas:
Guardar los tweets en un archivo de texto para consultarlos después
import codecs [...] def on_status(self, status): # Print print(status.text.encode("ascii", errors='replace')) # Console output may not be UTF-8 print("-"*10) # Append to file with codecs.open("tweets.txt", "a", "utf-8") as myfile: myfile.write(status.text) [...]Cotillea qué otra información viene con cada tweet. Para ello puedes cambiar el listener por algo como lo siguiente:
import json [...] class MyStreamListener(tweepy.StreamListener): def on_data(self, data): try: decoded = json.loads(data) print(decoded) except Exception as e: print("ERROR: {}".format(e)) finally: return True # Keep listeningFíjate en que hay información muy interesante como el autor, imágenes, hashtags,... y piensa que todo eso podrías guardarlo en una base de datos y hacer búsquedas. \o/
Geoposiciona los tweets: ¿qué te parece guardar sólo los tweets con información de geolocalización y después pintarlos en un mapa? Pues no es complicado, sólo tienes que combinar los dos ejemplos anteriores y después utilizar alguna herramienta sencilla para crear mapas como CartoDB
¿Y si filtramos para que nos muestre únicamente tweets en español escritos desde España?
# LOCATIONS. Use http://boundingbox.klokantech.com/ for boundingboxes SPAIN_GEOBOX = [-9.38,36.05,3.35,43.75] myStream.filter(languages=["es"], locations=SPAIN_GEOBOX)Aunque también podríamos haber detectado el idioma español utilizando una lista de stopwords, ¿no?
Espero que todo esto haya despertado tu inquietud y te hayas puesto como loco a programar el próximo digestor de tweets.
Antes de acabar
¿Recuerdas que arriba comentábamos que cualquiera que tuviera tu consumer_secret, access_token y access_token_secret podría acceder a tu cuenta y publicar en tu nombre? Quizá ha llegado el momento de borrarlos si no lo vas a utilizar más o de revocar el acceso a estos tokens (puedes hacerlo en la misma página donde los creaste utilizando el botón Regenerate consumer key and secret. Avisado estás.
Comments !