... | ... | @@ -107,3 +107,148 @@ Además, para la ejecución del proyecto se han desarrollado scripts que automat |
|
|
|
|
|
|
|
|

|
|
|
|
|
|
## BLOQUE I: Descarga de tweets
|
|
|
|
|
|
El primero de los bloques, como ya se ha comentado tiene como objetivo la recolección de tweets para la generación de un fichero que será posteriormente procesado. Los ficheros relacionados con este bloque se encuentran en la carpeta llamada "tweets" dentro de GitLAB.
|
|
|
|
|
|
En primer lugar, trataremos la descarga de Tweets, para la cual nos hemos apoyado del uso de la librería Twitter4J. Aunque toda la información de la misma se puede encontrar en [la página oficial](http://twitter4j.org/en/index.html), a grandes rasgos es una librería no oficial de Java que utiliza el API de Twitter. Entre sus funciones destacan:
|
|
|
|
|
|
- Permite publicar tweets.
|
|
|
- Permite obtener el user timeline (últimos tweets de un usuario en concreto; hasta 3200 por limitaciones de la API).
|
|
|
- Permite enviar/recibir mensajes directos.
|
|
|
- Buscar tweets de acuerdo a una petición (por ejemplo,que tengan un hashtag concreto, o que los envíe un usuario determinado...)
|
|
|
- Permite realizar llamadas de forma asíncrona.
|
|
|
- Permite realizar control de páginas.
|
|
|
- Tiene soporte para la autenticación.
|
|
|
- Tiene soporte para las streaming API.
|
|
|
|
|
|
En nuestro código utilizaremos llamadas de forma asíncrona para la descarga del user timeline de distintos usuarios. El uso de control de páginas también se usará para poder obtener todos los Tweets deseados.
|
|
|
|
|
|
Para empezar disponemos de la clase *TwitterCrawler.java* que es la clase principal que se encarga de llamar a métodos de otras clases que descarguen los tweets. El código de la misma es el siguiente:
|
|
|
|
|
|
package tweets_cd;
|
|
|
|
|
|
import twitter4j.AsyncTwitter;
|
|
|
import twitter4j.AsyncTwitterFactory;
|
|
|
import twitter4j.Status;
|
|
|
import twitter4j.Twitter;
|
|
|
import twitter4j.TwitterAdapter;
|
|
|
import twitter4j.TwitterException;
|
|
|
import twitter4j.TwitterFactory;
|
|
|
import twitter4j.TwitterListener;
|
|
|
import twitter4j.auth.AccessToken;
|
|
|
import twitter4j.TwitterMethod;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
|
public class TwitterCrawler {
|
|
|
|
|
|
@SuppressWarnings("static-access")
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
TratarFicheros gestor = new TratarFicheros();
|
|
|
String ente[] = gestor
|
|
|
.procesarFichero("XXXXXX/compdist_business_analysis_tweets/cuentas_twitter.txt");
|
|
|
|
|
|
if (ente == null) {
|
|
|
System.out.println("Fichero vacío");
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings("unused")
|
|
|
String token = "XXXXXXXXXXXXXX";
|
|
|
String tokenSecret = "XXXXXXXXXXXXXXXX";
|
|
|
AccessToken accessToken = new AccessToken(token, tokenSecret);
|
|
|
Twitter twitter = TwitterFactory.getSingleton();
|
|
|
twitter.setOAuthConsumer("XXXXXXXXXXXXXXXX",
|
|
|
"XXXXXXXXXXXXXXXXXX");
|
|
|
twitter.setOAuthAccessToken(accessToken);
|
|
|
twitter.verifyCredentials();
|
|
|
Tweet tweet = new Tweet();
|
|
|
|
|
|
TwitterListener listener = new TwitterAdapter() {
|
|
|
@Override
|
|
|
public void updatedStatus(Status status) {
|
|
|
System.out.println("Successfully updated the status to ["
|
|
|
+ status.getText() + "].");
|
|
|
}
|
|
|
|
|
|
public void onException(TwitterException e) {
|
|
|
if (TwitterMethod.UPDATE_STATUS != null) {
|
|
|
e.printStackTrace();
|
|
|
} else {
|
|
|
throw new AssertionError("Should not happen");
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
// The factory instance is re-useable and thread safe.
|
|
|
AsyncTwitterFactory factory = new AsyncTwitterFactory();
|
|
|
AsyncTwitter asyncTwitter = factory.getInstance();
|
|
|
asyncTwitter.addListener(listener);
|
|
|
asyncTwitter.updateStatus("");
|
|
|
|
|
|
tweet.get_tweets(ente);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
En primer lugar, el código crea un objeto de la clase *TratarFicheros.java*, que será la clase que se encargue de leer el fichero de entrada con los usuarios de los que vamos a descargas sus tweets. El contenido de dicha clase es el siguiente:
|
|
|
|
|
|
package tweets_cd;
|
|
|
|
|
|
import java.io.*;
|
|
|
|
|
|
public class TratarFicheros {
|
|
|
|
|
|
public static final int MAX_CUENTAS = 200;
|
|
|
|
|
|
public String[] procesarFichero(String ruta) {
|
|
|
File archivo = null;
|
|
|
FileReader fr = null;
|
|
|
BufferedReader br = null;
|
|
|
int contador = 0;
|
|
|
String[] resultado = new String[MAX_CUENTAS];
|
|
|
|
|
|
try {
|
|
|
archivo = new File(ruta);
|
|
|
fr = new FileReader(archivo);
|
|
|
br = new BufferedReader(fr);
|
|
|
// Lectura del fichero
|
|
|
String linea;
|
|
|
while ((linea = br.readLine()) != null) {
|
|
|
if (contador >= MAX_CUENTAS) {
|
|
|
break;
|
|
|
}
|
|
|
resultado[contador] = linea;
|
|
|
contador++;
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
} finally {
|
|
|
// En el finally cerramos el fichero, para asegurarnos
|
|
|
// que se cierra tanto si todo va bien como si salta
|
|
|
// una excepcion.
|
|
|
try {
|
|
|
if (null != fr) {
|
|
|
fr.close();
|
|
|
}
|
|
|
} catch (Exception e2) {
|
|
|
e2.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
return resultado;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
El código simplemente lee un fichero en el que en cada línea existe el nombre de un usuario de Twitter y guarda dicha información en un array de String que será lo que se devuelva. Por simplicidad, y dadas las limitaciones también presentes de la API de Twitter, se ha limitado a 200 el máximo número de usuarios de los que se pueden descargar los tweets, tal y como se indica en la contante *MAX_CUENTAS*.
|
|
|
|
|
|
Como ya hemos comentado, el programa leerá un fichero con los usuarios de los que se van a descargar los tweets. En GITLAB en ejemplos\_ficheros, existe un ejemplo llamado **cuentas\_twitter.txt** que muestra el formato. La sintaxis de dicho fichero es:
|
|
|
|
|
|
@DeutscheBank
|
|
|
@HSBC_Press
|
|
|
@BNPParibas_com
|
|
|
@icbc
|
|
|
@CreditAgricole
|
|
|
@Barclays
|
|
|
@RBSGroup
|
|
|
@jpmorgan |