tOAuth: la API de Twitter con OAuth y PHP

19 Febrero 2010 15 Comentario(s) Comentar Trackback URI

La API de Twitter dispone de soporte para OAuth, un protocolo que permite que los usuarios puedan hacer uso de aplicaciones sin tener que introducir su usuario y contraseña, evitando el riesgo que esto conlleva. Para los usuarios, este protocolo es una ventaja, además de por la seguridad que ofrece, por la comodidad a la hora de autentificarse en las aplicaciones (para lo que bastan unos simples clics del ratón), pero para los desarrolladores no lo es tanto. Desde mi (humilde) punto de vista, al OAuth le pueden dar por saco.

En la documentación oficial de la API hay un código de ejemplo alojado en GitHub de cómo usar OAuth con PHP. Este ejemplo no me gustaba y me parecía lioso, por eso me puse a ver cómo funcionaba hasta conseguir crear un clon más sencillo. El resultado, tOAuth, una class en PHP que permite usar de manera simple la API de Twitter con OAuth.

Podéis encontrar el código de la class junto con un ejemplo de uso en el repositorio tOAuth de mi cuenta de GitHub. El ejemplo creo que es bastante explícito por sí solo, pero de todas formas a continuación procedo a explicarlo.


Registro:
Para hacer uso de OAuth en nuestras aplicaciones, deberemos tenerlas registradas como tales en Twitter. Esto se logra desde la página http://twitter.com/oauth_clients/ en la que tenemos un formulario para hacer esto y donde podremos administrar todas las aplicaciones que registremos. En dicho formulario tendremos que rellenar varios campos, entre ellos:

  • Application Type: Evidentemente tendremos que marcar "Browser"
  • Callback URL: La URL a la que Twitter redirigirá a los usuarios una vez autentificados. Por ejemplo: http://dominio.com/toauth
  • Default Access type: Marcamos "Read & Write" para que nuestra aplicación sea capaz de enviar datos (por ejemplo, para actualizar el timeline del usuario)
  • Use Twitter for login: Marcamos "Yes, use Twitter for login"

Una vez registrada la aplicación, se nos asignarán dos keys fundamentales para el uso de OAuth. En el ejemplo, estas dos keys son definidas como constantes para su posterior uso:



<?php

define
('CONSUMER_KEY''xxxxxxxxxxxxxxxxxxxxx');
define('CONSUMER_SECRET''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');


Todo usuario que quiera hacer uso de nuestra aplicación tendrá que autentificarse. Este proceso consta de dos partes. Lo primero será obtener el link de Twitter al que tendrá que entrar el usuario para autentificarse:


<?php

$connection 
= new tOAuth(CONSUMER_KEYCONSUMER_SECRET);
$a $connection->authenticate(true);

Esto nos devolverá un array con dos token que deberemos almacenar de forma temporal (por ejemplo en una sesión) y el link mencionado anteriormente.

Una vez que el usuario vuelva a nuestra página tendremos que hacer una nueva petición enviando los token de la anterior ($_SESSION['toauth_rt'] y $_SESSION['toauth_rts'] en el ejemplo):


<?php

$connection 
= new tOAuth(CONSUMER_KEYCONSUMER_SECRET$_SESSION['toauth_rt'], $_SESSION['toauth_rts']);
$a $connection->authenticate(false);

Nuevamente nos devolverá un array, salvo que en este caso contendrá sólo dos token que son los que usaremos en las peticiones a la API como si del usuario/contraseña se tratara. Si queremos podemos guardarlo de forma permanente (por ejemplo, en una base de datos) para usos futuros.

Peticiones:
Para realizar peticiones (ya sean GET o POST) a la API lo primero será crear una nueva instancia de la class pasándole los token del usuario que obtuvimos en la autentificación ($_SESSION['toauth_at'] y $_SESSION['toauth_ats'] en el ejemplo):


<?php
$connection 
= new tOAuth(CONSUMER_KEYCONSUMER_SECRET$_SESSION['toauth_at'], $_SESSION['toauth_ats']);

Después ya podremos hacer las peticiones que necesitemos a la API. Ejemplos:


<?php

# GET Usage: array get ( string $method [, array $args ] )
# POST Usage: array post ( string $method , array $args )

$r $connection->get('account/verify_credentials');

$r $connection->post('statuses/update', array('status'=>'Hello World'));


Y esto es todo, espero que os sea de utilidad tanto como a mí. Si queréis estar al tanto de cambios y actualizaciones, podéis suscribiros al repositorio en GitHub. Para cualquier duda, sugerencia, crítica o lo que sea, ya sabéis, dejad un comentario :)


Comentarios

#1 rayko el 19 Febrero 2010. Responder

wow :) por fin lo sacas xDDD gracias :3

#2 Xytry el 1 Marzo 2010. Responder

Hola, solo una duda, estoy usando la siguiente funcion para obtener los replies:

$r = $connection->get('statuses/mentions'); print_r($sc);

pero me lo devuelve en texto plano, <pregunta noob> como le meto CSS??? </pregunta noob>


Saludos ! ñ_ñ

#3 rayko el 5 Marzo 2010. Responder

te tocara meterlo en un foreach (por ejemplo) y asi recorrer todo el array, dentro del for le metes los que quieras mas o menos:



<?php

$mentions 
$connection->get('statuses/mentions');

foreach(
$mentions as $notes){
    echo 
'<div class="note">';
    echo 
"<div class=\"avatar\"><img alt=\"avatar\" src=\"{$notes[$type]['profile_image_url']}\" height=\"42\" width=\"42\" /></div>";
    echo 
'<div class="user">';
    echo 
"<span>{$notes[$type]['screen_name']} {$source} <a href=\"#\"></a>{$notes['created_at']}</span>";
    echo 
"<p>{$notes['text']}</p>";
    echo 
'</div></div>';
}


mas o menos quizas asi, este ejemplo te lo estoy haciendo con una class de Twitter que me pasó @scromega hace tiempo, supongo que con esta class nueva sera igual, si no ahí tienes una especie de guia por donde ir xD

saludos y espero que algo te ayudase xD :)

#4 David Valdez el 8 Marzo 2010. Responder

Pregunta, tienes contemplado estos dos métodos?

http://apiwiki.twitter.com/Twitter-REST-API-Method:-account update_profile_image

http://apiwiki.twitter.com/Twitter-REST-API-Method:-account update_profile_background_image

Donde la api de twitter espera la imagen como multipart data en el request?

#5 scromega el 9 Marzo 2010. Responder

#4 David Valdez: Creo que ni la class "oficial" (la de http://github.com/abraham ) da soporte a esos métodos. Yo he tratado por un rato de implementarlo y no he sido capaz, mañana seguiré haciendo pruebas. Si llego a implementarlo, actualizaría la class en Github, por lo que te animo a que estés pendiente del mismo.

#6 David Valdez el 9 Marzo 2010. Responder

Hola,

Tienes razón también probe con esa biblioteca sin exito, pero después de 3 días peleandome con eso encontré esta que hace el truco

http://wiki.github.com/jmathai/twitter-async/

Espero te de ideas para que implementes esos métodos en tu biblioteca que esta muy buena :)

David.

#7 Xytry el 17 Marzo 2010. Responder

#3 rayko: Gracias, lo probare :D

#8 Xytry el 17 Marzo 2010. Responder

#3 rayko: Gracias, Me sirvio a la perfeccion :D , bueno, unos ligeros cambios pero funciona . :D

#9 empezando el 23 Marzo 2010. Responder

Hola. Por mas que intento registrar la aplicación que quiero probar siempre me dice:
No se puede registrar esta solicitud. Compruebe la configuración de registro.
No sé en que falla.
Saludos

#10 rayko el 24 Marzo 2010. Responder

#8 Xytry: me alegra :D

#11 scromega el 25 Marzo 2010. Responder

#9 empezando: ¿Rellenaste todos los campos correctamente? :S Yo acabo de registrar una aplicación para probar y he se ha registrado correctamente. De todas formas algo leí de que Twitter anda con problemas con el OAuth, igual es por eso que no pudiste registrarla.


#8
Xytry: Me alegro de que con la ayuda de rayko pudieras hacer lo que querías :D

#12 empezando el 25 Marzo 2010. Responder

Muchas gracias scromega

Los datos que pongo son:


Imagen de: 29,3 KiB

Application Name: Aplicacion_de_Prueba
Description: Mi prueba.
Application Website: http://twitter.com/mitwitter
Organization: PARTICULAR
Website: http://www.marca.es
Application Type: Browser
Callback URL: http://miprueba.blogspot.com/
Default Access type: Read & Write
Use Twitter for login: Yes, use Twitter for login

#13 empezando el 26 Marzo 2010. Responder

Ya la he registrado. No me hbía dado cuenta que la descripción es minimo 30 carácteres
¡¡ Gracias !!

#14 empezando el 26 Marzo 2010. Responder

Lo he probado y: ¡ muy bueno !
Gracias.

#15 empezando el 27 Marzo 2010. Responder

Hola de nuevo y gracias.
Una vez que tenemos los valores de toauth_at y toauth_ats, a ¿qué metodo se debe llamar para que el usuario entre directamente sin tener que pasar por https://twitter.com/login?, es decir ya que tengo sus "token de acceso" en mi aplicación que cuando quiera ir a Twitter entre directamente.

Gracias

Comentar


 No sera publicado. Para el Gravatar.
 Opcional.

  Introduce los caracteres de la imagen en el campo.
 Recordar tus datos para futuras visitas.


Trackbacks

Bitacoras.com el 20 Febrero 2010.

Información Bitacoras.com
Valora en Bitacoras.com: La API de Twitter dispone de soporte para OAuth, un protocolo que permite que los usuarios puedan hacer uso de aplicaciones sin tener que introducir su usuario y contraseña, evitando el riesgo que esto conlleva. Para los usua...