¿Cómo enviar tweets con imágenes en PHP?

- Andrés Cruz

¿Cómo enviar tweets con imágenes en PHP?

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:

twitter PhP con imaGenes

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.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.