{ "metadata": { "name": "", "signature": "sha256:a2c083258a5923abba169bc001890e36cdaad385055f11deb90afe88091ff1ef" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pr\u00e1ctica 8\n", "\n", "## Introducci\u00f3n\n", "\n", "En este \u00faltima pr\u00e1ctica tendr\u00e1s que crear un [*bot* de twitter](http://en.wikipedia.org/wiki/Twitterbot) (un pograma que interact\u00faa de manera semi-autom\u00e1tica con twitter) que muestre ciertas capacidades ling\u00fc\u00edsticas.\n", "\n", "Esta pr\u00e1ctica es diferente de las anteriores en el sentido de que es bastante abierta. Tendr\u00e1s que demostrar que eres capaz de programar en Python funcionalidades m\u00e1s o menos complejas, combinando las herramientas anteriores vistas en clase de manera creativa. \n", "\n", "A continuaci\u00f3n ver\u00e1s *snippets* o ejemplos de c\u00f3digo mostrando las instrucciones m\u00ednimas que deber\u00e1 incluir tu *bot* para que sea capaz de publicar mensajes. Tambi\u00e9n tratar\u00e9 de mostrar c\u00f3mo acceder a otras funcionalidades, por si te animas a hacer cosas m\u00e1s complejas. Ojo, tendr\u00e1s que adaptar parte de este c\u00f3digo para que tu *bot* funcione.\n", "\n", "## Cuenta de desarrollador en twitter\n", "\n", "Para poder crear un *bot* y, en general, cualquier aplicaci\u00f3n que interact\u00fae con twitter, necesitas tener una cuenta con permisos de desarrollador. Sigue los pasos:\n", "\n", "1. Lo primero que tienes que hacer, si no tienes cuenta en twitter, es [registrarte](https://twitter.com/signup). Si ya tienes cuenta en esta red, te recomiendo que la uses y no te crees otra nueva. El proceso de alta de twitter requiere la validaci\u00f3n de un n\u00famero de tel\u00e9fono m\u00f3vil \u00fanico para cada cuenta. As\u00ed que, si no tienes m\u00e1s de un n\u00famero de m\u00f3vil y no quieres dolores de cabeza, utiliza tu cuenta de todos los d\u00edas.\n", "\n", "2. Una vez registrado, laz login con tu cuenta y entra en [la p\u00e1gina de gesti\u00f3n de apps de twitter](https://apps.twitter.com), donde podr\u00e1s solicitar permisos para una *app* nueva. Pincha en [*Create New App*](https://apps.twitter.com/app/new).\n", "\n", "3. Rellena los campos requeridos del formulario que se muestra: \n", "\n", " - ***Name***: tiene que ser un nombre \u00fanico, as\u00ed que s\u00e9 original. Es probable que tengas que probar varios nombres hasta dar con uno que est\u00e9 libre. Si no quieres fallar, pon algo como *progplnbot-tunombre*.\n", " \n", " - ***Description***: describe brevemente el prop\u00f3sito de tu bot.\n", " \n", " - ***Website***: por el momento, cualquier URL servir\u00e1. Si no tienes web propia y no sabes qu\u00e9 poner, introduce la URL de la web de Ling\u00fc\u00edstica: http://www.ucm.es/linguistica\n", " \n", "4. Lee (cough, cough) el texto del acuerdo, selecciona *Yes, I agree* y pincha el bot\u00f3n de la parte inferior de la p\u00e1gina que dice *Create your Twitter application*.\n", "\n", "5. Si todo ha ido bien (si has elegido para tu *app* un nombre que estuviera libre, b\u00e1sicamente), se te mostrar\u00e1 una p\u00e1gina de configuraci\u00f3n. Tendr\u00e1s que cambiar algunos par\u00e1metros. \n", "\n", " - En el apartado *Application Settings*, en *Access level*, pincha en *modify app permissions* y otorga permisos de lectura y escritura: selecciona la opci\u00f3n *Read and Write*. Una vez cambiado, pincha en *Update Settings*.\n", " \n", " - En la pesta\u00f1a *Keys and Access Tokens*, pincha en el bot\u00f3n *Create my access token* para crear los tokens de acceso. Estos nombres probablemente no te digan nada, pero desde esta p\u00e1gina tienes acceso a las cuatro credenciales que tu *bot* necesita para autenticarse y publicar mensajes. Toma nota de ellas, las necesitar\u00e1s m\u00e1s adelante:\n", " - *Consumer key*\n", " - *Consumer secret*\n", " - *Access token*\n", " - *Access token secret*\n", " \n", "Ya tienes todo lo que necesitas para crear tu *bot*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ejemplo m\u00ednimo de *bot* con Python y `tweepy`.\n", "\n", "El c\u00f3digo que aparece a continuaci\u00f3n contiene las l\u00edneas m\u00ednimas para crear un cliente de twitter y publicar un mensaje en twitter. \n", "\n", "Consejo: No lo ejecutes m\u00e1s de una vez o correr\u00e1s el riesgo de que te baneen la cuenta." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import tweepy\n", "# a\u00f1ade las credenciales de tu aplicaci\u00f3n de twitter\n", "# como cadenas de texto\n", "CONSUMER_KEY = \"CAMBIA_ESTO\"\n", "CONSUMER_SECRET = \"CAMBIA_ESTO\"\n", "ACCESS_KEY = \"CAMBIA_ESTO\"\n", "ACCESS_SECRET = \"CAMBIA_ESTO\"\n", "\n", "# autentica las credenciales\n", "auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)\n", "auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)\n", "\n", "# crea un cliente de twiter\n", "t = tweepy.API(auth)\n", "\n", "# publica un saludo\n", "t.update_status(\"\u00a1Propicios d\u00edas! Soy un robotito :-P\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hay que ser cuidadoso a la hora de enviar mensaje automatizados. Si queremos publicar m\u00e1s de un mensaje y queremos controlar el tiempo que transcurre entre un mensaje y otro, podemos utilizar la librer\u00eda `time` de la siguiente manera:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# a\u00f1ade esta librer\u00eda al principio de tu c\u00f3digo\n", "import time\n", "\n", "# algunas citas memorables de la serie The Wire\n", "citas = \"\"\"If the man comin', make ready for the man.|\n", "All in the game yo, all in the game.|\n", "Man, money ain't got no owners, only spenders.|\n", "Nigger, is you taking notes on a criminal fucking conspiracy?|\n", "- The game is the fuckin' game. Period. \n", "- Same as it was ever.|\"\"\".split(\"|\\n\")\n", "\n", "# iteramos sobre las citas y las publicamos de una en una \n", "for cita in citas:\n", " t.update_status(cita)\n", " time.sleep(60) # env\u00eda el tweet cada 60 segundos" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Otra funcionalidad t\u00edpica que tienen los *bots* de twitter es enviar autom\u00e1ticamente mensajes a otros usuarios. Si queremos que nuestra aplicaci\u00f3n busque entre todos los mensajes y responda al autor, podemos hacer lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# buscamos mensajes que contengan la expresi\u00f3n \"gaticos y monetes\"\n", "busqueda = t.search(q=\"gaticos y monetes\")\n", "\n", "# itero sobre estos mensajes\n", "for mensaje in busqueda:\n", " # capturo el nombre de usuario\n", " usuario = mensaje.user.screen_name\n", " # compongo el mensaje de respuesta\n", " miRespuesta = \"@%s \u00a1monetes!\" % (usuario)\n", " # env\u00edo la respuesta\n", " mensaje = t.update_status(miRespuesta, mensaje.id)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si queremos responder a menciones, es decir, si queremos que el *bot* responda autom\u00e1ticamente a mensajes dirigidos a \u00e9l, podemos utilizar el siguiente c\u00f3digo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# recupero las \u00faltimsa 5 menciones de mi usuario\n", "menciones = t.mentions_timeline(count=5)\n", "\n", "# ten en cuenta que:\n", "# si tu cuenta de twitter es nueva y no tiene menciones, no funcionar\u00e1\n", "# si est\u00e1s usando tu cuenta de todos los d\u00edas, como hago yo, \n", "# enviar\u00e1s mensajes a esas personas (o robotitos)\n", "\n", "for mencion in menciones:\n", " # capturo el nombre de usuario que me manda el mensaje\n", " usuario = mencion.user.screen_name\n", " # compongo el mensaje de respuesta\n", " miRespuesta = \"\u00a1Hola, @%s! Soy un robotito. Este es un mensaje autom\u00e1tico, no le hagas caso\" % (usuario)\n", " # env\u00edo la respuesta\n", " mensaje = t.update_status(miRespuesta, mention.id)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si queremos retuitear mensajes, podemos ejecutar lo siguiente: \n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# buscamos mensajes que contengan la expresi\u00f3n \"viej\u00f3venes\"\n", "busqueda = t.search(q=\"viej\u00f3venes\")\n", "\n", "# para que no se descontrole, solo quiero retwitear los tres \u00faltimos mensajes\n", "if len(busqueda) >= 3:\n", " for mensaje in busqueda[:3]:\n", " # para retwitear un mensaje, ejecuto el m\u00e9todo retweet \n", " # indicando el identificador \u00fanico del mensaje en cuesti\u00f3n\n", " t.retweet(mensaje.id)\n", "else:\n", " for mensaje in busqueda:\n", " t.retweet(mensaje.id)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hasta aqu\u00ed las funcionalidades b\u00e1sicas. Si quieres explorar m\u00e1s sobre las posibilidades de esta librer\u00eda de twitter, revisa la documentaci\u00f3n de [tweepy](http://tweepy.readthedocs.org/en/v3.1.0/).\n", "\n", "A partir de aqu\u00ed, contin\u00faas t\u00fa solo. Crea un nuevo cuaderno *File > New* para tu pr\u00e1ctica final, reutiliza el c\u00f3digo que necesites y a\u00f1ade capacidades ling\u00fc\u00edsticas combinando librer\u00edas de procesamiento del lenguaje que hemos visto en clase. \n", "\n", "\u00a1Suerte!" ] } ], "metadata": {} } ] }