Crear un widget de Twitter con la última API de Twitter
Spanish (Español) translation by Luis Chiabrera (you can also view the original English article)
Twitter hizo varios cambios cuando lanzaron 1.1 de su API. Uno de los cambios más notables es la introducción de la autenticación. Es decir, las aplicaciones deben autenticarse antes de poder enviar solicitudes a la API.
La autenticación es impulsada por OAuth, un protocolo abierto que permite la autorización segura en un método simple y estándar que permite a los usuarios aprobar la aplicación para actuar en su nombre sin compartir su contraseña.
En este tutorial, aprenderemos cómo interactuar mediante programación con la API de Twitter a medida que desarrollamos un widget de WordPress de la línea de tiempo de Twitter que muestra una lista de los últimos tweets realizados por un usuario de Twitter.
Aquí hay una vista previa del widget de línea de tiempo de Twitter que se construirá al final de este tutorial.
Para enviar solicitudes a la API de Twitter con éxito, debe crear una aplicación con autorización de OAuth porque no se permitirán las solicitudes no autorizadas.
Para crear una aplicación de Twitter, debe iniciar sesión en el panel del desarrollador de Twitter utilizando su cuenta de Twitter. El punto de crear una aplicación es darte a ti mismo (y a Twitter) un conjunto de claves.
Éstos incluyen:
- la clave del consumidor
- el secreto del consumidor
- el token de acceso
- el token de acceso secreto
Siga los pasos a continuación para crear una aplicación de Twitter y para generar las claves.
- Inicie sesión en la cuenta de desarrollador de Twitter utilizando su cuenta de Twitter y navegue hasta la consola de administración de aplicaciones.
- Haga clic en el botón Crear nueva aplicación para iniciar la creación de la aplicación de Twitter.
- Rellene el formulario y haga clic en el botón Enviar para crear la aplicación.
- Haga clic en la aplicación, navegue a la pestaña Permisos y cambie el nivel de Acceso a Lectura y Escritura.
Si desea hacer un uso decente de esta API, deberá cambiar su configuración a Lectura y Escritura si está haciendo otra cosa que no sea la recuperación de datos estándar utilizando las solicitudes GET.


Para obtener la clave y el secreto del consumidor de la aplicación, vaya a la pestaña Claves de la API.
Las claves de API y el secreto de API son la clave de consumidor y el secreto de consumidor, respectivamente.



Para obtener el token de acceso a la aplicación y los secretos del token, aún en la pestaña Claves de la API, desplácese hacia abajo y haga clic en el botón Crear mi token de acceso para crear los tokens de acceso.



Actualice la página y se le mostrarán los tokens de acceso a su aplicación.



Ahora tenemos la clave y el secreto del consumidor y también el token de acceso y las claves secretas. Estas credenciales de OAuth son autenticadas por Twitter al enviar solicitudes a la API.
La configuración del widget del widget de la línea de tiempo de Twitter que estamos codificando constará de campos de formulario que recopilarán y guardarán estas credenciales de OAuth en la base de datos para que el widget las reutilice.
Comencemos a codificar el complemento del widget de línea de tiempo de Twitter.
Desarrollo de widget de línea de tiempo de Twitter
El encabezado es lo primero que debe ingresar en el archivo del complemento es el encabezado del complemento.
1 |
<?php
|
2 |
/*
|
3 |
Plugin Name: Twitter Tweets Widget
|
4 |
Plugin URI: http://code.tutsplus.com
|
5 |
Description: Displays latest tweets from Twitter.
|
6 |
Author: Agbonghama Collins
|
7 |
Author URI: http://tech4sky.com
|
8 |
*/
|
Crea una clase extendiendo la clase padre WP_Widget.
1 |
class Twitter_Tweets_Widget extends WP_Widget { |
2 |
// ...
|
Dale al widget un nombre y una descripción a través del método mágico __construct ().
1 |
function __construct() { |
2 |
parent::__construct( |
3 |
'twitter-tweets-widget', |
4 |
__( 'Twitter Tweets Widget', 'twitter_tweets_widget' ), |
5 |
array( |
6 |
'description' => __( 'Displays latest tweets from Twitter.', 'twitter_tweets_widget' ) |
7 |
)
|
8 |
);
|
9 |
}
|
El método form () a continuación crea el formulario de configuración del widget que guardará las credenciales de OAuth en la base de datos para que el widget las reutilice más adelante.
1 |
public function form( $instance ) { |
2 |
|
3 |
if ( empty( $instance ) ) { |
4 |
$twitter_username = ''; |
5 |
$update_count = ''; |
6 |
$oauth_access_token = ''; |
7 |
$oauth_access_token_secret = ''; |
8 |
$consumer_key = ''; |
9 |
$consumer_secret = ''; |
10 |
$title = ''; |
11 |
} else { |
12 |
$twitter_username = $instance['twitter_username']; |
13 |
$update_count = isset( $instance['update_count'] ) ? $instance['update_count'] : 5; |
14 |
$oauth_access_token = $instance['oauth_access_token']; |
15 |
$oauth_access_token_secret = $instance['oauth_access_token_secret']; |
16 |
$consumer_key = $instance['consumer_key']; |
17 |
$consumer_secret = $instance['consumer_secret']; |
18 |
|
19 |
if ( isset( $instance['title'] ) ) { |
20 |
$title = $instance['title']; |
21 |
} else { |
22 |
$title = __( 'Twitter feed', 'twitter_tweets_widget' ); |
23 |
}
|
24 |
}
|
25 |
|
26 |
?>
|
27 |
<p>
|
28 |
<label for="<?php echo $this->get_field_id( 'title' ); ?>"> |
29 |
<?php echo __( 'Title', 'twitter_tweets_widget' ) . ':'; ?> |
30 |
</label>
|
31 |
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /> |
32 |
</p>
|
33 |
<p>
|
34 |
<label for="<?php echo $this->get_field_id( 'twitter_username' ); ?>"> |
35 |
<?php echo __( 'Twitter Username (without @)', 'twitter_tweets_widget' ) . ':'; ?> |
36 |
</label>
|
37 |
<input class="widefat" id="<?php echo $this->get_field_id( 'twitter_username' ); ?>" name="<?php echo $this->get_field_name( 'twitter_username' ); ?>" type="text" value="<?php echo esc_attr( $twitter_username ); ?>" /> |
38 |
</p>
|
39 |
<p>
|
40 |
<label for="<?php echo $this->get_field_id( 'update_count' ); ?>"> |
41 |
<?php echo __( 'Number of Tweets to Display', 'twitter_tweets_widget' ) . ':'; ?> |
42 |
</label>
|
43 |
<input class="widefat" id="<?php echo $this->get_field_id( 'update_count' ); ?>" name="<?php echo $this->get_field_name( 'update_count' ); ?>" type="number" value="<?php echo esc_attr( $update_count ); ?>" /> |
44 |
</p>
|
45 |
<p>
|
46 |
<label for="<?php echo $this->get_field_id( 'oauth_access_token' ); ?>"> |
47 |
<?php echo __( 'OAuth Access Token', 'twitter_tweets_widget' ) . ':'; ?> |
48 |
</label>
|
49 |
<input class="widefat" id="<?php echo $this->get_field_id( 'oauth_access_token' ); ?>" name="<?php echo $this->get_field_name( 'oauth_access_token' ); ?>" type="text" value="<?php echo esc_attr( $oauth_access_token ); ?>" /> |
50 |
</p>
|
51 |
<p>
|
52 |
<label for="<?php echo $this->get_field_id( 'oauth_access_token_secret' ); ?>"> |
53 |
<?php echo __( 'OAuth Access Token Secret', 'twitter_tweets_widget' ) . ':'; ?> |
54 |
</label>
|
55 |
<input class="widefat" id="<?php echo $this->get_field_id( 'oauth_access_token_secret' ); ?>" name="<?php echo $this->get_field_name( 'oauth_access_token_secret' ); ?>" type="text" value="<?php echo esc_attr( $oauth_access_token_secret ); ?>" /> |
56 |
</p>
|
57 |
<p>
|
58 |
<label for="<?php echo $this->get_field_id( 'consumer_key' ); ?>"> |
59 |
<?php echo __( 'Consumer Key', 'twitter_tweets_widget' ) . ':'; ?> |
60 |
</label>
|
61 |
<input class="widefat" id="<?php echo $this->get_field_id( 'consumer_key' ); ?>" name="<?php echo $this->get_field_name( 'consumer_key' ); ?>" type="text" value="<?php echo esc_attr( $consumer_key ); ?>" /> |
62 |
</p>
|
63 |
<p>
|
64 |
<label for="<?php echo $this->get_field_id( 'consumer_secret' ); ?>"> |
65 |
<?php echo __( 'Consumer Secret', 'twitter_tweets_widget' ) . ':'; ?> |
66 |
</label>
|
67 |
<input class="widefat" id="<?php echo $this->get_field_id( 'consumer_secret' ); ?>" name="<?php echo $this->get_field_name( 'consumer_secret' ); ?>" type="text" value="<?php echo esc_attr( $consumer_secret ); ?>" /> |
68 |
</p>
|
69 |
<?php
|
70 |
|
71 |
}
|
A continuación se muestra una captura de pantalla de la configuración del widget creada por el método form () anterior.

Cuando los valores se ingresan en el campo del formulario de configuración, deben guardarse en la base de datos. El método update () desinfecta los valores del formulario del widget eliminando los datos maliciosos y luego guarda los datos desinfectados en la base de datos.
1 |
public function update( $new_instance, $old_instance ) { |
2 |
$instance = array(); |
3 |
|
4 |
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : ''; |
5 |
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : ''; |
6 |
$instance['twitter_username'] = ( ! empty( $new_instance['twitter_username'] ) ) ? strip_tags( $new_instance['twitter_username'] ) : ''; |
7 |
$instance['update_count'] = ( ! empty( $new_instance['update_count'] ) ) ? strip_tags( $new_instance['update_count'] ) : ''; |
8 |
$instance['oauth_access_token'] = ( ! empty( $new_instance['oauth_access_token'] ) ) ? strip_tags( $new_instance['oauth_access_token'] ) : ''; |
9 |
$instance['oauth_access_token_secret'] = ( ! empty( $new_instance['oauth_access_token_secret'] ) ) ? strip_tags( $new_instance['oauth_access_token_secret'] ) : ''; |
10 |
$instance['consumer_key'] = ( ! empty( $new_instance['consumer_key'] ) ) ? strip_tags( $new_instance['consumer_key'] ) : ''; |
11 |
$instance['consumer_secret'] = ( ! empty( $new_instance['consumer_secret'] ) ) ? strip_tags( $new_instance['consumer_secret'] ) : ''; |
12 |
|
13 |
return $instance; |
14 |
}
|
Encontré un Simple PHP Wrapper para la API de Twitter muy útil que hace que el envío y la recepción de la respuesta de la API sean fáciles, lo cual será utilizado por nuestro widget.
Descargue el contenedor PHP en el archivo comprimido de GitHub, extraiga e incluya el archivo TwitterAPIExchange.php que contiene la clase contenedora.
El siguiente método twitter_timeline () acepta lo siguiente como sus argumentos, lo que resulta útil cuando se realiza una solicitud a la API de Twitter.
-
$ username:nombre de usuario de Twitter
-
$limit:Número de tweets que se mostrarán en el widget
-
$ oauth_access_token:token de acceso OAuth de la aplicación de Twitter.
-
$ oauth_access_token secret:la aplicación OAuth acceso token secreto.
-
$ consumer_key:Aplicación de Twitter Clave del consumidor.
-
$ consumer_secret:Secreto del consumidor de la aplicación.
1 |
public function twitter_timeline( $username, $limit, $oauth_access_token, $oauth_access_token_secret, $consumer_key, $consumer_secret ) { |
2 |
require_once 'TwitterAPIExchange.php'; |
3 |
|
4 |
/** Set access tokens here - see: https://dev.twitter.com/apps/ */
|
5 |
$settings = array( |
6 |
'oauth_access_token' => $oauth_access_token, |
7 |
'oauth_access_token_secret' => $oauth_access_token_secret, |
8 |
'consumer_key' => $consumer_key, |
9 |
'consumer_secret' => $consumer_secret |
10 |
);
|
11 |
|
12 |
$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; |
13 |
$getfield = '?screen_name=' . $username . '&count=' . $limit; |
14 |
$request_method = 'GET'; |
15 |
|
16 |
$twitter_instance = new TwitterAPIExchange( $settings ); |
17 |
|
18 |
$query = $twitter_instance |
19 |
->setGetfield( $getfield ) |
20 |
->buildOauth( $url, $request_method ) |
21 |
->performRequest(); |
22 |
|
23 |
$timeline = json_decode($query); |
24 |
|
25 |
return $timeline; |
26 |
}
|
El método utiliza PHP Wrapper para la API de Twitter para enviar solicitudes a la API de Twitter, guardar y devolver la respuesta (datos JSON de la línea de tiempo del usuario).
La API guardó la hora en que se crearon o crearon los tweets en una fecha y hora textual en inglés. P.ej. Thu Jun 26 08:47:24 +0000 2014
Para hacer que el tiempo de tweet sea más fácil de usar, creé el método tweet_time () que muestra el tiempo de las siguientes maneras.
- Si el tiempo es inferior a tres segundos, regresa ahora mismo.
- Menos de un minuto, vuelve hace x segundos.
- Menos de dos minutos, regresa hace aproximadamente 1 minuto.
- Menos de una hora, vuelve hace n minutos y así sucesivamente.
Aquí está el código para el método tweet_time ().
1 |
public function tweet_time( $time ) { |
2 |
// Get current timestamp.
|
3 |
$now = strtotime( 'now' ); |
4 |
|
5 |
// Get timestamp when tweet created.
|
6 |
$created = strtotime( $time ); |
7 |
|
8 |
// Get difference.
|
9 |
$difference = $now - $created; |
10 |
|
11 |
// Calculate different time values.
|
12 |
$minute = 60; |
13 |
$hour = $minute * 60; |
14 |
$day = $hour * 24; |
15 |
$week = $day * 7; |
16 |
|
17 |
if ( is_numeric( $difference ) && $difference > 0 ) { |
18 |
|
19 |
// If less than 3 seconds.
|
20 |
if ( $difference < 3 ) { |
21 |
return __( 'right now', 'twitter_tweets_widget' ); |
22 |
}
|
23 |
|
24 |
// If less than minute.
|
25 |
if ( $difference < $minute ) { |
26 |
return floor( $difference ) . ' ' . __( 'seconds ago', 'twitter_tweets_widget' );; |
27 |
}
|
28 |
|
29 |
// If less than 2 minutes.
|
30 |
if ( $difference < $minute * 2 ) { |
31 |
return __( 'about 1 minute ago', 'twitter_tweets_widget' ); |
32 |
}
|
33 |
|
34 |
// If less than hour.
|
35 |
if ( $difference < $hour ) { |
36 |
return floor( $difference / $minute ) . ' ' . __( 'minutes ago', 'twitter_tweets_widget' ); |
37 |
}
|
38 |
|
39 |
// If less than 2 hours.
|
40 |
if ( $difference < $hour * 2 ) { |
41 |
return __( 'about 1 hour ago', 'twitter_tweets_widget' ); |
42 |
}
|
43 |
|
44 |
// If less than day.
|
45 |
if ( $difference < $day ) { |
46 |
return floor( $difference / $hour ) . ' ' . __( 'hours ago', 'twitter_tweets_widget' ); |
47 |
}
|
48 |
|
49 |
// If more than day, but less than 2 days.
|
50 |
if ( $difference > $day && $difference < $day * 2 ) { |
51 |
return __( 'yesterday', 'twitter_tweets_widget' );; |
52 |
}
|
53 |
|
54 |
// If less than year.
|
55 |
if ( $difference < $day * 365 ) { |
56 |
return floor( $difference / $day ) . ' ' . __( 'days ago', 'twitter_tweets_widget' ); |
57 |
}
|
58 |
|
59 |
// Else return more than a year.
|
60 |
return __( 'over a year ago', 'twitter_tweets_widget' ); |
61 |
}
|
62 |
}
|
El siguiente es el método widget () que muestra la línea de tiempo de Twitter en el front-end de WordPress.
1 |
public function widget( $args, $instance ) { |
2 |
$title = apply_filters( 'widget_title', $instance['title'] ); |
3 |
$username = $instance['twitter_username']; |
4 |
$limit = $instance['update_count']; |
5 |
$oauth_access_token = $instance['oauth_access_token']; |
6 |
$oauth_access_token_secret = $instance['oauth_access_token_secret']; |
7 |
$consumer_key = $instance['consumer_key']; |
8 |
$consumer_secret = $instance['consumer_secret']; |
9 |
|
10 |
echo $args['before_widget']; |
11 |
|
12 |
if ( ! empty( $title ) ) { |
13 |
echo $args['before_title'] . $title . $args['after_title']; |
14 |
}
|
15 |
|
16 |
// Get the tweets.
|
17 |
$timelines = $this->twitter_timeline( $username, $limit, $oauth_access_token, $oauth_access_token_secret, $consumer_key, $consumer_secret ); |
18 |
|
19 |
if ( $timelines ) { |
20 |
|
21 |
// Add links to URL and username mention in tweets.
|
22 |
$patterns = array( '@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '/@([A-Za-z0-9_]{1,15})/' ); |
23 |
$replace = array( '<a href="$1">$1</a>', '<a href="http://twitter.com/$1">@$1</a>' ); |
24 |
|
25 |
foreach ( $timelines as $timeline ) { |
26 |
$result = preg_replace( $patterns, $replace, $timeline->text ); |
27 |
|
28 |
echo '<div>'; |
29 |
echo $result . '<br/>'; |
30 |
echo $this->tweet_time( $timeline->created_at ); |
31 |
echo '</div>'; |
32 |
echo '<br/>'; |
33 |
}
|
34 |
|
35 |
} else { |
36 |
_e( 'Error fetching feeds. Please verify the Twitter settings in the widget.', 'twitter_tweets_widget' ); |
37 |
}
|
38 |
|
39 |
echo $args['after_widget']; |
40 |
}
|
La clase de widget Twitter_Tweets_Widget finalmente se registra con el gancho widgets_init para que WordPress la reconozca. Cierre su clase con un cierre} y luego agregue el siguiente código para inicializar el
1 |
function register_twitter_widget() { |
2 |
register_widget( 'Twitter_Tweets_Widget' ); |
3 |
}
|
4 |
|
5 |
add_action( 'widgets_init', 'register_twitter_widget' ); |
Finalmente, hemos terminado de codificar el widget de línea de tiempo de Twitter.
Resumen
En este artículo, aprendimos cómo usar la API de Twitter en un proyecto del mundo real para crear nuestro propio widget WordPress de la línea de tiempo de Twitter. Aunque el tutorial debería ser relativamente sencillo, cubrimos temas como OAuth, claves y otros temas que pueden ser nuevos para aquellos de ustedes que trabajan con una API.
Si tiene alguna pregunta o sugerencia para mejorar el código, avíseme en los comentarios.



