¿Cómo obtener tweets con php y oauth 2.0 ?


Hace unos dias tuve que implementar en un sitio en php un feed con twitter,facebook y youtube pero en este post voy a explicarles como obtener tweets de una cuenta de un usuario o realizar busqueda de tweets con ciertas palabras o hashtag.

Como primer paso debemos crear nuestra app en Twitter Application Management

Una vez que creamos nuestra aplicación en twitter vamos a la pestaña Keys and Access Tokens y hacemos clic en el boton “Regenerate Consumer Key and Secret” y creamos nuestras keys, hacemos el mismo procedimiento para el boton “Create my access token”

Bien ahora debemos tener Consumer Key (API Key), Consumer Secret (API Secret), Access Token y Access Token Secret que nos serviran para hacer la autenticación (oauth 2.0) con twitter.

Nuestro feed debe ser capaz de hacer lo siguiente:

Vamos a crear un archiv functions.php que contendra todas la funciones para obtener, guardar y procesar los tweets y nuestro archivo index.php solo contenga el html y quede lo mas limpio posible.

functions.php

<?php

    require_once('TwitterOAuth/vendor/autoload.php');
    require_once('DiskTools.php');

    
    use TwitterOAuthAuthSingleUserAuth;
    use TwitterOAuthSerializerArraySerializer;



    function getDataTweets($username){

        $auth = new SingleUserAuth(array(
            'consumer_key'             => '',
            'consumer_secret'         => '',
            'oauth_token'             => '',
            'oauth_token_secret'     => ''
        ), new ArraySerializer());

        $params = array(
            'screen_name' => $username,
            'count' => 4 //numero de tweets que deseo obtener
        );

        $response = $auth->get('statuses/user_timeline', $params);
        return $response;
    }

    function getData($userName){
        $disk         = new DiskTools();
        $fileName = 'twitter-'.$userName.'.json';

        /*
            verificamos si existe el archivo si no existe pidemos la data y la guardamos
            si ya existe vificamos cuando tiempo ha pasado si ya paso mas de x tiempo volvemos a pedir los datos si no pedimos el archivo.json
        */
        if($disk->existFile($fileName)){
            /*mayor a 15 minutos*/
            if($disk->getLastModify($fileName) > 15){
                $data = getDataTweets($userName);
                $disk->save($fileName,$data);
                return $disk->getDataFile($fileName);
            }else{
                /* aun no pasan los 15 minutos mandamos a pedir el archivo json*/
                return $disk->getDataFile($fileName);
            }
        }else{
            /*no existe el archivo pedimos los datos y creamos el json*/
            $data = getDataTweets($userName);
            $disk->save($fileName,$data);
            return $disk->getDataFile($fileName);
        }
    }

?>

En el archivo functions.php importamos la libreria de twitterOauth y creamos una funcion getDataTweets que recibe como parametro el nombre de usuario y nos retorna un arreglo con los tweets.

Ahora debemos poder guardar en nuestro servidor el archivo .json con la data que obtuvimos a travez de twitter para eso cree un archivo DiskTools.php que contiene una clase y varias funciones que nos ayudaran a guardar el archivo.

<?php

    class DiskTools {
        const FOLDER_DATA = __DIR__.'../../data/';

        public function existFile($fileName){
            /*esta funcion nos permite verificar si existe o no el archivo*/
            return file_exists(self::FOLDER_DATA.$fileName);
        }

        public function  getLastModify($fileName){
            $time = filemtime(self::FOLDER_DATA.$fileName);
            $diff = time()-$time;
            $minutes = round($diff/60); 
            return $minutes;
            /*retorna el numero de minutos que han
            pasado desde la ultima modificación:*/
        }

        public function getDataFile($fileName){
            return json_decode(trim(file_get_contents(self::FOLDER_DATA.$fileName)));
            /* Abre el archivo json y convierte la data en un arreglo*/
        }

        public function save($fileName,$data){
            return file_put_contents(self::FOLDER_DATA.$fileName,json_encode($data), LOCK_EX);
            /*
                guardar los datos en el archivo .json
                LOCK_EX se usa para que no se escriba al mismo tiempo el archivo, 
                si llegan dos request y al mismo tiempo intenta escribir solo el que entro primero escribre el archivo.    
            */
        }
    }
?>

Si en nuestro archivo index.php colocamos el siguiente codigo:

<?php
    require_once('libraries/functions.php');
    $userName = 'herelss';
    $data = getData('herelss');
    var_dump($data);
?>

y ejecutamos en nuestro navegador veremos los siguientes datos:

Ahora agregamos algunos estilos procesamos la data y obtenemos el siguiente resultado


Puedes descargar el repositorio en el siguiente link ó ver el ejemplo aquí.

Gracias por leer y compartir este tutorial cuentame que te parecio y que podemos mejorar aqui algunos libros que me han ayudado a mejorar las buenas practicas a la hora de programar.