Twitter (+OAuth) desde PHP (PECL/OAuth)
Con el aumento de la popularidad de Twitter, a cada día vemos miles de nuevas aplicaciones, por cierto algunas muy útiles, debido probablemente a su amplia API. En este post describiré como autenticarse utilizando OAuth (en mi ejemplo con PECL/OAuth), y como hacer algunas operaciones básicas. Antes que nada, en mis códigos (utilizado en algunos proyecto que aun no han visto la luz) he utilizado lo escritor por Rasmus en su blog, por lo cual esto podría ser similar (pero no igual).
Para el ejemplo, utilizaré la siguiente table (en MySQL):
CREATE TABLE `user` ( `id` bigint(20) NOT NULL auto_increment, `user` varchar(100) NOT NULL, `password` varchar(32) default NULL, `tw_stage` tinyint(1) not null default 0, `tw_user` varchar(100) default NULL, `tw_token` varchar(64) default NULL, `tw_secret` varchar(64) default NULL, `tw_followers` int(11) default NULL, `tw_following` int(11) default NULL, `tw_description` text, `tw_avatar` varchar(250) default NULL, `tw_location` varchar(250) default NULL, `tw_created_at` datetime default NULL, PRIMARY KEY (`id`), UNIQUE KEY `user` (`user`) ) ENGINE=InnoDB;
Y el siguiente código (utilizando SimpleORM) para manejar la tabla de arriba:
class User extends DB
{
/* Informaciones del usuario, del sistema en si */
public $user;
public $password;
/* Informaciones de Twitter */
public $tw_stage;
public $tw_user;
public $tw_token;
public $tw_secret;
public $tw_avatar;
public $tw_following;
public $tw_followers;
public $tw_description;
public $tw_location;
public $tw_created_at;
}
La parte mas complicada del API es la autenticación en si, ya que tiene varios pasos.
define("KEY", "clave");
define("SECRET_KEY", "clave-privada");
$twitter = new OAuth(KEY,SECRET_KEY,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$twitter->enableDebug();
$user = new User;
$user->ID = $_SESSION['user_id'];
if (!$user->load()->valid()) {
die("invalid user");
}
La primera parte es muy sencilla, donde solicitamos a Twitter las claves (tokens) para la autenticación, luego guardamos en la base de datos (o podría ser $_SESSION). Luego con redirigimos a Twitter para que nuestro usuario se puede autenticar y autorizarnos el acceso.
$token_info = $twitter->getRequestToken('https://twitter.com/oauth/request_token');
$user->tw_token = $token_info['oauth_token'];
$user->tw_secret = $token_info['oauth_token_secret'];
$user->tw_stage = 1;
$user->save();
header('Location: https://twitter.com/oauth/authenticate?oauth_token='.$user->tw_token);
exit();
Luego si el usuario nos dio el acceso, Twitter redigirá a nuestro `callback URL` (que para comodidad debería ser el mismo script). Ahora tendremos que verificar si el usuario nos autorizó, y pedir los nuevos tokens para guardalos, ya que esos tokens serán los utilizados para autenticarnos, haciendo una analogía simple seria como usuario y contraseña.
$twitter->setToken($_GET['oauth_token'],$user->tw_secret);
$access_token_info = $twitter->getAccessToken('https://twitter.com/oauth/access_token');
$user->tw_token = $access_token_info['oauth_token'];
$user->tw_secret = $access_token_info['oauth_token_secret'];
$user->tw_stage = 2;
$user->save();
Si hasta aquí todo fue bien (no hubo ninguna excepción lanzada) el usuario ya está autenticado y ya podemos realizar todas las operaciones que requieran autenticación para el actual usuario. Este proceso solo debe realizarse una vez, ya que los tokens no expiran. Ahora, esta porción de código extrae informacion referente al perfil del usuario, generalmente también lo incluyo en la autenticación.
$twitter->setToken($user->tw_token,$user->tw_secret);
$twitter->fetch('https://twitter.com/account/verify_credentials.json');
$response = json_decode($this->getLastResponse());
$user->tw_followers = $response->followers_count;
$user->tw_following = $response->friends_count;
$user->tw_description = $response->description;
$user->tw_avatar = $response->profile_image_url;
$user->tw_name = $response->name;
$user->tw_location = $response->location;
$user->tw_created_at = $response->created_at;
$user->save();
Y poniendo todo lo arriba mencionado en un solo lugar obtendríamos algo así:
require "DB.php";
require "model.php";
define("KEY", "clave");
define("SECRET_KEY", "clave-privada");
$twitter = new OAuth(KEY,SECRET_KEY,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$twitter->enableDebug();
$user = new User;
$user->ID = $_SESSION['user_id'];
if (!$user->load()->valid()) {
die("invalid user");
}
/* Previniendo errores */
if ($user->tw_stage == 1 && !isset($_GET['oauth_token'])) {
$user->tw_stage = 0;
}
try {
switch ($user->tw_stage) {
case 0:
$token_info = $twitter->getRequestToken('https://twitter.com/oauth/request_token');
$user->tw_token = $token_info['oauth_token'];
$user->tw_secret = $token_info['oauth_token_secret'];
$user->tw_stage = 1;
$user->save();
header('Location: https://twitter.com/oauth/authenticate?oauth_token='.$user->tw_token);
exit();
case 1:
$twitter->setToken($_GET['oauth_token'],$user->tw_secret);
$access_token_info = $twitter->getAccessToken('https://twitter.com/oauth/access_token');
$user->tw_token = $access_token_info['oauth_token'];
$user->tw_secret = $access_token_info['oauth_token_secret'];
$user->tw_stage = 2;
$twitter->setToken($user->tw_token,$user->tw_secret);
$twitter->fetch('https://twitter.com/account/verify_credentials.json');
$response = json_decode($this->getLastResponse());
$user->tw_followers = $response->followers_count;
$user->tw_following = $response->friends_count;
$user->tw_description = $response->description;
$user->tw_avatar = $response->profile_image_url;
$user->tw_name = $response->name;
$user->tw_location = $response->location;
$user->tw_created_at = $response->created_at;
$user->save();
header("location: go-some-where.php");
break;
}
} catch (Exception $e) {
var_dump($e);
die("error");
}
Una vez autenticado, podemos realizar todas las acciones que un usuario puede hacer, como leer y enviar tweets, ver los tweets de sus amigos, y otras cosas
function sendTweet($text)
{
$twitter = new OAuth(KEY,SECRET_KEY,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_FORM);
$twitter->setToken($user->tw_token, $user->tw_secret);
$args = array('status'=> $text);
try {
$twitter->fetch('http://twitter.com/statuses/update.json',$args);
$json = json_decode($twitter->getLastResponse(),true);
} catch (Exception $e) {
return false;
}
return isset($json['id']) ? $json['id'] : false;
}
Espero que les sea de utilidad, no duden en comentar si tienen dudas.








Interesante guia rapida, guardada para jugarle mas tarde y ver de agregar a twpy
Podrías poner un enlace de descarga de tu ejemplo funcionando plz?
Es excelente. Magnífica explicación. Faltaron algunos detalles. ¿Como obtuvo el “oauth_token”?. Para ello necesita “clave” y “clave privada”. Desde la página WEB de twitter no se te permite obtener tal información a menos que tu aplicación esté en un sitio publico visible (con su URL). Por ejm, yo creé una aplicación que funciona en el navegador pero no es pública. Entonces twitter no me permite hacer el OAUTH etc… Si me salgo (sin hacer logout explicito) de la aplicación PERO NO del navegador tengo que ingresar login y password de nuevo cuando regreso. Esto no es problema por el momento. Pero dos amigos querian también usarla en forma privada y ahi viene el problema.
P.D.: La aplicación divide un tweet largo en subtweets <= 140 de longitud despues de codificar los http cn bit.ly. Saludos y me parece muy didáctica su explicación. No he visto ninguna así en la WEB ni en la página del OAUTH.
Oye y de donde descargo la clase OAuth, ya que estoy probando tu codigo pero me dice que no encuentra la clase:
Fatal error: Class ‘OAuth’ not found in /home/clubmu5/public_html/test/application/foro/chateando.php on line 280
gracias..¡¡
Es una clase PECL, lo puedes bajar de http://pecl.php.net/package/OAuth
Es una clase PECL, lo puedes bajar de http://pecl.php.net/package/OAuth