Jugando con el API de Twitter (PHP)

   Ayer hablábamos de APIs, sabiendo ya que son y que hacen, entonces vamos a comenzar con algunos experimentos, el API de Twitter (y los mas utilizados) manejan un protocolo de conexión segura llamado oAuth, este se basa en Tokens y claves de accesso encriptadas de forma segura para que asegurarse que la data se accede con los permisos adecuados y por una persona o aplicación concreta..... Para mas info ver: oAuth Wikipedia.

   Bueno, vamos a lo que nos interesa, lo primero es tener la conexión mediante oAuth, para ello podemos descargarmos los archivos desde GitHub (solo nos hace falta la carpeta twitteroauth).

   Una vez hecho esto vamos a la zona de desarrollo de twitter y creamos un App, basta con rellenar todos los campos requeridos y tener nuestra aplicación en marcha, una vez hecho esto nos resta darle los permisos adecuados, para ello vamos a nuestra App y en la pestaña de configuración nos dirigimos al tipo de aplicación para darle permisos de lectura y escritura.

My App > Settings / Application Type / Read and Write

   Ahora nos dirigimos a la pestaña oAuth Tool y, si no tenemos valores en los tokens, generamos los valores. Estos son los que necesitamos para comenzar a desarrollar nuestra aplicación e interactuar con el API. Una vez tengamos todo preparado vamos con el código, para este ejemplo crearemos un archivo llamado datos_oAuth.php.

require_once('twitteroauth/autoload.php');

use Abraham\TwitterOAuth\TwitterOAuth;

$consumerKey    = 'MI_CONSUMER_KEY';
$consumerSecret = 'MI_CONSUMER_KEY_SECRET';
$oAuthToken     = 'MI_CONSUMER_TOKEN';
$oAuthSecret    = 'MI_CONSUMER_TOKEN_SECRET';

$conexion = new TwitterOAuth($consumerKey, $consumerSecret, $oAuthToken, $oAuthSecret);

   Como podemos ver en el colocamos todas las variables, es más fácil hacerlo así ya que si necesitamos acceder muchas veces al API para realizar distintas consultas, solo incluimos la configuración a nuestro archivo.

   Ahora vamos con nuestro archivo principal:

require_once('datos_oAuth.php');

$tweets = $conexion->get("https://api.twitter.com/1.1/LO_QUE_HAREMOS_EN_URL");

   Ya solo nos resta cambiar la URL por lo que queramos obtener, podemos consultar la documentación para ver los métodos que tenemos a nuestra disposición, para el ejemplo obtendremos los últimos tweets, así que el código vendría quedando de la siguiente manera:

require_once('datos_oAuth.php');

$tweets = $conexion->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=carlitoxenlaweb&count=5");

// Creamos el JSON
$json = json_encode($tweets);
echo $json;

   Esto nos devuelve una estructura en formato JSON, el cual podemos procesar mediante el mismo PHP, para ello utilizamos la función inversa para convertir la data en arreglo php y procesarla, de forma que nuestro código para el ejemplo quedaría así:

require_once('datos_oAuth.php');

$tweets = $conexion->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=carlitoxenlaweb&count=5");

// Creamos el JSON
$json = json_encode($tweets);
echo $json;

echo "<br/><br/><hr/>Ahora mas entendible...<hr/><br/>";

// Procesamos el JSON
$arrJson = json_decode($json, true);
echo '<div>';
foreach ($arrJson as $key=>$valor) {
  echo '<p>' . $valor->text . '</p>';
}
echo '</pre>';

   Si todo ha salido bien, entonces tendremos un resultado como el siguiente:


   Aunque para optimizar nuestro código (y por ser buena práctica) podemos utilizar otros lenguajes del lado del cliente para procesar el JSON como JavaScript...

   NOTA: la función "json_decode" nos crea un array a partir del JSON, por lo que podemos acceder a cualquier dato obtenido siguiendo el orden lógico, por ejemplo, para obtener el nombre: "$arrJson[0]['user']['screen_name']"... Para ver el array podemos agregar esto al código y así ver de forma ordenada en que posición están los campos que queremos mostrar:

echo "
";
  print_r($arrJson);
echo "
";



12 Comentarios

Escribir Comentario
Adrian
AUTOR
11 de junio de 2013, 23:30 delete

Un artículo muy interesante, la verdad es que era justo lo que necesitaba, pero tengo una pequeña pregunta.

Se podría poner un enlace del tweet. pensaba que era $valor->link pero no me devuelve nada.

Muchas gracias por el blog!

Responder
avatar
12 de junio de 2013, 10:29 delete

Buena pregunta, he editado el post explicando como obtener cada valor... Lo que necesitas es mostrar esa variable que esta dentro del arreglo, el método "json_decode" hace precisamente eso, ahora solo te hacer mostrarla en pantalla: "echo $arrJson[0]['user']['screen_name'];"

Responder
avatar
Adrián
AUTOR
12 de junio de 2013, 15:32 delete

Mil gracias! me viene de perlas para terminar un widget de wordpress. Os lo compartiré en cuanto lo termine.

Muchas gracias.

Responder
avatar
Adrián
AUTOR
12 de junio de 2013, 15:55 delete

Hola Carlos, antes que nada muchas gracias por tu rápida contestación.

El caso es que lo he probado y me devuelve Cannot use object of type stdClass as array porqué lo convierte en objetos. el caso es que pude acceder a lo que pensaba que era la url de esta forma:

echo $valor->user->url;

pero aun estado esto dentro del foreach me repite siempre la misma url

// Procesamos el JSON
$arrJson = json_decode($json);


foreach ($arrJson as $key=>$valor) {
echo $valor->text; // Me obtiene el texto
echo $valor->user->url // url pero siempre la misma ¿?
}

Sabrías decirme como acceder a la url del tweet?... lo he intentado pero la verdad es que me he perdido en el array.

Muchas gracias por todo.

Responder
avatar
12 de junio de 2013, 16:51 delete

Disculpa la tardanza, fijate bien en esta linea, a lo mejor no la notaste al momento de la corrección del post.....

// Procesamos el JSON
$arrJson = json_decode($json, true); //Fijate en el ,true

Saludos!!

Responder
avatar
Anónimo
AUTOR
27 de octubre de 2013, 4:11 delete

Hola podrias subir los archivos para probarlo? gracias

Responder
avatar
30 de octubre de 2013, 5:08 delete

No hay necesidad de eso, en la entrada esta publicado todo con detalles....

Responder
avatar
31 de octubre de 2013, 21:25 delete

Hola , he probado tu ejemplo pero hay algo que no entiendo. Traigo el timeline de una cuenta pero los reply que le hayan dado a uno de esos tweets no viene en el timeline. Si por ejemplo postee un tweet y algunos de mis seguidores me respondio a uno de esos tweets esas respuestas no vienen en el timeline. Modifique un poco la linea de JSON pero nada
Esta es la nueva llamada
$tweets = $conexion->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=TweetCubano&count=20&exclude_replies=false");

Salen bien pero los reply a mis tweets no vienen

Responder
avatar
1 de noviembre de 2013, 8:16 delete

Si vas a traerte tanta data deberías comenzar por el API Streamming (https://dev.twitter.com/docs/streaming-apis), en todo caso para traer las respuestas a tus tweets debes hacer lo siguiente:

- Debes tomar los tweets (IDs) de los cuales quieres obtener las respuestas.
- Luego tomas cada tweet y lo pasas por el método "statuses/show/:id".

La documentación la encuentras aca: https://dev.twitter.com/docs/api/1.1/get/statuses/show/%3Aid

El problema de esto es que como tu dices, las respuesta a los tweets no están en tu Timeline, por lo que tienes que buscar otra forma, una es tomar el ID del usuario que dio reply a tu tweet y leer su timeline (poco práctico salvo ciertas condiciones), y la otra es hacerlo como te explico..... Saludos!!!

Responder
avatar
1 de noviembre de 2013, 10:38 delete

Pense en eso pero hay varios problemas:
1-Primero con el streaming tengo que estar conectado siempre y eso no lo puedo hacer.
2-Pense en tomar cada tweet pero imaginate seria imposible porque no se a cual tweet van a responder y tendria que revisar todos practicament, no es factible.

Pense que los reply se mantenian en el timeline pero tiene que haber una forma de traerlos como el timeline pero solo los reply lo que no entiendo es para que el timeline entonces tiene un parametro exclude_replies pense que ahi activabas si lo querias o no.
Gracias de todas formas....vere como puedo seguir

Responder
avatar
2 de noviembre de 2013, 1:30 delete

No precisamente, en el enlace que te he pasado anteriormente te explicaba la forma de hacerlo para unos pocos tweets, pero si necesitas algo mas grande puedes leerte el siguiente enlace del API:

https://dev.twitter.com/docs/api/1.1/get/search/tweets

Obten el primer ID de tu timeline al que quieres cargar los "replies", luego usas el "since_id" con el ID del tweet, para combinarlo con "max_id" y "count".... A todo esto el JSON retornado tendrá varios arreglos, de los cuales las llaves que te interesan son:

- in_reply_to_user_id (ID del usuario base en respuesta al tweet)
- text (el contenido de la respuesta o reply)
- id (el ID del tweet en si)
- user[arr] (datos del usuario que realizo el reply)

Espero se entienda.... Saludos!!!

Responder
avatar
Juan
AUTOR
1 de febrero de 2014, 16:22 delete

Tras horas buscando, os dejo la forma más fácil que he encontrado para mostrar el timeline de un usuario:

https://github.com/davidmigloz/Twitter-Timeline

Es muy configurable en cuanto a la información que quieres mostrar y puedes personalizar fácilmente el código html que genera. Y además, está en español.

Un saludo

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión