Desacortar URL desde la Bash

Trucos y Utilidades 24 de ene. de 2023

Cómo expandir URL acortadas directamente desde tu consola

Muchas veces nos encontramos con URLs 'acortadas' que no sabemos a donde nos llevan y nos da miedo simplemente el pasar el ratón por encima no vayamos a hacer clic por error.

Os traigo una solución casera para que no dependáis de ninguna aplicación de terceros vía web para expandir una URLs externa.

Qué es una URL acortada

Las URLs acortadas no son más que redirecciones del tipo 301: movido permanentemente a....

Simplemente debemos recoger las cabeceras (Headers) de una petición GET de la URL acortada y podremos obtener a donde apunta realmente esa URL.

Expandir una URL mediante el comando curl

La forma más sencilla de expandir una URL es mediante el uso del comando curl.

Supongamos que tenemos una URL acortada (ficticia) como: http://acor.tada

Desde la línea de comando ejecutamos:

curl -s --head http://acor.tada | grep -i 'location'
http://pagina.expandida.com/imagen.jpg
Obteniendo 'location' de una URL con curl

Perfecto, hemos obtenido la URL expandida y de un dominio que podemos confiar o no.

Resolución completa de una URL

Pero que sucede si tras expandir la URL acortada nos encontramos que nos hemos encontrado con otra URL, y que es del mismo servidor que acortó la URL.
¿Cómo podemos averiguar la URL final?

Ejemplo:

curl -s --head http://acor.tada | grep -i 'location'
http://www.acortador.tada/ir?codigo=8723jd73

Pues muy sencillo tan sólo debemos usar curl y preguntarle de nuevo por la URL obtenida anteriormente:

curl -s --head http://acor.tada | grep -i 'location'
http://www.acortador.tada/ir?codigo=8723jd73

curl -s --head http://www.acortador.tada/ir?codigo=8723jd73|grep -i 'location'
http://pagina.expandida.com/imagen.jpg


En la última petición con curl, por fin hemos obtenido la URL real a la que apunta la URL acortada.

Script en bash para desacortar una URL

Podemos preparar un sencillo script en bash (desacorta.sh) que nos resuelva rápidamente una URL, el código sería algo similar a este:

#!/bin/bash
UrlAcortada="$1"
if [ "$UrlAcortada" == "" ] ; then
  echo "Indique la URL que desee desacortar"
else
  Url=$(curl -s --head $UrlAcortada 2>/dev/null|grep -i 'location'|awk '{print $2}')
  UrlFinal=$(curl -s --head $Url 2>/dev/null|grep -i 'location'|awk '{print $2}')
  if [ "$UrlFinal" == "" ] ; then
     # UrlFinal no resolvio nada mostrarmos Url anterior
     echo "$Url"
  else
    # UrlFinal resolvio de nuevo
    echo "$UrlFinal"
  fi
fi

Guardamos el fichero, le damos permisos de ejecución y ya podemos probarlo:

# Damos permisos de ejcucion a desacorta.sh
chmod +x desacorta.sh

# Probando el desacortador
./desacorta.sh  https://acortar.link/zOEtDz
https://soloconlinux.org.es/desacortar-url-desde-la-bash/

Como 'extra' mediante PHP, podemos obtener en un único paso todas las 'location' y mostrarlas, puedes crear un script en PHP, darle permiso de ejecución y usarlo desde la linea de comandos. El contenido del fichero sería:

#!/usr/bin/env php
<?php
// Recibimos por parametro la URL
$url=$argv[1];
  $cabeceras=array(get_headers($url));
  foreach($cabeceras[0] as $valor) {
      if (stripos($valor, "ocation:",1 ) == 1) {
          $UrlExpandida=str_replace('Location: ', '', $valor);
          echo $UrlExpandida . "\n";
      }
  }
?>

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux