Mi nombre es Fernando Briano y soy programador.

Actualiza un canal en Telegram automáticamente desde WordPress

Ya que hay un canal de Telegram para las actualizaciones del blog, faltaba automatizar la publicación de nuevos posts en dicho canal. Para usuarios de WordPress en general la primera solución es instalar un plugin. Pero para qué seguir llenando de plugins un WordPress si podemos hacerlo nosotros! Y siempre es divertido meterse con bots…

Telegram tiene una API que nos permite hacer cosas de manera bastante rápida. Hay que seguir varios pasos, pero no hay que dejarse intimidar. Ya creado el canal, necesitamos crear un bot que será el encargado de publicar mensajes automáticamente. Y para crear un bot, existe un bot… En Telegram mismo debemos conversar con BotFather, quien nos provee instrucciones para crear un nuevo bot. Los comandos a ejecutar son: /start, /newbot, nombre para el bot, nombre de usuario para el bot (debe terminar en “bot”) y listo. BotFather nos va a avisar que el bot ha sido creado y nos va a dar un token para acceder a la Bot API.

Una vez creado nuestro bot, debemos agregarlo como administrador al canal para que pueda enviar mensajes. En el canal, vamos a Gestionar Canal > Administradores > Agregar Administrador. Ahí debemos buscar nuestro bot por su nombre anteponiendo @ (por ejemplo @picando_bot) y seleccionarlo para agregarlo como Admin.

Buscando en la API de bots cómo mandar mensajes a un canal, me encontré con sendMessage: Usar este método para mandar mensajes de texto. Como lo único que necesito enviar es una URL, sólo necesito los parámetros chat_id (nombre del canal) y text. La API es bastante sencilla, sólo tenemos que hacer un request que podemos incluso probar en nuestro navegador web:

https://api.telegram.org/botAPI_TOKEN/sendMessage?chat_id=@picandocodigo&text=test

Si todo salió bien, recibiremos una respuesta similar a la siguiente:

sendMessage response

Una buena idea es crear un canal de pruebas para este tipo de experimentos. Así no bombardeamos a los miembros de nuestro canal con mensajes de prueba (¡perdón! ya tengo un canal de pruebas 😬).

Después de tener todo andando, falta agregar esta funcionalidad a nuestro WordPress. En un principio usé la función publish_post que se activa cuando un post se publica o se edita y cambia de estado a publicado. El problema es que se activa cada vez que editamos un post, por más que haya sido publicado antes. Cuando leí las instrucciones esperaba que se ejecutara sólo cuando la edición hace que un post cambiara de un estado como “borrador” o “privado” a público. Pero no… Así que tuve que acudir a transiciones de estados de posts.

Terminé usando la función transition_post_status, una acción genérica que se llama cada vez que un post cambia de estado. En la función que le asigné, me fijo que el estado actual sea ‘publish’ y el anterior no sea ‘publish’, para no volver a notificar cuando edito un post previamente publicado. Agregué el código para hacer funcionar esto en el archivo functions.php de mi tema. Como lo único que quiero mandar al canal es el enlace al post publicado, no uso más información que esa. Telegram se encarga de obtener el título, imagen destacada y un resumen para mostrar.

function post_published_telegram_notification($new_status, $old_status, $post) {
  if ($old_status != 'publish' && $new_status == 'publish'){
    $permalink = get_permalink($post->ID);
    $apiToken = "API_TOKEN_DE_TU_BOT";
 
    $data = [
      'chat_id' => '@picandocodigo_test',
      'text' => $permalink
    ];
 
    $response = file_get_contents("https://api.telegram.org/bot$apiToken/sendMessage?" 
      . http_build_query($data) );
  }
}
 
add_action( 'transition_post_status', 'post_published_telegram_notification', 10, 3 );

Si hicimos todo bien, al publicar un nuevo post, obtendremos un nuevo mensaje en nuestro canal de Telegram:

Bot de Telegram para WordPress

También te puede interesar:

Feed de comentarios | Url para Trackbacks | Suscribirse a los posts por correo electrónico

No hay comentarios en este post

Dejar un comentario

Toasty!