Acortar URL + Código QR, en Python
Tags: api, python, tutorial, spanish
Published: 2021-04-20 16:17:39

**Acortar URL permite simplificar y hacer más atractivo estéticamente un link**, como también poder registrar los click que realizan en ellos.
**Los códigos QR ayudan a la comodidad del usuario**, evitando introducir datos de forma manual en los teléfonos.
La suma de ambos dará como resultado **un Código QR lo más reducido en tamaño posible**, resultando más atractivo en lo estético, y pudiendo además(gracias a los servicios acortadores de URL) tener información estadística del uso del mismo.
Todo esto, usando uno de los lenguajes de programación de más auge en estos últimos tiempos.

## Acortar URL
La manera más fácil y rápida es usando la librería [pyshorteners](https://github.com/ellisonleao/pyshorteners), que pone a disposición muchas APIs acortadoras de URL para usar.
Instalamos directamente de PyPi:
```bash
pip install pyshorteners
```
[Aquí](https://pyshorteners.readthedocs.io/en/latest/apis.html) una lista de los servicios disponible para acortar las urls, con sus implementaciones respectivas.
Para nuestro ejemplo usaremos [da.gd](https://da.gd/) como solución:
```python
import pyshorteners

shortener = pyshorteners.Shortener()
short_url = shortener.dagd.short('https://en.wikipedia.org/wiki/Jon_Snow_(character)')
print(short_url) # https://da.gd/5X3NV
```
De esta manera reducimos notablemente la cantidad de carácteres, que nos servirá para el siguiente paso.

## Generar QR
Nos apoyaremos de las librerías [python-qrcode](https://github.com/lincolnloop/python-qrcode) y Pillow(Python Imaging Library) para crear los códigos.
Instalamos directamente de PyPi:
```bash
pip install qrcode pillow
```
Y aplicamos:
```python
import qrcode

qr = qrcode.QRCode(
    box_size=5,
    error_correction = qrcode.constants.ERROR_CORRECT_M,
    )
qr.add_data('https://da.gd/5X3NV')
qr.make(fit=True)

img = qr.make_image()
img.show()
```
El parámetro **box_size** es el tamaño en píxeles de cada cuadrado del QR.
Con error_correction definimos la corrección de errores para el QR. Hay 4 constantes definidas dentro de la librería de códigos QR (a mayor porcentaje de corrección, posiblemente dimensiones más grande del QR):
- **ERROR_CORRECT_L:** corrección de errores del 7% o menos.
- **ERROR_CORRECT_M(por defecto):** corrección de errores del 15% o menos.
- **ERROR_CORRECT_Q:** corrección de errores del 25% o menos.
- **ERROR_CORRECT_H:** corrección de errores del 30% o menos.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nzegj7j1hw0rrhk0eonn.png)

Definiendo a **fit** igual a *True* determina el tamaño del QR automaticamente a partir del valor de entrada en **add_data**.

## Resultado
El producto final(comparándolo con la misma URL sin acortar) es:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pdfgjhpjzigo8xy7o43e.png)

## Conclusión
Para la experiencia de usuario: a más pequeño un código QR, menos complejo al ojo humano, y visualmente más atractivo.
Por tanto hay que tener en cuenta que:
- a mayor cantidad de carácteres, más grande las dimensiones del código QR;
- a más grande las dimensiones del código QR, más le cuesta al smartphone procesar el contenido a escanear.

Podemos también tener estadísticas de interés sobre las reacciones/escanéos del código QR que hicimos, a partir de la función de contabilización de clicks al enlace que ofrece algunos servicios, por ejemplo [bit.ly](https://bit.ly).
```python
import pyshorteners

shortener = pyshorteners.Shortener(api_key='YOUR_KEY')
shortener.bitly.total_clicks('https://bit.ly/TEST')
```
---
{% gist https://gist.github.com/bruino/fca28dea0e539ed437f7cc443ecb2066 %}