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?