PHP + MySQL + Twitter: Almacenar información de Twitter en una base de datos

Consigue gratis tu cuenta

Crea una API REST con Node.js y MongoDB

En este curso vas a aprender a crear una API REST con Node.js y MongoDB, además de crear un entorno de desarrollo con Docker y Docker Compose.

Comenzar ahora
Almacenar tweets en una base de datos

Tras un parón de publicaciones por mi parte en Geeky Theory debido al siempre odiado "Periodo de Exámenes" he vuelto con las pilas recargadas y con ganas de mejorar la web tanto a nivel interno como a nivel externo publicando tutoriales sobre temas diversos.

El tutorial de hoy nos va a permitir almacenar en una base de datos de aquellos datos (valga la redundancia) que vamos a obtener de la API de Twitter. Para aquellos que no sepan de que estoy hablando recomiendo que le echéis un vistazo a los siguientes enlaces.

CÓMO USAR LA API DE TWITTER EN PHP PHP + TWITTER: CÓMO ENVIAR TWEETS DESDE PHP PHP + TWITTER: HACER FOLLOW Y UNFOLLOW A UN USUARIO DESDE PHP PHP + TWITTER: HACER RT Y FAVORITO A UN TWEET DESDE PHP PHP + TWITTER: OBTENER LOS DATOS DE UNA BÚSQUEDA

Así pues, los pasos que vamos a seguir en este tutorial son los siguientes:

  1. Crear una base de datos acorde a la información que queremos guardar.
  2. Obtener la información de una consulta a la api de twitter.
  3. Parsear (filtrar) el json con la información que queremos almacenar
  4. Almacenar la información parseada en la base de datos.

Una vez que hemos visto los pasos a seguir para realizar este tutorial, vamos a plantearnos que datos nos interesa o no almacenar en la base de datos.

Si hacemos una petición de búsqueda en la Api de twitter buscando la palabra GeekyTheory tal como hicimos en el tutorial anterior, obtenemos el siguiente JSON:

jsonsearchtwitter

De toda la información que podemos sacar, vamos a seleccionar aquella que nos pueda resultar útil; por supuesto, qué información es útil dependerá de cada caso. En nuestro caso, vamos a suponer que nuestra aplicación necesitará los siguientes datos.

  • Id_tweet.
  • Tweet.
  • RTs que tiene el tweet.
  • FAVs que tiene el tweet.
  • Fecha de publicación del tweet.
  • Usuario que ha enviado el tweet.
  • Url de la imagen de perfil del usuario que ha enviado el tweet.
  • Followers del usuario que ha enviado el tweet.
  • Followings del usuario que ha enviado el tweet.
  • Número de tweets que ha enviado el usuario.
  • Fecha de registro de datos.

1. Crear una base de datos acorde a la información que queremos guardar.

Una vez que sabemos que información queremos almacenar, vamos a crear una base de datos preparada para insertar la información que hemos seleccionado.

Si no sabes cómo crear una base de datos en MySQL, puedes echar un ojo a los siguientes tutoriales:

JAVA – PHP – MYSQL: II CREACIÓN DE UNA BASE DE DATOS EN MYSQL

INTERNET DE LAS COSAS [PARTE 2] – SUBIR LOS DATOS A UNA BASE DE DATOS

Una vez que ya sabemos cómo crear una base de datos, vamos a crear una llamada “twitterdata” cuyo contenido va a ser una tabla llamada “tweets” con la siguiente información:

base de datos

2. Obtener la información de una consulta a la api de twitter.

EL siguiente paso será obtener la información que queremos almacenar de la API de twitter. Para obtener esta información vamos a usar la función “getJsonTweets($query,$num_tweets)” que definimos en el último tutorial:

PHP + TWITTER: OBTENER LOS DATOS DE UNA BÚSQUEDA

function getJsonTweets($query,$num_tweets){
        ini_set('display_errors', 1);
        require_once('TwitterAPIExchange.php');

        /** Set access tokens here - see: https://dev.twitter.com/apps/ **/
        $settings = array(
            'oauth_access_token' => "",
            'oauth_access_token_secret' => "",
            'consumer_key' => "",
            'consumer_secret' => ""
        );
        
        if($num_tweets>100) $num_tweets = 100;
       
        $url = 'https://api.twitter.com/1.1/search/tweets.json';
        $getfield = '?q='.$query.'&count='.$num_tweets;

        $requestMethod = 'GET';
        $twitter = new TwitterAPIExchange($settings);
        $json =  $twitter->setGetfield($getfield)
                     ->buildOauth($url, $requestMethod)
                     ->performRequest();
        return $json;
}

3. Parsear (filtrar) el JSON con la información que queremos almacenar

Una vez que hemos obtenido un JSON con la información que hemos solicitado tenemos que proceder a parsear la información. Así pues teniendo claro que es lo que queremos filtrar vamos a proceder a parsear el json:

//Obtenemos el JSON con la información
$json = getJsonTweets("GeekyTheory", 10);
//Codificamos el json
$json = json_decode($json);
//obtenemos un array con las filas, es decir con cada tweet.
$rows = $json->statuses;
//Iteramos los tweets, extraemos la información y la almacenamos en la base de datos.
for($i=0;$i<count($rows);$i++){
 $id_tweet = $rows[$i]->id_str;
 $tweet = $rows[$i]->text;
 $rts = $rows[$i]->retweet_count;
 $favs = $rows[$i]->favorite_count;
 $fecha_creacion = $rows[$i]->created_at;
 $usuario = $rows[0]->user->screen_name;
 $url_imagen = $rows[0]->user->profile_image_url;
 $followers = $rows[0]->user->followers_count;
 $following = $rows[0]->user->friends_count;
 $num_tweets = $rows[0]->user->statuses_count;
 
 //insertamos los datos en la base de datos
 insertarTweetInfo($id_tweet, $tweet, $rts, $favs, $fecha_creacion, $usuario, $url_imagen, $followers, $followings, $num_tweets);
}

Tenemos que tener en cuenta que lo que la API de Twitter nos devuelve es un array de elementos, en cada elemento se expone la información de un tweet, por lo tanto tenemos que crear un bucle “for” para poder parsear cada elemento. Una vez que tenemos que todos los datos de un elemento procedemos a insertar la información en la base de datos llamando a la función “insertarTweetInfo” la cual será explicada en el siguiente punto.

4. Almacenar la información parseada en la base de datos.

Seguidamente, una vez que tenemos la información que queremos almacenar, procedemos a insertar esta información en la base de datos, para ello, vamos a crear una función llamada “insertarTweetInfo” cuyos parámetros son justamente la información que queremos almacenar en la base de datos.

Si nos fijamos en la función hay que incluir los credenciales de la base de datos para que funcione el script.

function insertarTweetInfo(
        $id_tweet,
        $tweet,
        $rts,
        $favs,
        $fecha_creacion,
        $usuario,
        $url_imagen,
        $followers,
        $followings,
        $num_tweets
        ){
    
    //Creamos la conexión a la base de datos
    $conexion = mysqli_connect("localhost", "USER_DATABASE", "PASS_USER_DATABASE", "twitterdata");
    //Comprobamos laconexión
    if($conexion){
    }else{
           die('Ha sucedido un error inexperador en la conexion de la base de datos<br>');
    }
    //Codificación de la base de datos en utf8
    mysqli_query ($conexion,"SET NAMES 'utf8'");
    mysqli_set_charset($conexion, "utf8");
    
    //Creamos la sentencia SQL para insertar los datos de entrada
    $sql = "insert into tweets (id_tweet,tweet,rt,fav,fecha_creacion,usuario,url_imagen,followers,followings,num_tweets) 
            values (".$id_tweet.",'".$tweet."',".$rts.",".$favs.",'".$fecha_creacion."','".$usuario."','".$url_imagen."',".$followers.",".$followings.",".$num_tweets.");";
            $consulta = mysqli_query($conexion,$sql);
    //Comprobamos si la consulta ha tenido éxito
    if($consulta){
    }else{
           die("No se ha podido insertar en la base de datos<br><br>".mysqli_error($conexion));
    }
    
    //Cerramos la conexión de la base de datos
    $close = mysqli_close($conexion);
    if($close){
    }else{
        Die('Ha sucedido un error inexperado en la desconexion de la base de datos<br>');
    }   
}

Esta función en primer lugar creará una conexión con la base de datos a partir de los credenciales del mismo, una vez que tenemos la conexión insertamos los datos a través de una “query”, por último cerraremos la conexión que hemos abierto previamente.

Y esto es todo, por último y de forma opcional podemos obtener el contenido de la base de datos y mostrarlo en una tabla, para poder realizar esto, os recomiendo que echéis un ojo al tutorial CREAR UNA TABLA HTML A PARTIR DE UNA QUERY MYSQL.

ANEXO - Código completo

Para los más vagos os dejo el código completo detallado paso a paso, tener en cuenta, que este código se ha hecho pensando en el objetivo del tutorial, recomiendo que lo modifiquen a vuestro gusto.

 Tenemos que tener en cuenta que hay algunos credenciales del script que están vacios, estos credenciales son:

  • Consumer key.
  • Consumer key secret.
  • Token.
  • Token secret.
  • Usuario de la base de datos.
  • Pass del usuario de la base de datos.
/**
 * Author: Alejandro Esquiva Rodríguez
 * Twitter:@alex_esquiva
 * Mail: alejandro@geekytheory.com
 */

function getJsonTweets($query,$num_tweets){
        ini_set('display_errors', 1);
        require_once('TwitterAPIExchange.php');
 
        /** Set access tokens here - see: https://dev.twitter.com/apps/ **/
        $settings = array(
            'oauth_access_token' => "",
            'oauth_access_token_secret' => "",
            'consumer_key' => "",
            'consumer_secret' => ""
        );
        
        if($num_tweets>100) $num_tweets = 100;
       
        $url = 'https://api.twitter.com/1.1/search/tweets.json';
        $getfield = '?q='.$query.'&count='.$num_tweets;
 
        $requestMethod = 'GET';
        $twitter = new TwitterAPIExchange($settings);
        $json =  $twitter->setGetfield($getfield)
                     ->buildOauth($url, $requestMethod)
                     ->performRequest();
        return $json;
}

function insertarTweetInfo(
        $id_tweet,
        $tweet,
        $rts,
        $favs,
        $fecha_creacion,
        $usuario,
        $url_imagen,
        $followers,
        $followings,
        $num_tweets
        ){
    
    //Creamos la conexión a la base de datos
    $conexion = mysqli_connect("localhost", "USER_DATABASE", "PASS_USER_DATABASE", "twitterdata");
    //Comprobamos laconexión
    if($conexion){
    }else{
           die('Ha sucedido un error inexperador en la conexion de la base de datos<br>');
    }
    //Codificación de la base de datos en utf8
    mysqli_query ($conexion,"SET NAMES 'utf8'");
    mysqli_set_charset($conexion, "utf8");
    
    //Creamos la sentencia SQL para insertar los datos de entrada
    $sql = "insert into tweets (id_tweet,tweet,rt,fav,fecha_creacion,usuario,url_imagen,followers,followings,num_tweets) 
            values (".$id_tweet.",'".$tweet."',".$rts.",".$favs.",'".$fecha_creacion."','".$usuario."','".$url_imagen."',".$followers.",".$followings.",".$num_tweets.");";
            $consulta = mysqli_query($conexion,$sql);
    //Comprobamos si la consulta ha tenido éxito
    if($consulta){
    }else{
           die("No se ha podido insertar en la base de datos<br><br>".mysqli_error($conexion));
    }
    
    //Cerramos la conexión de la base de datos
    $close = mysqli_close($conexion);
    if($close){
    }else{
        Die('Ha sucedido un error inexperado en la desconexion de la base de datos<br>');
    }   
}

//Obtenemos el JSON con la información
$json = getJsonTweets("GeekyTheory", 10);
//Codificamos el json
$json = json_decode($json);
//obtenemos un array con las filas, es decir con cada tweet.
$rows = $json->statuses;
//Iteramos los tweets, extraemos la información y la almacenamos en la base de datos.
for($i=0;$i<count($rows);$i++){
    $id_tweet = $rows[$i]->id_str;
    $tweet = $rows[$i]->text;
    $rts = $rows[$i]->retweet_count;
    $favs = $rows[$i]->favorite_count;
    $fecha_creacion = $rows[$i]->created_at;
    $usuario = $rows[0]->user->screen_name;
    $url_imagen = $rows[0]->user->profile_image_url;
    $followers = $rows[0]->user->followers_count;
    $following = $rows[0]->user->friends_count;
    $num_tweets = $rows[0]->user->statuses_count;
    
    //insertamos los datos en la base de datos
    insertarTweetInfo($id_tweet, $tweet, $rts, $favs, $fecha_creacion, $usuario, $url_imagen, $followers, $followings, $num_tweets);
}

PODÉIS DESCARGAR EL CÓDIGO EN EL SIGUIENTE REPOSITORIO DE GITHUB.

github-logo

¡Saludos! @alex_esquiva

 

¿Quieres seguir aprendiendo?