¿Cómo enviar tweets con imágenes en PHP?
- Andrés Cruz
Siguiendo con los experimentos con la REST API de Twitter En esta entrada veremos cómo enviar tweets con imágenes desde PHP y también veremos un caso extra que consiste en cargar múltiples imágenes en un mismo tweet múltiples imágenes todo esto empleando la API Twitter de PHP con sus respectivos ejemplos y tutoriales paso a paso.
En posteriores entradas se ha interactuado a la API rest de Twitter para enviar tweets simples (sin imágenes) además de otras operaciones como la consulta a los últimos tweets publicados por la cuenta configurada; si tienes alguna duda en general con respecto a:
¿Cómo conectarnos a twitter y enviar tweets con php?: En esta primera entrada hablamos sobre cómo trabajar con la API de Twitter; explicamos:
- Cómo crear una aplicación en Twitter (paso necesario para poder conectarnos con la API de Twitter).
- Configurar las credenciales (Access tokens y API keys) en la aplicación PHP.
- Publicar tweets.
¿Cómo consultar los últimos tweets publicados con php? en el cual consultamos los últimos tweets que están en nuestro timeline.
Puedes consultar los enlaces anteriores; recordemos que la librería empleada en esta y posteriores entradas es la de twitter-api-php.
Se seguirá empleando el recurso statuses/update
disponible a través de la API pública para el envío de tweets pero estableceremos un parámetro extra como veremos a continuación junto con la librería PHP TwitterAPIExchange:
$url = "https://api.twitter.com/1.1/statuses/update.json";
Puedes encontrar más información sobre la API pública anterior en el siguiente enlace POST statuses/update.
Estudiando un poco la documentación de la API pública anterior, vemos que cuenta con un parámetro media_ids
el cual es un identificador de una recurso (gif, jpg, png o video).
Para obtener este identificador, primero debemos publicar el recurso -imagen en nuestro caso- realizando una petición a la API Rest de Twitter y luego realizamos otra petición pero esta vez con la imagen y el texto (el tweet con imágenes).
Enviando un tweet con imágenes en dos pasos
1 Subir el recurso: media/upload.json
Para enviar tweets con imágenes primero debemos de subir el recurso gráfico (imágenes en nuestro caso) para obtener el media_ids
(uno por imagen/video cargado); si revisamos un poco la documentación junto con sus ejemplo veremos que la API pública a emplear es media/upload
:
Más información en POST media/upload.
El código PHP que realiza esta tarea es el siguiente:
$url = 'https://upload.twitter.com/1.1/media/upload.json'; $method = 'POST'; $twitter = new TwitterAPIExchange($settings); $file = file_get_contents('public/images/example/php/twitter-php.png'); $data = base64_encode($file); $params = array( 'media_data' => $data ); try { $data = $twitter->request($url, $method, $params); } catch (Exception $e) { echo 'Excepción capturada: ', $e->getMessage(), "\n"; // hacer algo return NULL; } // para obtener más facilmente el media_id $obj = json_decode($data, true); // media_id en formato string return $obj ["media_id_string"];
2 Enviar el tweet con el id del recurso: statuses/upload.json
Con el media_id
ahora podemos enviar el tweet con imagen como mostramos en el siguiente código:
$url = "https://api.twitter.com/1.1/statuses/update.json"; $requestMethod = 'POST'; // configuracion de la cuenta $settings = array( 'oauth_access_token' => 'XXX', 'oauth_access_token_secret' => 'XXX', 'consumer_key' => 'XXX', 'consumer_secret' => 'XXX', ); // establecer el mensaje $postfields = array('status' => '¿Cómo enviar tweets con imágenes en PHP?'); // establecer el media_id $postfields['media_ids'] = $this->getMediaId($settings); // crea la coneccion con Twitter $twitter = new TwitterAPIExchange($settings); // envia el tweet $twitter->buildOauth($url, $requestMethod) ->setPostfields($postfields) ->performRequest();
El código completo de nuestro experimento:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); require 'TwitterAPIExchange.php'; class Twitter { function getMediaId($settings) { $url = 'https://upload.twitter.com/1.1/media/upload.json'; $method = 'POST'; $twitter = new TwitterAPIExchange($settings); $file = file_get_contents('http://desarrollolibre.net/public/images/example/php/facebook/facebook-php.png'); $data = base64_encode($file); $params = array( 'media_data' => $data ); try { $data = $twitter->request($url, $method, $params); } catch (Exception $e) { echo 'Excepción capturada: ', $e->getMessage(), "\n"; // hacer algo return NULL; } // para obtener más facilmente el media_id $obj = json_decode($data, true); // media_id en formato string return $obj ["media_id_string"]; } function sendTweets() { $url = "https://api.twitter.com/1.1/statuses/update.json"; $requestMethod = 'POST'; // configuracion de la cuenta // configuracion de la cuenta $settings = array( 'oauth_access_token' => 'XXX', 'oauth_access_token_secret' => 'XXX', 'consumer_key' => 'XXX', 'consumer_secret' => 'XXX', ); // establecer el mensaje $postfields = array('status' => '¿Cómo enviar tweets con imágenes en PHP?'); // establecer el media_id $postfields['media_ids'] = $this->getMediaId($settings); // crea la coneccion con Twitter $twitter = new TwitterAPIExchange($settings); // envia el tweet $twitter->buildOauth($url, $requestMethod) ->setPostfields($postfields) ->performRequest(); } } $t = new Twitter(); $t->sendTweets();
Y si echamos un ojo a la cuenta configurada veremos nuestro increíble tweet con una imagen:
Enviar tweets con múltiples imágenes
Si queremos cargar más de una imagen o video en un tweets simplemente debemos de cargar (en nuestro caso invocar a la función getMediaId
con las imágenes/videos correspondientes a cargar en el tweet y guardar los media_ids generados) y establecerlos en el parámetro media_ids
separarlos por coma de la siguiente manera:
$postfields['media_ids'] = $mediaId.','.$mediaId2;
Y esto sería todo, según establece la documentación oficial de Twitter solo podemos incorporar hasta 4 imágenes o 1 video o gif en un mismo tweet.
Si te interesa automatizar el proceso de publicar tweets automaticamente; puedes consultar la siguiente entrada: Ejecutar script automáticamente con cron en linux.
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter