PHP + MYSQL + TWITTER: Obtener los tokens de un usuario a partir de la API Key.

¡Hola a todos!, en este tutorial sobre la serie PHP + TWITTER, vamos a realizar uno de los tutoriales más importantes a la hora de gestionar una aplicación web con la API de Twitter. Vamos a aprender a cómo obtener los tokens de un usuario generándolos a partir de nuestra API Key.

La realización de este tutorial requiere un servidor conectado a internet, no se puede realizar en localhost. Si no sabes de lo que estoy hablando, échale un vistazo a los siguientes tutoriales.

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
PHP + MYSQL + TWITTER: ALMACENAR INFORMACIÓN DE TWITTER EN UNA BASE DE DATOS

¿Y para qué queremos los tokens de un usuario?

Los tokens de un usuario nos permitirán realizar acciones con la cuenta de ese usuario, es decir, podremos por ejemplo enviar tweets desde su cuenta u obtener datos que sólo podremos obtener de esta forma.

¿Qué vamos a necesitar para gestionar todos estos datos?

  • Una aplicación de twitter con permisos de escritura y con enlace de callback
  • Una base de datos que almacenen los usuarios y sus tokens.
  • Un archivo php que haga de login.
  • Un archivo php que gestione el callback.

Una vez que hemos visto lo que necesitamos, vamos a empezar con la resolución del tutorial.

Aplicación de Twitter

Para generar una aplicación de twitter, tenemos que seguir los pasos que podrás encontrar en el tutorial CÓMO USAR LA API DE TWITTER EN PHP, pero con la excepción que en la pestaña de callback tenemos que indicarle donde queremos hacer el callback a la hora de loguearnos con nuestra cuenta.

En nuestro ejemplo vamos a usar un archivo llamado callback.php, por lo que la dirección de callback será: http://dominico.com/callback.php

Base de datos en MySQL

Vamos a necesitar una base de datos en la que almacenar los usuarios, la base de datos en cuestión va a ser la misma que usamos en el tutorial PHP + MYSQL + TWITTER: ALMACENAR INFORMACIÓN DE TWITTER EN UNA BASE DE DATOS, pero añadiendo la tabla usuarios, cuyo esquema es el siguiente:

Donde el id_twitter, será el id que genera twitter a cada usuario, el campo nombre será el nombre de usuario de twitter y por último token y token_secret serán los tokens generados para este usuario.

Estructura del proyecto

Una vez que tenemos la base de datos lista y nuestros datos de aplicación de Twitter, vamos a empezar a programar en PHP. La estructura web que vamos a usar en este ejemplo va a ser un poco distinta a la que os sugerí en el tutorial ESTRUCTURA DE UN PROYECTO WEB, pero por motivos de claridad vamos a realizar la siguiente estructura:

  • twitteroauth: librería necesaria para gestionar el acceso a la aplicación por OAUth. Esta librería la podéis descargar desde el siguiente enlace: Proyecto GitHub
  • config.php: Este archivo contendrá la información sobre los credenciales de la base de datos y las APIs Key de la aplicación de twitter.
  • login.php: Este archivo permitirá construir una cabecera especial con los datos de la API Key, una vez construida se redirigirá hacia twitter para que le demos permiso a la aplicación que hemos creado.
  • callback.php: Una vez que hemos dado permiso a la aplicación twitter llamará a la dirección que le hemos indicado en el campo callback. Éste recibirá la respuesta junto a los tokens del usuario, que almacenaremos en la base de datos.

A continuación vamos a ver la programación de cada archivo PHP.

config.php

<?php /** * PHP + MYSQL + TWITTER: Obtener los tokens de un usuario a partir de la API Key. * * @package  GeekyTheory * @author   Alejandro Esquiva Rodríguez <alejandro@geekytheory.com> * @license  Geekytheory License * @link     https://twitter.com/alex_esquiva */ define("SERVER","localhost"); define("USER","USER_DB"); define("PASS","PASS_DB"); define("DB","NAME_DB"); //DATOS API define("consumer_key",""); define("consumer_secret",""); ?>

login.php

<?php /** * twitter_go.php -- users opens it and gets redirected to twitter.com */ ini_set('display_errors', 1); require_once ('twitteroauth/twitteroauth.php'); require_once ('config.php'); //Objeto de la librería TwitterOAuth $to = new TwitterOAuth(consumer_key, consumer_secret); //Obtenemos los tokens de la aplicación a partir de una llamada a la api $tok = $to->getRequestToken(); $token = $tok['oauth_token']; $secret = $tok['oauth_token_secret']; $time = $_SERVER['REQUEST_TIME']; //temporary things, i will need them in next funtion, so i put them in cookie setcookie("ttok", $token, $time + 3600 * 30, '/'); //,'.domain.com'); //migh need to add domain if got problems setcookie("tsec", $secret, $time + 3600 * 30, '/'); //,'.domain.com'); //Hacemos una llamada de autorización obteniendo el enlace al que tenemos que llamar para autorizar la aplicación $request_link = $to->getAuthorizeURL($token); //nos reedirigimos aquí header('Location: ' . $request_link); ?>

callback.php

<?php ini_set('display_errors', 1); require_once ('twitteroauth/twitteroauth.php'); require_once ('config.php'); $consumer_key = consumer_key; $consumer_secret = consumer_secret; //Obtenemos el OAUth Token, este es el token que tenemos que enviar junto a las apis keys //para obtener los tokens del usuario $oauth_token = $_GET['oauth_token']; //  http://domain.com/twitter_back.php?oauth_token=MQZFhVRAP6jjsJdTunRYPXoPFzsXXKK0mQS3SxhNXZI&oauth_verifier=A5tYHnAsbxf3DBinZ1dZEj0hPgVdQ6vvjBJYg5UdJI if(!isset($_COOKIE['ttok'])) { die('No tenemos la cookie que hemos generado en login.php'); } $ttok = $_COOKIE['ttok']; $tsec = $_COOKIE['tsec']; //Obtenemos el OAUth_verifier $to = new TwitterOAuth($consumer_key, $consumer_secret, $ttok, $tsec); //Obtenemos los tokens del usuario $tok = $to->getAccessToken($_GET['oauth_verifier']); if(!isset($tok['oauth_token'])) { die('try again!'); } //Guardamos los tokens del usuario en estas variables $btok = $tok['oauth_token']; $bsec = $tok['oauth_token_secret']; //Vemos si funcionan los tokens que hemos obtenido, para hacer esta prueba intentamos //obtener los credenciales del usuario y los mostramos por pantalla $to = new TwitterOAuth($consumer_key, $consumer_secret, $btok, $bsec); $content = $to->OAuthRequest('https://api.twitter.com/1.1/account/verify_credentials.json',"GET",""); $json = json_decode($content); //Obtenemos el nombre del usuario y el id_twitter $nombre = $json->screen_name; $id_twitter = $json->id; //delete temp. cookies setcookie("ttok", '', 0, '/'); setcookie("tsec", '', 0, '/'); echo '<meta charset="UTF-8">'; //**Introducimos el usuario en la base de datos //creamos la conexión a la base de datos $conexion = mysqli_connect(SERVER, USER, PASS, DB); //Generamos una sentencia SQL para insertar datos en la base de datos $sql = "insert into usuarios (id_twitter,nombre,token,token_secret) values (".$id_tweet.",'".$nombre."','".$token."','".$token_secret."');"; //Ejecutamos la consulta if(!$result = mysqli_query($conexion, $sql)) die(mysqli_error($conexion)); //cerramos la conexion $close = mysqli_close($conexion); ?>

Una vez que ya tenemos todo escrito y subido a nuestro servidor, vamos a ver si funciona. Si llamamos al enlace http://dominio.com/login.php , nos aparecerá la siguiente ventana, pidiéndonos la aprobación del acceso a nuestra aplicación.

Podemos observar las acciones que podremos hacer sobre esta cuenta de twitter y las acciones que no podemos hacer. Cuando le demos acceso, reenviará al archivo callback.php y almacenaremos sus tokens en la base de datos.

Una vez que tenemos los tokens del usuario, para poder realizar acciones con su cuenta podremos hacer lo que hicimos en los tutoriales anteriores, pero cambiando las claves token y token_secret. Por los tokens del usuario.

Y esto es todo, con este tutorial y un poco fluidez a la hora de programar, podemos construir potentes herramientas en Twitter que nos permitan obtener o realizar acciones sobre usuarios.

¡Saludos! @alex_esquiva