Add link shortener
This commit is contained in:
parent
485d16e930
commit
c1c5883a56
107
catch-all/04_acortador_url/acortar.py
Normal file
107
catch-all/04_acortador_url/acortar.py
Normal file
@ -0,0 +1,107 @@
|
||||
"""
|
||||
Acortador de enlaces
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import regex
|
||||
import secrets
|
||||
import string
|
||||
import signal
|
||||
import sys
|
||||
|
||||
from termcolor import colored
|
||||
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
|
||||
print(colored('\n[!] Saliendo...', 'red'))
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
signal.signal(signal.SIGINT, signal_handler)
|
||||
|
||||
|
||||
def generar_codigo():
|
||||
|
||||
# Definir caracteres para cadena aleatoria
|
||||
alfanumerica = string.ascii_letters + string.digits
|
||||
|
||||
# Generar cadena aleatoria
|
||||
codigo = ''.join(secrets.choice(alfanumerica) for i in range(8))
|
||||
|
||||
return codigo
|
||||
|
||||
|
||||
def acortar_url(url):
|
||||
|
||||
codigo = generar_codigo()
|
||||
data = []
|
||||
|
||||
with open('codigos.json', 'r') as f:
|
||||
|
||||
data = json.load(f)
|
||||
|
||||
codigo_existe = any(item['codigo'] == codigo for item in data)
|
||||
|
||||
if codigo_existe:
|
||||
codigo = generar_codigo()
|
||||
|
||||
with open('codigos.json', 'w') as f:
|
||||
|
||||
data.append(
|
||||
{
|
||||
'codigo': codigo,
|
||||
'url': f"http://localhost:5000/{codigo}",
|
||||
'redireccion': url,
|
||||
}
|
||||
)
|
||||
|
||||
json.dump(data, f, indent=4)
|
||||
|
||||
|
||||
def comprobar_url(url):
|
||||
|
||||
# Comprobar si la URL tiene http o https
|
||||
if not url.startswith('http://') and not url.startswith('https://'):
|
||||
url = f'https://{url}'
|
||||
|
||||
if url.endswith('/'):
|
||||
url = url[:-1]
|
||||
|
||||
# Comprobar formato de URL con los patrones
|
||||
if regex.match(r'^https?://[\w.-]+\.[\w.-]+(/[\w.-]+)*$', url):
|
||||
|
||||
return url
|
||||
|
||||
else:
|
||||
|
||||
raise ValueError(colored('URL no válida', 'red'))
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
try:
|
||||
parser = argparse.ArgumentParser(description='Acortador de URL')
|
||||
parser.add_argument('-u', '--url', help='URL a acortar')
|
||||
args = parser.parse_args()
|
||||
url = args.url
|
||||
|
||||
if not url:
|
||||
|
||||
url = input(colored('Introduce la URL a acortar: ', 'cyan'))
|
||||
|
||||
url = comprobar_url(url)
|
||||
|
||||
acortar_url(url)
|
||||
|
||||
except argparse.ArgumentError as e:
|
||||
print(colored(f'[!] Error en los argumentos: {e}', 'red'))
|
||||
|
||||
except Exception as e:
|
||||
print(colored(f'[!] Error en la ejecución principal: {e}', 'red'))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
main()
|
32
catch-all/04_acortador_url/app.py
Normal file
32
catch-all/04_acortador_url/app.py
Normal file
@ -0,0 +1,32 @@
|
||||
"""
|
||||
Redirecciona a una URL a partir de un código
|
||||
"""
|
||||
|
||||
import os
|
||||
from flask import Flask, redirect
|
||||
import json
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/<string:codigo>')
|
||||
def redireccion(codigo: str):
|
||||
|
||||
data = []
|
||||
|
||||
with open('codigos.json', 'r') as f:
|
||||
|
||||
data = json.load(f)
|
||||
|
||||
r = list(filter(lambda x: x['codigo'] == codigo, data))
|
||||
|
||||
if r:
|
||||
return redirect(r[0]['redireccion'], code=302)
|
||||
|
||||
return {
|
||||
'message': 'Código no encontrado'
|
||||
}
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
app.run(host="0.0.0.0", port=5000, debug=True)
|
22
catch-all/04_acortador_url/codigos.json
Normal file
22
catch-all/04_acortador_url/codigos.json
Normal file
@ -0,0 +1,22 @@
|
||||
[
|
||||
{
|
||||
"codigo": "",
|
||||
"url": "",
|
||||
"redireccion": ""
|
||||
},
|
||||
{
|
||||
"codigo": "NA1w9oky",
|
||||
"url": "http://localhost:5000/NA1w9oky",
|
||||
"redireccion": "https://vergaracarmona.es"
|
||||
},
|
||||
{
|
||||
"codigo": "XuI6ysnl",
|
||||
"url": "http://localhost:5000/XuI6ysnl",
|
||||
"redireccion": "https://www.linkedin.com/in/manu-vergara"
|
||||
},
|
||||
{
|
||||
"codigo": "uMsW2vzQ",
|
||||
"url": "http://localhost:5000/uMsW2vzQ",
|
||||
"redireccion": "https://gitea.vergaracarmona.es/manudocker"
|
||||
}
|
||||
]
|
Loading…
Reference in New Issue
Block a user