Cómo Crear Contraseñas Seguras con un Generador de Contraseñas en Python

En el mundo digital de hoy, proteger tus cuentas en línea nunca ha sido más crucial. Los ataques cibernéticos están en aumento, y una contraseña débil puede ser el eslabón más débil que ponga en riesgo tu seguridad digital. Aquí es donde un Generador de Contraseñas en Python se convierte en una herramienta indispensable. En este post, exploraremos cómo puedes usar esta herramienta para crear contraseñas robustas y seguras.

Short del Generador Contraseñas

La Necesidad de Contraseñas Fuertes

Las contraseñas son la primera línea de defensa contra accesos no autorizados a tus cuentas personales y laborales. Sin embargo, crear una contraseña fuerte y única para cada cuenta puede ser tedioso. Es aquí donde nuestro proyecto, un generador de contraseñas desarrollado en Python, simplifica el proceso.

Dentro de mis aplicaciones gratuitas tengo otro sistema generador de contraseñas hecho en Javascript si te sientes más familiarizado con está tecnología. También tengo otras aplicaciones en Python que te podrían servir.

Introducción al Generador de Contraseñas en Python

Nuestro generador de contraseñas es un proyecto compuesto por dos archivos principales: app.py y main.py. Esta aplicación ha sido diseñada para ser sencilla de usar pero poderosa en funcionalidad, ofreciendo a los usuarios la capacidad de personalizar sus contraseñas generadas según varios criterios.

Este sistema utiliza el framework de flask para poder utilizar plantillas html y mostrarla vía web, de hecho por este motivo se creó el archivo app.py, ya que ejecutando a main.py desde consola te genera las contraseñas también.

Características Principales

El Generador de Contraseñas en Python ofrece varias opciones para personalizar la contraseña generada:

  • Longitud Personalizable: Puedes elegir cuán larga quieres que sea tu contraseña, lo cual es crucial para determinar su fortaleza.
  • Inclusión de Números: Aumenta la complejidad de tu contraseña con números.
  • Caracteres Especiales: Añade una capa adicional de seguridad con caracteres especiales.
  • Mayúsculas: La inclusión de letras mayúsculas hace que tus contraseñas sean aún más difíciles de descifrar.

Cómo Funciona

Nuestro generador utiliza una combinación de letras minúsculas, números, caracteres especiales y mayúsculas para crear contraseñas. Estos elementos se mezclan de manera aleatoria para generar una contraseña segura que cumple con los criterios especificados por el usuario.

Ejemplo de Uso

Para utilizar el generador, simplemente debes ejecutar el archivo main.py y seguir las instrucciones en la consola. Puedes personalizar la longitud de tu contraseña y decidir si incluir números, caracteres especiales y mayúsculas.

Código de mi archivo main.py

import string
import random

def generate_password(length=8, include_numbers=True, include_special_chars=True, include_uppercase=True):
    """
    Genera una contraseña segura.

    :param length: Longitud de la contraseña. Por defecto es 8.
    :param include_numbers: Incluir números en la contraseña. Por defecto es True.
    :param include_special_chars: Incluir caracteres especiales. Por defecto es True.
    :param include_uppercase: Incluir mayúsculas. Por defecto es True.
    :return: La contraseña generada como una cadena.
    """
    # Definir los bloques de construcción de la contraseña
    letters = string.ascii_lowercase
    numbers = string.digits if include_numbers else ''
    special_chars = string.punctuation if include_special_chars else ''
    uppercase = string.ascii_uppercase if include_uppercase else ''

    # Combinar todos los posibles caracteres
    possible_chars = letters + numbers + special_chars + uppercase

    # Generar la contraseña
    password = ''.join(random.choice(possible_chars) for _ in range(length))

    return password

# Interacción con el usuario
if __name__ == "__main__":
    length = int(input("Longitud de la contraseña (por defecto 8): ") or 8)
    include_numbers = input("Incluir números? (S/n): ").lower() != 'n'
    include_special_chars = input("Incluir caracteres especiales? (S/n): ").lower() != 'n'
    include_uppercase = input("Incluir mayúsculas? (S/n): ").lower() != 'n'

    password = generate_password(length, include_numbers, include_special_chars, include_uppercase)
    print(f"Tu nueva contraseña es: {password}")

Código de mi archivo app.py

from flask import Flask, request, render_template_string

# Asegúrate de que main.py esté en el mismo directorio que este archivo, o ajusta la ruta de importación según sea necesario.
from main import generate_password

app = Flask(__name__)


# Define una página simple para generar contraseñas
@app.route("/", methods=["GET", "POST"])
def home():
    if request.method == "POST":
        # Obtiene los parámetros del formulario web
        length = int(request.form.get("length", 8))
        include_numbers = "include_numbers" in request.form
        include_special_chars = "include_special_chars" in request.form
        include_uppercase = "include_uppercase" in request.form

        # Genera la contraseña
        password = generate_password(
            length, include_numbers, include_special_chars, include_uppercase
        )

        # Pasa la contraseña generada de vuelta al template
        return render_template_string(PAGE_TEMPLATE, password=password)
    else:
        # No se ha enviado el formulario, muestra la página por defecto
        return render_template_string(
            PAGE_TEMPLATE, password="Tu contraseña aparecerá aquí."
        )


# HTML del template en forma de string
# HTML del template en forma de string, ahora con CSS responsivo
# HTML del template en forma de string, utilizando Bootstrap
PAGE_TEMPLATE = """
<!doctype html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Generador de Contraseñas</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
</head>
<body>
    <nav class="container-fluid">
        <ul>
            <li><strong>Generador de Contraseñas</strong></li>
        </ul>
        <ul>
            <li><a href="https://configuroweb.com/" role="button">Para más desarrollos configuroweb</a></li>
        </ul>
    </nav>
    <main class="container">
        <div class="grid">
            <section>
                <hgroup>
                    <h2>Genera una contraseña segura</h2>
                    <h3>Completa los siguientes campos</h3>
                </hgroup>
                <form method="post" class="needs-validation" novalidate>
                    <div class="form-group">
                        <label for="length">Longitud:</label>
                        <input type="number" class="form-control" name="length" value="8" required>
                    </div>
                    <div class="form-group form-check">
                        <input type="checkbox" class="form-check-input" name="include_numbers" id="include_numbers" checked>
                        <label class="form-check-label" for="include_numbers">Incluir números</label>
                    </div>
                    <div class="form-group form-check">
                        <input type="checkbox" class="form-check-input" name="include_special_chars" id="include_special_chars" checked>
                        <label class="form-check-label" for="include_special_chars">Incluir caracteres especiales</label>
                    </div>
                    <div class="form-group form-check">
                        <input type="checkbox" class="form-check-input" name="include_uppercase" id="include_uppercase" checked>
                        <label class="form-check-label" for="include_uppercase">Incluir mayúsculas</label>
                    </div>
                    <button type="submit" class="btn btn-primary btn-block">Generar Contraseña</button>
                </form>
                <p class="mt-4 text-center">{{ password }}</p>
            </section>
        </div>
    </main>
    <footer class="container">
        <small>
            <a href="#">Política de privacidad</a> • <a href="#">Términos de servicio</a>
        </small>
    </footer>
</body>
</html>

"""


if __name__ == "__main__":
    app.run(debug=True)

Repositorio de GitHub del Sistema Generador de Contraseñas en Python

Generador de Contraseñas Python

Conclusión

Asegurar tus cuentas en línea es más importante que nunca, y el Generador de Contraseñas en Python es una herramienta valiosa para lograrlo. Con su ayuda, puedes generar contraseñas fuertes de manera rápida y eficiente, protegiendo tus datos personales contra amenazas cibernéticas.

Implementar prácticas de seguridad sólidas es esencial en nuestra era digital, y herramientas como esta hacen que sea más accesible para todos mantenerse seguros en línea.

Para desarrollos a medida me puedes contactar en el siguiente enlace de contacto

Etiquetado: /

Sistema de Gestión de Tareas Optimizado

Esta aplicación de Sistema de Gestión de Tareas Optimizado, permite controlar el flujo de la asignación, ejecución y calificación de tareas, ya sea para trabajar en proyectos o para cualquier proceso que se requiera.

Sistema de Gestión de Tareas Optimizado

Demo del Sistema de Gestión de Tareas Optimizado

El siguiente es el demo del sistema, las credenciales son configuroweb y la contraseña 1234abcd..

https://demoscweb.com/tareas-optimizado/login.php

Mejoras del Sistema de Gestión de Tareas Optimizado

Se hace referencia a que es un Sistema de Tareas Optimizado, porque previamente he publicado, dos aplicaciones relacionadas con el tema de gestión de proyectos.

La primera aplicación relacionada es el Sistema de Gestión de Tareas de Empleados en PHP y MySQL, esta aplicación es la más similar al actual proyecto, sin embargo no es responsiva cien por ciento y le he mejorado concientemente varios procesos,

Por ejemplo el usuario no debe poner previamente su rol desde el acceso, el sistema sabe el rol del usuario que accede y según esto le muestras las opciones acordes a su perfil entre otros más.

Una mejora adicional especialmente para los desarrolladores de habla hispana es que los nombres de los archivos y de las tablas, así como la gran mayoría de funciones, hasta donde es posible están en español y es más fácil de entender para quienes no están familiarizados con el idioma inglés.

La otra aplicación similar al Sistema de Gestión de Tareas Optimizado es Sistema de Gestión de Proyectos en PHP y MYSQL una aplicación donde se realizan las tareas relacionadas con proyectos, se gestionan, se guardan evidencias, tal como mi aplicación actual, pero igualmente no es responsiva y no fue implementada con la versión 8 de PHP.

Mejora continua del Sistema

Esta aplicación concientemente la voy a estar mejorando cada semana, haciéndole cambios en pro de mejorar su rendimiento, optimizar su flujo, la puedes adquirir por 10 USD y quedas suscrito por un mes para todos los cambios que vaya realizando

Durante un mes y al siguiente mes si ves la necesidad de obtener las nuevas mejoras, con enviarme nuevamente 15 USD, podrás acceder a la aplicación nuevamente con los cambios que se hayan implementado y se implementen durante un mes.

Compra de la Aplicación

Para que la aplicación te funcione tanto en un servidor local como en un hosting, requeriras el archivo SQL que contiene la base de datos, las tablas y la lógica que se requiere para el login y se puedan gestionar los procesos de la aplicación, este sistema tiene un costo de 15 USD y lo puedes comprar por medio del siguiente enlace:

Pago vía Global66

Países válidos Argentina, Chile, Colombia, México y Perú.

Enlace de Pago

Pago vía Mercado Pago

Países válidos Argentina, Brasil, Chile, Colombia, México, Perú y Uruaguay.

link.mercadopago.com.co/configuroweb

Pago por Binance

También me puedes hacer el pago de los 15 USD por medio de Binance con USDT a mi cuenta de Binance:

msevillab@gmail.com

Pago vía Western Union

Favor contactarme vía whatsapp para más información en el siguiente enlace:

Contáctame vía Whatsapp

Otros medios de pago

Si resides en Colombia me puedes hacer el pago por Nequi, por un enlace PSE de Uala o desde fuera por Western Union, cualquier duda me puedes escribir a mi Whatsapp.

Pago por Nequi

Enlace PSE UALA en pesos colombianos

Enlace PSE UALA Colombia

Más de 150 aplicaciones de Libre Distribución

Te recomiendo que pases por mi blog, tengo más de 150 aplicaciones publicadas, tutoriales y publicaciones que te podrían servir en tu camino ninja desarrollador, puedes acceder a mi apartado gratuito o mi apartado de aplicaciones premium donde seguramente alguna de mis aplicaciones te podrá servir.

Contáctame directamente a mi Whatsapp

Me puedes escribir cualquier duda, directamente a mi Whatsapp en el siguiente enlace:

https://configuroweb.com/WhatsappMessenger

Cualquier duda estaré al pendiente.

Etiquetado: / /

Convertidor de Voz a Texto en Javascript

Esta sistema Convertidor de Voz a Texto en Javascript permite capturar y pasar a texto fácilmente, el texto capturado es fácil de copiar a través del botón de Copiar Texto y luego se puede pegar donde lo necesites.

Video Explicativo

¡Transforma Tu Voz en Texto con Facilidad! Descubre el Poder de Javascript

Esta aplicación es sencilla, apenas consta de un documento HTML, otro archivo Javascript donde recae la lógica del sistema y un documento CSS que gestiona la apariencia de la aplicación.

El sistema es una aplicación que no requiere tecnologías del lado del backend y por este motivo el demo se encuentra publicado en GitHub Pages.

Previamente publiqué una aplicación que interactua de Texto a Voz, si te interesa el proceso puedes acceder al siguiente enlace:

Convertidor de texto a voz PHP usando la API de voz de Microsoft

Demo del Sistema Convertidor de Voz a Texto en Javascript

En el siguiente enlace puedes probar el funcionamiento de la aplicación:

https://configuroweb.github.io/voz-texto/index.html

Esta aplicación es plenamente gratuita y la puedes descargar y reutilizar libremente como las aplicaciones de mi apartado Gratis donde tengo más de 80 aplicaciones que te podrían servir.

Explicación del funcionamiento del Convertidor de Voz a Texto

Esta aplicación consta solo de tres archivos, no consume ningún servicio adicional, así que no requiere de ninguna interacción por API Key externas, si se comunica por API pero específicamente con el navegador y solo necesita para su funcionamiento que se le den permisos de grabación de voz la primera vez.

Obtención de Referencias a Elementos del DOM

Al inicio del archivo, se obtienen referencias a varios elementos de la interfaz de usuario mediante sus IDs:

  • botonInicio: Referencia al botón utilizado para iniciar el reconocimiento de voz.
  • salida: Referencia al elemento donde se mostrará el texto resultante del reconocimiento de voz.
  • botonCopiar: Referencia al botón que permite copiar al portapapeles el texto mostrado en el elemento salida.
  • botonLimpiar: Referencia al botón que limpia el texto mostrado en el elemento salida.

Funcionalidad de Copiar al Portapapeles

El botón botonCopiar está configurado para copiar el texto presente en el elemento salida al portapapeles del usuario cuando se hace clic en él. Utiliza la API navigator.clipboard.writeText para realizar la copia. Si la operación es exitosa, muestra una alerta indicando “Texto copiado al portapapeles!”. Si hay un error, se muestra en la consola del navegador.

Funcionalidad de Limpiar Texto

El botón botonLimpiar permite al usuario borrar el contenido del elemento salida al hacer clic en él, simplemente estableciendo su texto interno (innerText) a una cadena vacía.

Funcionalidad de Reconocimiento de Voz

El botón botonInicio inicia el reconocimiento de voz cuando se hace clic en él. El script verifica primero la disponibilidad de la API SpeechRecognition en el navegador del usuario, considerando tanto la versión con prefijo (webkitSpeechRecognition) como la estándar.

Al activar el reconocimiento de voz, se configura para recibir resultados intermedios, lo que significa que el texto se actualiza a medida que el usuario habla, antes de que se complete una frase o comando completo.

Cuando se captura un evento de resultado (result), el script combina los fragmentos de texto reconocidos en una única cadena y actualiza el contenido del elemento salida con este texto. También se muestra en la consola para depuración.

El reconocimiento de voz se inicia llamando a reconocimiento.start(), pero solo si la variable speech es true, lo cual siempre es cierto según el script proporcionado.

Archivo script.js

A continuación se muestra el archivo script.js:

// Obtener referencias a elementos de la UI mediante sus IDs actualizados.
const botonInicio = document.getElementById('botonInicio');
const salida = document.getElementById('salida');
const botonCopiar = document.getElementById('botonCopiar');
const botonLimpiar = document.getElementById('botonLimpiar');

// Funcionalidad del botón de copiar: copia el texto del elemento de salida al portapapeles.
botonCopiar.onclick = function() {
    // Extrae el texto a copiar del elemento 'salida'.
    const textoParaCopiar = salida.innerText;
    
    // Intenta copiar el texto al portapapeles.
    navigator.clipboard.writeText(textoParaCopiar).then(() => {
        // Si la operación es exitosa, muestra una alerta al usuario.
        alert('Texto copiado al portapapeles!');
    }).catch(err => {
        // Si ocurre un error, lo muestra en la consola.
        console.error('Error al copiar: ', err);
    });
};

// Funcionalidad del botón de limpiar: limpia el texto del elemento de salida.
botonLimpiar.onclick = function() {
    // Limpia el contenido del elemento 'salida'.
    salida.innerText = '';
};

// Funcionalidad del botón de inicio: inicia el reconocimiento de voz.
botonInicio.addEventListener('click', function() {
    // Indicador para controlar el inicio del reconocimiento de voz.
    var speech = true;
    // Compatibilidad con prefijo webkit para navegadores que lo requieran.
    window.SpeechRecognition = window.webkitSpeechRecognition || window.SpeechRecognition;

    // Crear una instancia de SpeechRecognition.
    const reconocimiento = new SpeechRecognition();
    // Configurar para obtener resultados intermedios (no finales).
    reconocimiento.interimResults = true;

    // Manejar el evento 'result' para procesar los resultados del reconocimiento.
    reconocimiento.addEventListener('result', e => {
        // Convertir los resultados del evento en un solo string de texto.
        const transcripcion = Array.from(e.results)
            .map(resultado => resultado[0])
            .map(resultado => resultado.transcript)
            .join('');

        // Actualizar el elemento 'salida' con el texto transcrito.
        salida.innerHTML = transcripcion;

        // Opcional: Mostrar el texto transcrito en la consola para depuración.
        console.log(transcripcion);
    });

    // Iniciar el reconocimiento de voz si la variable 'speech' es true.
    if (speech === true) {
        reconocimiento.start();
    }
});

Archivo style.css

A continuación se muestra el archivo style.css con el que se gestiona la apariencia de la aplicación:

/* Importa la fuente Poppins desde Google Fonts para usarla en todo el sitio */
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@500&display=swap');

/* Establece estilos base para todos los elementos */
* {
    margin: 0; /* Elimina los márgenes por defecto */
    padding: 0; /* Elimina el relleno por defecto */
    box-sizing: border-box; /* Cambia el modelo de caja para incluir padding y border en el ancho y alto del elemento */
    font-family: 'Poppins', sans-serif; /* Establece Poppins como la fuente predeterminada */
}

/* Estilos específicos para el <body> */
body {
    background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%); /* Fondo con gradiente lineal */
    background-size: cover; /* Asegura que el fondo cubra todo el espacio disponible */
    background-attachment: fixed; /* El fondo no se mueve al hacer scroll */
    background-repeat: no-repeat; /* Evita que el fondo se repita */
    padding: 20px; /* Añade relleno alrededor de los contenidos del cuerpo */
}

/* Estilos para el contenedor principal */
.container {
    max-width: 800px; /* Ancho máximo del contenedor */
    margin: auto; /* Centra el contenedor horizontalmente */
    background-color: rgba(255, 255, 255, 0.8); /* Color de fondo con opacidad */
    border-radius: 10px; /* Bordes redondeados */
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* Sombra suave alrededor del contenedor */
    padding: 20px; /* Relleno dentro del contenedor */
    text-align: center; /* Alinea el texto al centro */
}

/* Estilos para el botón principal */
.button {
    margin: 20px 0; /* Añade margen arriba y abajo del botón */
}

/* Estilos para el grupo de botones */
.buttons {
    display: flex; /* Utiliza Flexbox para la disposición */
    justify-content: center; /* Centra los botones horizontalmente */
    gap: 10px; /* Añade espacio entre los botones */
    margin-top: 20px; /* Añade margen arriba del grupo de botones */
}

/* Estilos aplicados a todos los <button> */
button {
    border: none; /* Elimina el borde por defecto */
    padding: 10px 20px; /* Añade relleno alrededor del texto dentro del botón */
    border-radius: 5px; /* Bordes redondeados para el botón */
    cursor: pointer; /* Cambia el cursor a una mano al pasar sobre el botón */
    font-weight: bold; /* Texto en negrita */
}

/* Estilos para el botón de copiar */
#botonCopiar {
    background-color: #4CAF50; /* Color de fondo verde */
    color: white; /* Texto en color blanco */
}

/* Estilos para el botón de limpiar */
#botonLimpiar {
    background-color: #f44336; /* Color de fondo rojo */
    color: white; /* Texto en color blanco */
}

/* Estilos para el estado hover de todos los botones */
button:hover {
    opacity: 0.8; /* Reduce la opacidad al pasar el mouse por encima */
}

/* Estilos para el área de salida */
#salida {
    margin-top: 20px; /* Añade margen arriba del área de salida */
    border: 1px solid #ccc; /* Borde sólido ligero */
    padding: 10px; /* Relleno dentro del área de salida */
    min-height: 100px; /* Altura mínima */
    background-color: #f9f9f9; /* Color de fondo claro */
    overflow-wrap: break-word; /* Asegura que el texto largo se rompa y no desborde el contenedor */
}

.footer-container {
    width: 100%; /* Asegura que el footer ocupe todo el ancho */
    max-width: none; /* Anula el máximo de ancho establecido por .container */
    background-color: #2c3e50; /* O cualquier otro color que prefieras */
    color: #fff; /* Texto blanco para contraste */
    box-shadow: none; /* Opcional: elimina la sombra si no la deseas */
    border-radius: 0; /* Opcional: elimina los bordes redondeados */
}

/* Vista para ordenadores */

@media (min-width: 992px) { 
    .footer-container {
        width: calc(100% - 40px); 
        margin: auto;
        max-width: 800px; 
    }
    .container-fluid {
        max-width: 800px; /* Asegura que el ancho máximo sea el mismo que el de .container */
        margin-left: auto;
        margin-right: 0;
        width: auto; 
    }
}

Archivo index.html

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Conversor de Voz a Texto</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
    <link rel="shortcut icon" href="./faviconconfiguroweb.png" type="image/x-icon">
    <link rel="stylesheet" href="./style.css">
</head>
<body>
    <nav class="container-fluid">
        <ul>            
            <li><a href="https://www.youtube.com/channel/UCVnrMbml3wUIuwz-oSaIUnA">Youtube</a></li>
            <li><a href="https://github.com/configuroweb">GitHub</a></li>
            <li><a href="https://configuroweb.com/desarrollo/" role="button">ConfiguroWeb</a></li>
        </ul>
    </nav>
    <main class="container">
        <div class="grid">
            <section>
                <hgroup>
                    <h2>Convierte tu voz en texto fácilmente</h2>
                    <h3>Simple, rápido y efectivo</h3>
                </hgroup>
                <div class="button">
                    <button id="botonInicio"><img src="https://cdn-icons-png.flaticon.com/512/25/25682.png" alt="Iniciar grabación" width="50" height="50"></button>
                    <small>Toca para Grabar</small>
                </div>
                <div id="salida"></div>
                <div class="buttons">
                    <button id="botonCopiar">Copiar Texto</button>
                    <button id="botonLimpiar">Limpiar Texto</button>
                </div>
            </section>
        </div>
    </main>
    <footer class="container footer-container">
        <small>
            Esta aplicación es uno de mis más de 150 códigos que tengo publicados en mi blog <a href="https://configuroweb.com/desarrollo/" target="_blank">configuroweb.com</a>
        </small>
    </footer>
    <script src="./script.js"></script>
</body>
</html>

Repositorio Convertidor de Voz a Texto en Javascript

A continuación te comparto el código plenamente que puedes utilizar libremente desde mi GitHub

Sistema convertidor de Voz a Texto

Como siempre te recomiento te pegues una pasada por el blog, te garantizo que te gustará y cualquier duda quedo al pendiente, me puedes contactar a mi Whatsapp en el siguiente enlace:

https://configuroweb.com/WhatsappMessenger

Para desarrollos a medida me puedes contactar en el siguiente enlace de contacto

Etiquetado: /

Sistema Buscador de Gifs en PHP

Este Sistema Buscador de Gifs en PHP se comunica con el API de Giphy extrae los Gifs según el criterio de búsqueda y los muestra en pantalla, esta es una solución que de Giphy para que directamente puedas mostrar sus imágenes desde tu propio sitio.

Video Explicativo

¡Gifs Ilimitados a Tu Alcance! Crea un Buscador con PHP Hoy Mismo!

Esta aplicación es plenamente gratuita y la puedes descargar y reutilizar libremente como las aplicaciones de mi apartado Gratis donde tengo más de 80 aplicaciones que te podrían servir.

Esta aplicación de Gifs consta principalmente de dos archivos que llevan toda la lógica, el archivo index.php y el archivo script.js. En adición el look and feel de la página se lleva con Pico CSS un framework minimalista CSS más ligero que Bootstrap.

Comunicación con Giphy

Para poder generar los Gifs es necesario comunicarte efectivamente con el API de Giphy, para esto debes acceder al siguiente enlace:

https://developers.giphy.com/docs/api/

Te debes dar de alta en Giphy y en el apartado API Explorer podrás generar tu Token, este Token tendrás que agregarlo en el archivo index.php en la línea 51 donde dice “tu_api_key”

Explicación de Archivos Sistema Buscador de Gifs en PHP

Por la sencillez de la aplicación no abarcaré una explicación tan exhaustiva del funcionamiento del software, sin embargo cada script está documentado completamente para entender el flujo de proceso de la aplicación.

Código del archivo index.php

<!DOCTYPE html>
<html lang="es">
<!-- Establece el idioma del documento, importante para la accesibilidad y el SEO. -->

<head>
    <meta charset="UTF-8">
    <!-- Define la codificación de caracteres para el contenido. -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- Asegura una visualización adecuada y una experiencia de usuario óptima en dispositivos móviles. -->
    <title>GIFs de Giphy</title>
    <!-- Título de la página, se muestra en la pestaña del navegador. -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
    <!-- Incluye Pico CSS, un framework CSS minimalista, para estilos básicos. -->
    <link rel="stylesheet" href="style.css">
    <!-- Enlace a la hoja de estilos personalizada para estilos específicos de la página. -->
    <link rel="shortcut icon" href="./faviconconfiguroweb.png" type="image/x-icon">
    <!-- Favicon personalizado para la pestaña del navegador. -->
</head>

<body>
    <!-- Inicio del cuerpo del documento. -->

    <!-- Script PHP para verificar si se ha realizado una búsqueda. -->
    <?php $searchPerformed = isset($_GET['search']) && !empty($_GET['search']); ?>

    <main class="container">
        <!-- Contenedor principal para el contenido de la página. -->
        <h1>Buscador de GIFs en Giphy</h1>
        <!-- Título principal de la página. -->

        <!-- Formulario de búsqueda para enviar términos de búsqueda mediante GET. -->
        <form action="" method="GET">
            <input type="text" name="search" placeholder="Escribe algo divertido..." required>
            <!-- Campo de texto para la entrada del usuario. -->
            <button type="submit">Buscar</button>
            <!-- Botón para enviar el formulario. -->
        </form>

        <!-- Bloque condicional para mostrar un GIF destacado si no se ha realizado una búsqueda. -->
        <?php if (!$searchPerformed) : ?>
            <div class="gif-destacado">
                <!-- Contenedor para el GIF destacado. -->
                <a href="https://configuroweb.com/"><img src="configuroweb.gif" alt="GIF destacado"></a>
                <!-- Enlace y imagen del GIF destacado. -->
            </div>
        <?php endif; ?>

        <div class="gif-container">
            <?php
            if (isset($_GET['search'])) {
                $apiKey = 'tu_api_key_aquí';
                $search = urlencode($_GET['search']);
                $url = "https://api.giphy.com/v1/gifs/search?api_key=$apiKey&q=$search&limit=40";

                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $output = curl_exec($ch);
                curl_close($ch);

                $data = json_decode($output, true);
                if (!empty($data['data'])) {
                    foreach ($data['data'] as $gif) {
                        $originalUrl = $gif['images']['original']['url'];
                        echo "<div class='gif' onclick='openModal(\"" . $gif['images']['fixed_height']['url'] . "\", \"" . $originalUrl . "\")'><img src='" . $gif['images']['fixed_height']['url'] . "' alt='GIF'></div>";
                    }
                } else {
                    echo "<p>No se encontraron resultados. Intenta con otro término de búsqueda.</p>";
                }
            }
            ?>
        </div>

    </main>

    <!-- Modal para visualizar el GIF en detalle. -->
    <div id="gifModal" class="modal">
        <span id="closeModal" class="close">&times;</span>
        <!-- Botón para cerrar el modal. -->
        <img class="modal-content" id="img01">
        <!-- Contenido de imagen del modal. -->
        <div id="modalInfo">
            <!-- Información adicional y enlace de descarga en el modal. -->
            ...
        </div>
    </div>

    <script src="script.js"></script>
    <!-- Enlace al archivo JavaScript para funcionalidades interactivas. -->
</body>

</html>

Código del archivo script.js

// Obtener elementos
var modal = document.getElementById("gifModal");
var modalImg = document.getElementById("img01");
var downloadLink = document.getElementById("downloadBtn"); // Actualizar según el nuevo botón de descarga
var closeModal = document.getElementById("closeModal");

// Función para abrir el modal con el GIF seleccionado
function openModal(imgSrc, downloadSrc) {
    modal.style.display = "block";
    modalImg.src = imgSrc;
    downloadLink.href = downloadSrc; // Aquí se establece la URL de descarga directa
}

// Cerrar el modal al hacer clic en (x)
closeModal.onclick = function() {
    modal.style.display = "none";
}

// Cerrar el modal al hacer clic fuera de la imagen
window.onclick = function(event) {
    if (event.target === modal) {
        modal.style.display = "none";
    }
}

Flujo del funcionamiento del Sistema Buscador de Gifs

Flujo del Backend (PHP)

  1. Inicio y Verificación de Búsqueda: Al cargar la página (index.php), el script PHP inicial verifica si el usuario ha enviado una consulta de búsqueda a través del método GET. Esto se hace chequeando si el parámetro search existe y no está vacío.
  2. Formulario de Búsqueda: El usuario ingresa un término de búsqueda en el formulario y lo envía. El formulario utiliza el método GET, lo que significa que la búsqueda se agrega a la URL como un parámetro de consulta (?search=termino).
  3. Procesamiento de Búsqueda:
    • Si se ha realizado una búsqueda, el script PHP realiza una llamada a la API de Giphy utilizando curl, enviando el término de búsqueda.
    • La API responde con un conjunto de datos JSON que incluye información sobre los GIFs encontrados.
    • Este JSON se decodifica y se procesa para mostrar cada GIF en la página. Para cada GIF, se genera un elemento HTML que incluye una imagen (thumbnail) y un evento onclick que llama a la función openModal con la URL del GIF y su URL de descarga como argumentos.
  4. Mostrar GIF Destacado: Si no se ha realizado ninguna búsqueda, se muestra un GIF destacado por defecto. Esta es una funcionalidad condicional que solo se activa si el usuario no ha enviado un término de búsqueda.

Flujo del Frontend (HTML y JavaScript)

  1. Estructura HTML: La página contiene un formulario de búsqueda, un contenedor para mostrar los GIFs buscados o un GIF destacado, y un modal que se usa para visualizar un GIF en tamaño completo y ofrecer un enlace de descarga.
  2. Interacción con JavaScript:
    • Cuando un usuario hace clic en uno de los GIFs, la función openModal(imgSrc, downloadSrc) se invoca gracias al evento onclick asociado con cada imagen de GIF. Esta función recibe las URLs de la imagen seleccionada y de descarga, las asigna al modal, y luego muestra el modal.
    • El modal puede ser cerrado haciendo clic en el botón de cierre (closeModal) o haciendo clic fuera del modal (gestionado por el evento window.onclick).
  3. Visualización y Descarga de GIFs:
    • Dentro del modal, el usuario puede ver el GIF en un tamaño mayor y tiene la opción de descargar el GIF directamente haciendo clic en el enlace de descarga, el cual se actualiza dinámicamente con la URL de descarga del GIF seleccionado.

Este flujo de trabajo integra aspectos del desarrollo web tanto del lado del servidor como del cliente, utilizando PHP para el procesamiento del backend y HTML/JavaScript para la interactividad del frontend. La experiencia del usuario es dinámica y responde a las acciones del usuario, desde la búsqueda hasta la visualización y la descarga de GIFs.

Repositorio del Sistema Buscador de Gifs

Sistema Buscador de Gifs en PHP

Como siempre te recomiento te pegues una pasada por el blog, te garantizo que te gustará y cualquier duda quedo al pendiente, me puedes contactar a mi Whatsapp en el siguiente enlace:

https://configuroweb.com/WhatsappMessenger

Para desarrollos a medida me puedes contactar en el siguiente enlace de contacto

Etiquetado: / /

Portal de Imágenes Gratuitas en PHP

Este Portal de Imágenes Gratuitas en PHP se conecta a la API de Pexels y genera automáticamente todas las imágenes que Pexels tiene en su portal, con esto es posible la carga de sus imágenes desde páginas externas, como este software.

Video Explicativo

Portal Imágenes Gratuitas

Esta aplicación es plenamente gratuita y la puedes descargar y reutilizar libremente como las aplicaciones de mi apartado Gratis donde tengo más de 80 aplicaciones que te podrían servir.

Este software de Imágenes Gratuitas en PHP consta principalmente de 3 archivos que son los que hacen posible su funcionamiento, los archivos son stackAPI.class.php, index.php y script.js, en adición tengo un archivo style.css pero sabemos que este último se encarga de la apariencia de la funcionalidad.

Para comunicarte con el API de Pexels debes inicialmente acceder, darte de alta y generar un token en el siguiente enlace:

https://www.pexels.com/es-es/api/

El sistema te mostrará una pantalla como la siguiente:

Explicación de Archivos del Portal de Imágenes Gratuitas en PHP

Explicación del Archivo stackAPI.class.php

El archivo stackAPI.class.php define una clase en PHP llamada stackAPI, la cual está diseñada para interactuar con la API de Pexels, un servicio de imágenes de stock. La clase permite realizar solicitudes a la API para obtener imágenes, ya sea a través de una selección curada o mediante búsqueda con palabras clave. A continuación, se explica el código paso a paso:

Constructor de la Clase

  • __construct(): Este es el método constructor de la clase stackAPI. Se ejecuta automáticamente cada vez que se crea una instancia de la clase. En este método, se asigna una clave de API (apiKey) a la propiedad privada $apiKey de la clase. Esta clave es necesaria para autenticar las solicitudes a la API de Pexels.

Método get_stack

  • public function get_stack($type = "curated", $qry = []): Este es un método público que se puede llamar desde fuera de la clase. Tiene dos parámetros:
    • $type: Especifica el tipo de solicitud que se va a realizar a la API. Por defecto, es "curated", lo que indica que se solicitará una selección curada de imágenes. Otro valor común para este parámetro es "search", utilizado para buscar imágenes basadas en palabras clave.
    • $qry: Un arreglo asociativo que contiene los parámetros de la consulta para la solicitud a la API. Por ejemplo, puede incluir palabras clave para la búsqueda, el número de resultados por página, y el número de la página a solicitar.
  • Construcción de la URL de la Solicitud:
    • La URL base para realizar solicitudes a la API de Pexels se construye utilizando el tipo de solicitud ($type), resultando en https://api.pexels.com/v1/{$type}.
    • Si el arreglo $qry no está vacío, se añaden los parámetros de la consulta a la URL utilizando la función http_build_query, que convierte el arreglo en una cadena de consulta URL codificada.

Inicialización y Configuración de cURL

  • Se inicializa una sesión cURL utilizando curl_init().
  • Se configura la URL de la solicitud con curl_setopt($curl, CURLOPT_URL, "{$url}{$http_build}").
  • Se configura cURL para que retorne el resultado de la solicitud en vez de mostrarlo directamente utilizando curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1).
  • Se añade un encabezado HTTP para la autenticación, proporcionando la clave de API con curl_setopt($curl, CURLOPT_HTTPHEADER, ["Authorization: {$this->apiKey}"]).

Ejecución de la Solicitud y Manejo de la Respuesta

  • Se ejecuta la solicitud con curl_exec($curl), y el resultado se almacena en $result.
  • Se obtiene el código de estado HTTP de la respuesta con curl_getinfo($curl, CURLINFO_HTTP_CODE).
  • Se cierra la sesión cURL con curl_close($curl).

Retorno de la Respuesta

  • Se verifica el código de estado HTTP. Si es 200, significa que la solicitud fue exitosa, y el estado se establece como "success". De lo contrario, se establece como "error".
  • Se devuelve un arreglo asociativo que incluye el estado de la solicitud ("status"), el código de estado HTTP ("status_code"), y el resultado de la solicitud, el cual se decodifica de JSON a un arreglo PHP con json_decode($result, true).

Este diseño permite integrar fácilmente la funcionalidad de la API de Pexels en aplicaciones PHP, facilitando la obtención de imágenes tanto curadas como basadas en búsquedas específicas.

Archivo stackAPI.class.php

El siguiente es el código del archivo stackAPI.class.php

<?php

// Definición de la clase stackAPI para interactuar con la API de Pexels
class stackAPI
{
    // Propiedad privada para almacenar la clave de API de Pexels
    private $apiKey;

    // Constructor de la clase: se ejecuta automáticamente al instanciar la clase
    function __construct()
    {
        // Asignación de la clave de API a la propiedad privada $apiKey
        // La clave de API se necesita para autenticar las solicitudes a la API de Pexels
        $this->apiKey = "vUlc94hTnRbdYlEN5davrQZTHNlPdAX6S1ARyXlUjZKHKCxyIBwPgIFE";
    }

    // Método público para obtener imágenes de Pexels, ya sea a través de una selección curada o mediante búsqueda con palabras clave
    public function get_stack($type = "curated", $qry = [])
    {
        // Construcción de la URL base para la solicitud a la API, utilizando el tipo de solicitud especificado
        $url = "https://api.pexels.com/v1/{$type}";

        // Inicialización de la variable que almacenará los parámetros de la consulta
        $http_build = "";
        // Si el arreglo $qry no está vacío, se convierte en una cadena de consulta URL codificada
        if (!empty($qry))
            $http_build = "?" . http_build_query($qry);

        // Inicialización de una sesión cURL
        $curl = curl_init();
        // Configuración de la URL completa (incluyendo parámetros de consulta) para la solicitud cURL
        curl_setopt($curl, CURLOPT_URL, "{$url}{$http_build}");
        // Configuración de cURL para que retorne el resultado de la solicitud, en lugar de mostrarlo directamente
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // Añadiendo el encabezado HTTP necesario para la autenticación, utilizando la clave de API
        curl_setopt($curl, CURLOPT_HTTPHEADER, [
            "Authorization: {$this->apiKey}"
        ]);

        // Ejecución de la solicitud cURL y almacenamiento del resultado
        $result = curl_exec($curl);
        // Obtención del código de estado HTTP de la respuesta
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        // Cierre de la sesión cURL
        curl_close($curl);

        // Verificación del código de estado HTTP para determinar el estado de la solicitud
        $status = ($httpCode == 200) ? "success" : "error";

        // Retorno de un arreglo asociativo con el estado de la solicitud, el código de estado HTTP y el resultado de la solicitud
        // El resultado se decodifica de JSON a un arreglo PHP
        return [
            "status" => $status,
            "status_code" => $httpCode,
            "result" => json_decode($result, true)
        ];
    }
}

Explicación del Archivo index.php

El archivo index.php es la interfaz principal de tu aplicación web que utiliza la API de Pexels para buscar y mostrar imágenes basadas en palabras clave o mostrar una selección curada de imágenes. Aquí está la explicación detallada de cada sección de tu código:

Inicio del Script PHP

  • Inclusión de la clase stackAPI: Primero, se incluye el archivo stackAPI.class.php que contiene la clase necesaria para interactuar con la API de Pexels.
  • Creación de instancia de stackAPI: Se crea una instancia de la clase stackAPI para poder utilizar sus métodos.
  • Recogida de parámetros GET: Se recogen los parámetros search y page de la URL. Si no se proporcionan, search se establece como una cadena vacía y page como 1.
  • Búsqueda o selección curada: Dependiendo de si el parámetro search está vacío o no, se llama al método get_stack con el tipo search o curated. Esto determina si se realiza una búsqueda basada en palabras clave o si se muestra una selección curada de imágenes. Se pasan parámetros adicionales como el número de resultados por página (per_page) y el número de página (page).

Estructura HTML

  • Doctype y lenguaje: Se especifica el doctype HTML5 y el lenguaje de la página como español (lang="es").
  • Meta tags y título: Se incluyen meta tags para la codificación de caracteres y la compatibilidad con dispositivos móviles, así como el título de la página.
  • Estilos CSS: Se enlaza un archivo CSS de PicoCSS para el diseño y se incluyen estilos adicionales para el layout específico de la página, como la presentación de imágenes y el modal.
  • Navegación: Se incluye una barra de navegación con enlaces a YouTube, GitHub y el sitio web ConfiguroWeb.

Contenido Principal

  • Formulario de búsqueda: Un formulario permite al usuario ingresar palabras clave para la búsqueda de imágenes. Utiliza el método GET para enviar la búsqueda.
  • Visualización de imágenes: Se muestra una cuadrícula de imágenes. Si la respuesta de la API es exitosa y contiene imágenes, se iteran y muestran en la página.
  • Paginación: Se incluyen enlaces para navegar entre las páginas de resultados. Se calcula el total de páginas basado en el número total de resultados y el número de resultados por página.

Modal para Imágenes

  • Estructura del modal: Se crea un modal oculto que se mostrará cuando el usuario haga clic en una imagen. Contiene un botón para cerrar el modal, un espacio para la imagen en tamaño completo, información sobre la imagen y un botón para descargar la imagen.

Script JavaScript

  • Interactividad del modal: Se agrega un script para manejar la apertura del modal al hacer clic en una imagen, establecer la imagen seleccionada en el modal y permitir la descarga de la imagen. También maneja el cierre del modal.

Este script PHP proporciona una interfaz de usuario para buscar y visualizar imágenes de la API de Pexels, con funciones adicionales como paginación y visualización de imágenes en un modal, todo presentado en un diseño responsive y amigable para el usuario.

Archivo index.php

El siguiente es el código del archivo index.php

<?php
// Incluir la clase stackAPI para interactuar con la API de Pexels.
require_once("./stackAPI.class.php");
// Crear una instancia de la clase stackAPI.
$stacks = new stackAPI();
// Obtener el término de búsqueda desde la URL, si existe, o dejarlo en blanco si no.
$search = $_GET['search'] ?? "";
// Obtener el número de página desde la URL, o usar 1 como predeterminado.
$page = $_GET['page'] ?? 1;

// Si se ha proporcionado un término de búsqueda, buscar imágenes relacionadas.
// De lo contrario, obtener una selección curada de imágenes.
if (!empty($search))
    $get_image = $stacks->get_stack('search', ['per_page' => 40, "query" => $search, "page" => $page]);
else
    $get_image = $stacks->get_stack('curated', ['per_page' => 40, "page" => $page]);

// Calcular el número total de páginas basado en el total de resultados y el número de resultados por página.
$pages = ceil(($get_image['result']['total_results'] ?? 1) / 40);
?>
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Portal de Imágenes</title>
    <link rel="shortcut icon" href="./faviconconfiguroweb.png" type="image/x-icon">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
    <style>
        /* Estilos personalizados para la cuadrícula de imágenes y el modal */
        .media-container {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 1rem;
        }

        .media-item img {
            width: 100%;
            height: auto;
            display: block;
        }

        .modal {
            position: fixed;
            z-index: 2;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            overflow: auto;
            background-color: rgba(0, 0, 0, 0.4);
        }

        .modal-content {
            position: relative;
            margin: 10% auto;
            padding: 20px;
            width: 80%;
            max-width: 700px;
            background-color: #fff;
        }

        .close-button {
            position: absolute;
            top: 10px;
            right: 25px;
            color: #000;
            font-size: 35px;
            font-weight: bold;
            cursor: pointer;
        }

        #downloadButton {
            display: block;
            margin: 20px auto;
            padding: 10px 20px;
            cursor: pointer;
        }

        #scriptMessage {
            margin-top: 20px;
            /* Espacio por encima del mensaje */
            padding: 10px;
            background-color: #ffdd57;
            /* Fondo amarillo para llamar la atención */
            color: #000;
            /* Texto oscuro para contraste */
            font-weight: bold;
            /* Hacer el texto más grueso */
            border-radius: 5px;
            /* Bordes redondeados para suavizar */
            text-align: center;
            /* Centrar el texto */
        }

        #scriptMessage a {
            color: #000;
            /* Color del enlace */
            text-decoration: underline;
            /* Subrayar para destacar que es un enlace */
        }
    </style>
</head>

<body>
    <!-- Navegación del sitio. -->
    <nav class="container-fluid">
        <ul>
            <li><strong>Portal de Imágenes de Pexels</strong></li>
        </ul>
        <ul>
            <li><a href="https://www.youtube.com/channel/UCVnrMbml3wUIuwz-oSaIUnA">Youtube</a></li>
            <li><a href="https://github.com/configuroweb">GitHub</a></li>
            <li><a href="https://configuroweb.com/" role="button">ConfiguroWeb</a></li>
        </ul>
    </nav>
    <main class="container">
        <div class="grid">
            <section>
                <hgroup>
                    <h2>Portal de Imágenes ConfiguroWeb</h2>
                    <h3>Colección de Imágenes Gratuitas</h3>
                </hgroup>
                <p>Las mejores fotos de stock gratis, imágenes libres de regalías y vídeos compartidos por creadores.</p>
                <div id="searchbox-container" class="py-4">
                    <form action="./" method="get">
                        <input type="search" name="search" id="search" placeholder="Introduce lo que estés buscando aquí" class="form-control" value="<?= htmlspecialchars($search) ?>">
                        <button type="submit">Buscar</button>
                    </form>
                </div>
                <div class="media-container">
                    <?php if ($get_image['status'] == 'success' && isset($get_image['result']['photos']) && !empty($get_image['result']['photos'])) : ?>
                        <?php foreach ($get_image['result']['photos'] as $photo) : ?>
                            <div class="media-item">
                                <img src="<?= $photo['src']['medium'] ?>" alt="<?= $photo['alt'] ?>" style="cursor: pointer;">
                            </div>
                        <?php endforeach; ?>
                    <?php endif; ?>
                </div>
                <div class="pagination">
                    <?php if ($page != 1) : ?>
                        <a href="./?<?= http_build_query(['search' => $search, 'page' => $page - 1]) ?>">Anterior</a>
                    <?php endif; ?>
                    <span><?= "{$page}/{$pages}" ?></span>
                    <?php if ($page < $pages) : ?>
                        <a href="./?<?= http_build_query(['search' => $search, 'page' => $page + 1]) ?>">Siguiente</a>
                    <?php endif; ?>
                </div>
            </section>
        </div>
    </main>
    <div id="imageModal" class="modal" style="display:none;">
        <div class="modal-content">
            <span class="close-button">&times;</span>
            <img id="modalImage" src="" alt="Imagen en Tamaño Completo">
            <p id="imageInfo"><span id="imageAuthor"></span></p>
            <!-- Nuevo mensaje aquí -->
            <div id="scriptMessage">
                Este script es uno de los más de 150 códigos que tengo en mi página web <a href="https://configuroweb.com" target="_blank">configuroweb.com</a>
            </div>
            <button id="downloadButton">Descargar Imagen</button>
        </div>
    </div>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script>
        document.addEventListener('DOMContentLoaded', function() {
            document.querySelectorAll('.media-item img').forEach(item => {
                item.addEventListener('click', function() {
                    const modal = document.getElementById('imageModal');
                    const modalImg = document.getElementById('modalImage');
                    const downloadBtn = document.getElementById('downloadButton');
                    modal.style.display = "block";
                    modalImg.src = this.src; // Establece la imagen seleccionada en el modal
                    downloadBtn.onclick = function() { // Función de descarga
                        const a = document.createElement('a');
                        a.href = modalImg.src;
                        a.download = 'Descarga.jpg'; // Nombre del archivo de descarga
                        document.body.appendChild(a);
                        a.click();
                        document.body.removeChild(a);
                    };
                });
            });

            // Cerrar el modal
            document.querySelector('.close-button').addEventListener('click', function() {
                document.getElementById('imageModal').style.display = "none";
            });
        });
    </script>
</body>

</html>

Explicación del Archivo script.js

El código script.js proporciona funcionalidades interactivas para una página web que muestra imágenes. Se divide en varias partes, cada una con su propósito específico para mejorar la experiencia del usuario. Vamos a desglosarlo:

Función download_img

  • Esta función asincrónica se encarga de descargar imágenes.
  • Acepta dos parámetros: $url (la URL de la imagen a descargar) y $fname (el nombre de archivo deseado para la descarga, que es opcional).
  • Utiliza fetch para obtener la imagen desde la URL proporcionada, luego convierte la respuesta en un blob.
  • Crea un enlace temporal (<a> tag) con un href que apunta a una URL creada a partir del blob, y simula un clic en este enlace para iniciar la descarga.

Bloque $(document).ready

  • Este bloque se ejecuta una vez que el DOM está completamente cargado.
  • Establece un controlador de eventos para cuando se hace clic en elementos con la clase .media-item.
    • Al hacer clic, se muestra un modal con la imagen seleccionada en tamaño grande, el nombre del fotógrafo y enlaces de descarga para diferentes tamaños de la imagen.
    • Los enlaces de descarga invocan la función download_img al ser clickeados, evitando el comportamiento predeterminado y descargando la imagen en el tamaño seleccionado.

Evento ‘keypress’ en el campo de búsqueda

  • Se añade un controlador para el evento keypress en el elemento de búsqueda.
  • Si se presiona la tecla Enter mientras se está en el campo de búsqueda, se actualiza la URL de la página con el valor de búsqueda introducido, permitiendo así filtrar las imágenes mostradas según el término de búsqueda.

Evento ‘DOMContentLoaded’

  • Este bloque agrega controladores de eventos a todas las imágenes dentro de elementos con la clase .media-item una vez que el contenido del DOM ha sido cargado.
  • Al hacer clic en una de estas imágenes, se muestra un modal con la imagen en tamaño completo, y se proporciona un botón que permite descargar la imagen haciendo uso de la función download_img.
  • También se incluye un controlador para el botón de cerrar el modal, que oculta el modal cuando se hace clic en él.

Resumen

Este script mejora la interactividad de la página web al permitir a los usuarios ver detalles de las imágenes, descargarlas en diferentes tamaños y buscar imágenes específicas. Utiliza técnicas de JavaScript modernas como funciones asincrónicas, manipulación del DOM, y controladores de eventos para crear una experiencia de usuario rica y dinámica.

Archivo script.js

El siguiente es el código del archivo script.js

// Función asincrónica para descargar imágenes.
async function download_img($url, $fname=""){
    // Obtener la imagen desde la URL proporcionada.
    const _image = await fetch($url);
    // Convertir la imagen a un blob.
    const blob = await _image.blob();
    // Crear una URL a partir del blob.
    const url = window.URL.createObjectURL(blob);
    // Crear un elemento <a> para descargar la imagen.
    const link = document.createElement("a");
    link.href = url;
    link.download = $fname; // Establecer el nombre de archivo para la descarga.
    link.click(); // Simular un clic para iniciar la descarga.
}

// Esperar a que el documento esté listo.
$(document).ready(function(){
    // Establecer un controlador de clic para los elementos con clase .media-item.
    $('.media-item').click(function(e){
        e.preventDefault(); // Prevenir el comportamiento predeterminado.

        // Referencia al modal de vista previa y extracción de datos necesarios del elemento clickeado.
        var prevModal = $('#media-preview');
        var key = $(this)[0].dataset.key;
        var fname = $(this)[0].dataset.filename;

        // Mostrar la imagen seleccionada en el modal.
        prevModal.find('#preview-media').html(`
            <img src="${__stacked[key]['src']['large']}" />
        `);

        // Mostrar el nombre del fotógrafo en el modal.
        prevModal.find('#phtotographer').text(`${__stacked[key]['photographer']}`);

        // Preparar contenedor para enlaces de descarga.
        var dlContainer = $('#downloads');
        dlContainer.html(''); // Limpiar contenedor previo.
        var sizes = {
            original: "Original",
            large2x: "2x Larger",
            large: "Large",
            medium: "Medium",
            small: "Small",
            portrait: "Portrait",
            landscape: "Landscape",
            tiny: "Tiny"
        };

        // Generar enlaces de descarga para cada tamaño disponible.
        Object.keys(__stacked[key]['src']).forEach(k=>{
            var _url = __stacked[key]['src'][k];
            var dlItem = $(`<a class="btn btn-sm btn-primary d-block rounded-pill mb-2 download-item" href="${_url}"><strong>${sizes[k]}</strong></a>`);
            dlContainer.append(dlItem);
            // Establecer evento de clic para descargar la imagen seleccionada.
            dlItem.click(function(e){
                e.preventDefault(); // Prevenir el comportamiento predeterminado del enlace.
                download_img(_url, fname); // Llamar a la función de descarga.
            });
        });

        // Mostrar el modal de vista previa.
        prevModal.modal('show');
    });

    // Controlador de eventos para la entrada de búsqueda.
    $('#search').on('keypress', function(e){
        if(e.which == 13 || e.keyCode == 13 || e.key == "Enter" ){
            var uri = new URL(location.href);
            var searchParams = uri.searchParams;
            // Eliminar el parámetro de búsqueda existente si lo hay.
            if(searchParams.has('search'))
                searchParams.delete('search');
            // Añadir el valor de búsqueda actual a los parámetros de la URL.
            searchParams.set('search', $(this).val());
            // Redirigir a la URL actualizada.
            location.href = uri.toString();
        }
    });
});

// Controlador de eventos para mostrar el modal al hacer clic en las imágenes.
document.addEventListener('DOMContentLoaded', function() {
    document.querySelectorAll('.media-item img').forEach(item => {
        item.addEventListener('click', function() {
            const modal = document.getElementById('imageModal');
            const modalImg = document.getElementById('modalImage');
            const downloadBtn = document.getElementById('downloadButton');
            modal.style.display = "block";
            modalImg.src = this.src; // Establecer la imagen en el modal.
            // Establecer el evento de clic para el botón de descarga.
            downloadBtn.onclick = function() {
                const a = document.createElement('a');
                a.href = modalImg.src;
                a.download = 'Descarga.jpg'; // Nombre del archivo de descarga.
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
            };
        });
    });

    // Cerrar el modal al hacer clic en el botón de cierre.
    document.querySelector('.close-button').addEventListener('click', function() {
        document.getElementById('imageModal').style.display = "none";
    });
});

Flujo del funcionamiento del Portal de Imágenes Gratuitas en PHP

El flujo del funcionamiento del Portal de Imágenes Gratuitas en PHP, que utiliza la API de Pexels para buscar y mostrar imágenes basadas en palabras clave o mostrar una selección curada de imágenes, se puede describir en los siguientes pasos:

1. Inicialización

  • La aplicación se carga en el navegador del usuario.
  • Se incluye el archivo stackAPI.class.php que contiene la lógica para comunicarse con la API de Pexels.
  • Se crea una instancia de la clase stackAPI.

2. Recepción de Entrada del Usuario

  • El usuario puede introducir una palabra clave en el campo de búsqueda y enviarla (o simplemente navegar por la página para ver una selección curada de imágenes si no se introduce ninguna búsqueda).
  • Se recogen los parámetros search (búsqueda) y page (página) de la URL, usando valores predeterminados si no se proporcionan.

3. Búsqueda o Selección Curada

  • Basado en la presencia de una palabra clave de búsqueda, la aplicación decide si realizar una búsqueda de imágenes relacionadas con esa palabra clave o mostrar una selección curada de imágenes.
  • Se llama al método get_stack de la instancia de stackAPI, pasando el tipo de solicitud (search para búsqueda o curated para selección curada) y los parámetros necesarios como el número de resultados por página y el número de página actual.

4. Presentación de Resultados

  • La API de Pexels devuelve un conjunto de imágenes basado en la solicitud.
  • El HTML generado dinámicamente muestra estas imágenes en la página, utilizando un diseño de cuadrícula o similar.
  • La paginación se maneja mediante enlaces o botones que permiten al usuario navegar por diferentes páginas de resultados.

5. Interacción con las Imágenes

  • Cuando un usuario hace clic en una imagen, se puede mostrar un modal o una vista más detallada de esa imagen, posiblemente con opciones para descargar la imagen en diferentes tamaños.
  • Este comportamiento se gestiona mediante JavaScript, que escucha los eventos de clic en las imágenes y muestra el modal correspondiente.

6. Descarga de Imágenes

  • Dentro del modal o la vista detallada, los usuarios pueden elegir descargar la imagen. Al seleccionar un tamaño y hacer clic en el enlace de descarga, se invoca una función de JavaScript que maneja la descarga de la imagen directamente al dispositivo del usuario.

7. Búsqueda Directa

  • El usuario puede realizar búsquedas directas mediante el campo de búsqueda. Al presionar Enter o hacer clic en un botón de búsqueda, la página se actualiza para mostrar las imágenes que coinciden con los términos de búsqueda introducidos.

8. CSS para Estilo Visual

  • Mientras todo esto sucede, el archivo style.css asegura que la página y sus elementos se muestren con el estilo deseado, creando una experiencia visual coherente y atractiva para el usuario.

9. Flujo Continuo

  • Los usuarios pueden continuar navegando por diferentes páginas de resultados, realizar nuevas búsquedas, ver detalles de imágenes específicas y descargar imágenes según sea necesario.

Este flujo describe una aplicación web interactiva que no solo permite a los usuarios buscar y visualizar imágenes de alta calidad de manera eficiente sino también interactuar con estas imágenes de maneras útiles, como ver detalles adicionales y descargar imágenes directamente.

Repositorio del Portal de Imágenes Gratuitas

En el siguiente enlace puedes descargar el código y reutilizar la aplicación:

Portal de Imágenes Gratuitas

Como siempre te recomiento te pegues una pasada por el blog, te garantizo que te gustará y cualquier duda quedo al pendiente, me puedes contactar a mi Whatsapp en el siguiente enlace:

https://configuroweb.com/WhatsappMessenger

Etiquetado: /

Creando un Generador de Imágenes con IA Utilizando HTML, CSS y JavaScript

En este blog post, exploraremos cómo crear un Generador de Imágenes con IA usando HTML, CSS, y JavaScript. Este proyecto es una excelente manera de entender cómo integrar APIs de IA en aplicaciones web para generar imágenes a partir de descripciones de texto.

Video Explicativo del Sistema

Generador de Imágenes con IA

Estructura HTML (index.html)

El archivo index.html establece la estructura básica de nuestra aplicación web. Usamos elementos estándar de HTML5 para crear una interfaz de usuario que incluye un formulario para ingresar el texto descriptivo y seleccionar la cantidad de imágenes a generar.

  • Sección Generador de Imágenes: Un formulario (<form>) captura la entrada del usuario, incluyendo la descripción de la imagen deseada y la cantidad de imágenes a generar. Este formulario utiliza Bootstrap para un diseño responsivo y estéticamente agradable.
  • Sección Galería de Imágenes: Muestra las imágenes generadas como resultado. Inicialmente, se pueden mostrar imágenes de ejemplo para ilustrar cómo se verán las imágenes generadas.
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Generador de Imágenes IA con HTML, CSS y JavaScript</title>
  <link rel="stylesheet" href="style.css">
  <!-- Bootstrap CSS -->
  <link href="https://stackpath.bootstrapcdn.com/bootstrap/5.1.0/css/bootstrap.min.css" rel="stylesheet">
  <link rel="shortcut icon" href="./images/faviconconfiguroweb.png" type="image/x-icon">
  <script src="script.js" defer></script>
</head>
<body>
  <section class="image-generator py-5">
    <div class="container">
      <div class="row justify-content-center">
        <div class="col-12 col-md-8 text-center">
          <div class="content">
            <h1>Herramienta Generadora de Imágenes IA con JavaScript</h1>
            <p>Convierte tu texto en una imagen en segundos utilizando esta herramienta de generación de imágenes con IA y JavaScript.</p>
            <form action="#" class="generate-form d-flex flex-column flex-md-row justify-content-center align-items-center">
              <input class="prompt-input form-control" type="text" placeholder="Describe lo que quieres ver" required>
              <div class="controls d-flex align-items-center">
                <select class="img-quantity form-select mx-2">
                  <option value="1" selected>1 Imagen</option>
                  <option value="2">2 Imágenes</option>
                  <option value="3">3 Imágenes</option>
                </select>
                <button type="submit" class="generate-btn btn btn-primary">Generar</button>
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
  </section>
  <section class="image-gallery py-5">
    <div class="container">
      <div class="row g-3">
        <!-- Asegúrate de tener solo tres .img-card para la demostración -->
        <div class="col-12 col-md-4">
          <div class="img-card"><img src="images/img-1.jpg" alt="imagen" class="img-fluid"></div>
        </div>
        <div class="col-12 col-md-4">
          <div class="img-card"><img src="images/img-2.jpg" alt="imagen" class="img-fluid"></div>
        </div>
        <div class="col-12 col-md-4">
          <div class="img-card"><img src="images/img-3.jpg" alt="imagen" class="img-fluid"></div>
        </div>
      </div>
    </div>
  </section>  
</body>
</html>

Estilos CSS (style.css)

Los estilos CSS aseguran que nuestra aplicación no solo sea funcional sino también visualmente atractiva. Utilizamos el framework Bootstrap para aprovechar sus componentes responsivos y añadimos nuestros propios estilos personalizados para mejorar la apariencia de nuestra herramienta:

  • Estilos Generales: Configuramos estilos globales para el cuerpo del documento y elementos comunes como el formulario y las tarjetas de imagen.
  • Responsividad: Mediante media queries, aseguramos que nuestra herramienta sea accesible y se vea bien en dispositivos de diferentes tamaños.
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap");

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: "Poppins", sans-serif;
}

body {
  background-color: #f8f9fa;
}

.image-generator {
  background: linear-gradient(135deg, #9d50bb, #6e48aa);
  color: #fff;
}

.content {
  padding: 2rem;
  background-color: #fc7d1c;
}

.content h1, .content p {
  margin-bottom: 1rem;
}

.generate-form, .image-gallery {
  padding: 1rem;
}

.generate-form .generate-btn {
  background-color: #007bff;
  border: none;
  margin-top: 0.5rem;
}

.generate-form .prompt-input, .generate-form .img-quantity {
  border: 1px solid #ced4da;
  margin: 0.5rem 0;
}

.generate-form .controls {
  flex-wrap: wrap;
}

.img-card {
  position: relative; /* Establece referencia para la posición absoluta del icono de descarga */
  border: 1px solid #dee2e6;
  border-radius: 0.25rem;
  overflow: hidden;
}

.img-card img {
  width: 100%;
  height: auto;
}

.img-card .download-btn {
  position: absolute; /* Posicionamiento absoluto respecto al .img-card */
  bottom: 10px; /* Ubicación desde el fondo del contenedor .img-card */
  left: 10px; /* Ubicación desde la izquierda del contenedor .img-card */
  width: 32px; /* Tamaño del icono */
  height: 32px; /* Tamaño del icono */
  display: flex; /* Centrar el ícono de la flecha dentro del botón */
  align-items: center; /* Alineación vertical */
  justify-content: center; /* Alineación horizontal */
  background-color: rgba(0, 0, 0, 0.5); /* Fondo semitransparente para visibilidad */
  border-radius: 50%; /* Hace el botón circular */
  cursor: pointer; /* Cambia el cursor para indicar que es clickeable */
}

.img-card .download-btn img {
  display: block; /* Asegura que la imagen del icono se muestre correctamente */
  width: 50%; /* Tamaño del icono respecto al botón */
  height: auto; /* Mantiene la proporción del icono */
}

@media (max-width: 768px) {
  .image-gallery .row {
    display: block;
  }

  .img-card {
    margin-bottom: 1rem;
    width: calc(100% - 20px);
    margin-left: auto;
    margin-right: auto;
  }
}

@media (min-width: 992px) {
  .image-gallery .row {
    display: flex;
    justify-content: space-between;
  }

  .img-card {
    flex-basis: calc(33.333% - 10px);
    margin: 5px;
  }
}

.generate-form .prompt-input, .generate-form .img-quantity {
  border: 1px solid #ced4da;
  margin: 0.5rem 0;
  padding: 0.75rem 1.25rem; /* Aumenta el padding para más visibilidad */
  font-size: 1.1rem; /* Aumenta el tamaño de la fuente para mayor vistosidad */
  width: auto; /* Asegura que el ancho sea el adecuado */
  max-width: 100%; /* Asegura que no sobrepase el ancho de su contenedor */
}

/* Ajustes específicos para el prompt-input para hacerlo más ancho y destacado */
.generate-form .prompt-input {
  flex-grow: 1; /* Permite que el input crezca para ocupar espacio disponible */
  min-width: 0; /* Para flexbox en IE11 */
}

@media (max-width: 768px) {
  /* Resto de los media queries... */

  .generate-form {
    flex-direction: column;
  }

  .generate-form .prompt-input {
    width: 90%; /* Hace el input más ancho en móviles */
    margin-bottom: 1rem; /* Añade espacio debajo del input en móviles */
  }
}

@media (min-width: 992px) {
  /* Resto de los media queries... */

  .generate-form {
    flex-direction: row;
  }

  .generate-form .prompt-input {
    margin-right: 1rem; /* Añade un pequeño margen a la derecha del input */
  }
}

Lógica JavaScript (script.js)

El archivo script.js contiene la lógica de nuestra aplicación. Se encarga de interactuar con la API de OpenAI para generar imágenes basadas en el texto proporcionado por el usuario. Aquí es donde la magia ocurre:

  • Generación de Imágenes: Al enviar el formulario, se recoge la descripción del usuario y se realiza una petición POST a la API de OpenAI, enviando el texto y la cantidad de imágenes solicitadas.
  • Actualización de la Galería de Imágenes: Una vez que recibimos las imágenes de la API, actualizamos la galería para mostrar las nuevas imágenes generadas.
const generateForm = document.querySelector(".generate-form");
const generateBtn = generateForm.querySelector(".generate-btn");
const imageGallery = document.querySelector(".image-gallery");

const OPENAI_API_KEY = "tu api"; // tu token acá
let isImageGenerating = false;

const updateImageCard = (imgDataArray) => {
  if (!Array.isArray(imgDataArray)) {
    console.error("imgDataArray is not an array:", imgDataArray);
    return;
  }

  imgDataArray.forEach((imgObject, index) => {
    const imgCard = imageGallery.querySelectorAll(".img-card")[index];
    if (!imgCard) {
      console.error("No se encontró ninguna tarjeta imgCard para el índice: ", index);
      return;
    }
    const imgElement = imgCard.querySelector("img");

    if (!imgElement) {
      console.error("No se encontró ningún elemento img en imgCard: ", imgCard);
      return;
    }

    // Utilizar la URL de la imagen directamente
    imgElement.src = imgObject.url;

    // Intentar encontrar el botón de descarga dentro de la tarjeta de imagen
    const downloadBtn = imgCard.querySelector("a.download-btn");
    if (downloadBtn) {
      imgElement.onload = () => {
        imgCard.classList.remove("loading");
        downloadBtn.setAttribute("href", imgObject.url);
        downloadBtn.setAttribute("download", `AI_Image_${new Date().getTime()}.png`); // Asumiendo que las imágenes son PNG
      }
    } else {
      imgElement.onload = () => {
        imgCard.classList.remove("loading");
      }
    }
  });
}

const generateAiImages = async (userPrompt, userImgQuantity) => {
  try {
    const response = await fetch("https://api.openai.com/v1/images/generations", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": `Bearer ${OPENAI_API_KEY}`,
      },
      body: JSON.stringify({
        prompt: userPrompt,
        n: userImgQuantity,
      }),
    });

    if (!response.ok) throw new Error("Failed to generate AI images. Make sure your API key is valid.");

    const { data } = await response.json();

    // Asegurándose de que pasamos el arreglo correcto a updateImageCard
    if (data && Array.isArray(data)) {
      updateImageCard(data); // data es el arreglo que contiene las URLs de las imágenes
    } else {
      console.error("Unexpected response structure:", data);
    }
  } catch (error) {
    alert(error.message);
  } finally {
    generateBtn.removeAttribute("disabled");
    generateBtn.innerText = "Generate";
    isImageGenerating = false;
  }
}

const handleImageGeneration = (e) => {
  e.preventDefault();
  if(isImageGenerating) return;

  // Get user input and image quantity values
  const userPrompt = e.srcElement[0].value;
  const userImgQuantity = parseInt(e.srcElement[1].value);
  
  // Disable the generate button, update its text, and set the flag
  generateBtn.setAttribute("disabled", true);
  generateBtn.innerText = "Generating";
  isImageGenerating = true;
  
  // Creating HTML markup for image cards with loading state
  const imgCardMarkup = Array.from({ length: userImgQuantity }, () => 
      `<div class="img-card loading">
        <img src="images/loader.svg" alt="AI generated image">
        <a class="download-btn" href="#">
          <img src="images/download.svg" alt="download icon">
        </a>
      </div>`
  ).join("");

  imageGallery.innerHTML = imgCardMarkup;
  generateAiImages(userPrompt, userImgQuantity);
}

generateForm.addEventListener("submit", handleImageGeneration);

Integración de la API de OpenAI

Para comunicarnos con la API de OpenAI, necesitamos:

  1. Clave API de OpenAI: Esencial para autenticar nuestras solicitudes. Se debe almacenar y utilizar de manera segura para evitar el abuso.
  2. Fetch API: Usamos JavaScript para realizar solicitudes HTTP a la API de OpenAI, manejar las respuestas y actualizar la interfaz de usuario acorde a los datos recibidos.

Repositorio del Generador de Imágenes con IA en Javascript

En el siguiente enlace puedes acceder al código, solo requieres generar el Token correspondiente y ya viene listo para que lo uses:

Generador de Imágenes con IA en Javascript

Conclusión

Crear una herramienta generadora de imágenes con IA es un proyecto fascinante que demuestra el poder de combinar tecnologías web con inteligencia artificial. Este tutorial proporciona una base sobre la cual puedes construir, personalizar y ampliar. Ya sea que estés interesado en aprender sobre integración de APIs, desarrollo web, o IA, este proyecto ofrece una oportunidad práctica para explorar estas áreas.

Recuerda, el código proporcionado es un punto de partida. Animo a experimentar con diferentes estilos, configuraciones de la API, y funcionalidades para crear una herramienta única que refleje tu creatividad y habilidades técnicas. ¡Feliz codificación!

Te recomiendo que pases por mi blog, tengo más de 150 aplicaciones que te podrían interesar. Cualquier duda también me puedes contactar a mi Whatsapp en el siguiente enlace:

https://configuroweb.com/WhatsappMessenger

Etiquetado: /

Tienda Whatsapp con Inteligencia Artificial

Este sistema de Tienda Whatsapp con Inteligencia Artificial es una versión aumentada de una aplicación previa llamada Tienda Whatsapp Responsiva esta aplicación previa es bastante ligera tiene una versión con ambiente administrativo y una versión estática con gestión desde archivo json.

Este software tiene en adición una integración con ChatGPT que tiene la facultad de escrapear el json administrativo y hacer referencia a las características de los productos, de su precio y su nombre, también tiene un apartado donde agregar contexto, en este apartado se definen los límites de ChatGPT, por ejemplo en mi aplicación de referencia tengo lo siguiente:

Es una tienda de tenis deportivos de marca nike, solo interactua con dudas de la marca nike, si te piden algo diferente porfa diles que la consulta excede tu alcance y que se límite a consultar funciones de la tienda

De esta manera si se hace referencia a otras marca o temas diferente a los productos de la tienda, el sistema le indicará en sus propias palabras, que no tiene la facultad de contestar de diferente naturaleza a su objetivo principal.

Video Explicativo

Tienda con Inteligencia Artificial

Demo del Sistema de Tienda Whatsapp con Inteligencia Artificial

En el siguiente enlace puedes acceder al ambiente administrativo de la aplicación:

El usuario es configuroweb, la contraseña 1234abcd..

https://demoscweb.com/tienda-chatbot/admin/login.php

El siguiente es el enlace de la tienda donde iría el usuario final:

https://demoscweb.com/tienda-chatbot/

Consideraciones importantes sobre la Tienda Whatsapp con Inteligencia Artificial

La primera gran consideración a tener en cuenta es que la aplicación no es gratuita, tengo 3 aplicaciones gratuitas que manejan la integración con ChatGPT con las que además comparto plenamente el código y son las siguientes:

Costo del Sistema Whatsapp con ChatGPT

Tengo dos versiones previas sin inteligencia artificial que valen 10 y 20 Dólares respectivamente, más información sobre estas versiones previas en el siguiente enlace:

Tienda Whatsapp Responsiva

Costo del Sistema de Tienda Whatsapp con Inteligencia Artificial

La aplicación tiene un costo de 100USD. El pago de la aplicación lo puedes hacer por medio de los canales a continuación:

Pago vía Global66

Países válidos Argentina, Chile, Colombia, México y Perú.

Enlace de Pago

Pago vía Mercado Pago

Países válidos Argentina, Brasil, Chile, Colombia, México, Perú y Uruaguay.

link.mercadopago.com.co/configuroweb

Pago por Binance

También me puedes hacer el pago de los 100 USD por medio de Binance con USDT a mi cuenta de Binance:

msevillab@gmail.com

Pago vía Western Union

Favor contactarme vía whatsapp para más información en el siguiente enlace:

Contáctame vía Whatsapp

Otros medios de pago

Si resides en Colombia me puedes hacer el pago por Nequi, por un enlace PSE de Uala o desde fuera por Western Union, cualquier duda me puedes escribir a mi Whatsapp.

Pago por Nequi

Enlace PSE UALA en pesos colombianos

Enlace PSE UALA Colombia

Información de Contacto

En cuanto me hagas el pago, me escribes directamente a mi Whatsapp en el siguiente enlace:

https://configuroweb.com/WhatsappMessenger

Igual desde este post hay un botón flotante de Whatsapp desde donde me puedes contactar directamente.

Mas de 150 Aplicaciones en mi Blog

Además de esta aplicación cuento con más de 150 aplicaciones en este post, entre aplicaciones de pago y aplicaciones Gratuitas, cuento con más de 80 aplicaciones gratuitas que puede explorar en el siguiente enlace:

https://configuroweb.com/tag/gratis/

Cualquier duda quedo al pendiente.

Etiquetado: /

Tienda Whatsapp Responsiva

Esta Tienda Whatsapp Responsiva hecha en PHP, Javascript, HTML, CSS y Bootstrap le permite al usuario fácilmente gestionar sus productos y orientar a sus clientes al Whatsapp de la Empresa.

Video Explicativo

Funcionamiento de la Tienda Whatsapp

La aplicación es gestionada en sus personalizaciones de un archivo json, que se puede parametrizar plenamente.

Este sistema tiene dos versiones disponibles, una sin panel administrativo donde el desarrollador debe hacer los cambios en el JSON, tal como se explica en el video relacionado y otra versión donde hay un panel administrativo que permite gestionar los productos, cambiar el teléfono de Whatsapp y el nombre de la aplicación de forma dinámica.

Este Software está diseñado con la premisa de Mobile First, fue pensado para ser gestionado sencillamente a través del teléfono y es bastante ligero, está última característica permite que su carga sea rapídisima y que la visita de los usuario sea lo más liviana posible.

Demo de la Tienda Whatsapp Responsiva

En el siguiente enlace puedes acceder a la versión para clientes de la tienda:
https://demoscweb.com/tienda-responsiva/index.html

En el siguiente enlace puedes acceder al ambiente administrativo de la tienda:

https://demoscweb.com/tienda-responsiva/admin/login.php

Las credenciales de acceso como es habitual son usuario configuroweb contraseña 1234abcd..

Pago de la aplicación Tienda Whatsapp

Actualmente tengo 2 versionnes disponibles de la aplicación una sin ambiente administrativo que se gestiona desde el archivo JSON y otra con ambiente administrativo, tal como se explica en el video relacionado.

La versión estática de la aplicación la que no tiene ambiente administrativo, vale 10 USD y la puedes pagar desde el siguiente enlace:

Pago Versión Aplicación Sin Ambiente Administrativo Valor 10 USD

Enlace de Pago

Pago Versión con Sistema Administrativo Valor 20 USD

La aplicación con ambiente administrativo la puedes pagar desde el siguiente botón:

Enlace de Pago

Versión mejorada de la Tienda Whatsapp con Inteligencia Artificial

En el siguiente enlace puedes ver la Tienda Whatsapp con Inteligencia Artificial:

Video Explicativo Sistema de Tienda con Inteligencia Artificial

El video explicativo del Sistema de Tienda con Inteligencia Artificial es el siguiente:

Tienda Whatsapp con Inteligencia Artificial

Cualquier duda que llegues a tener estoy plenamente disponible a través de Whatsapp en el siguiente enlace:

https://configuroweb.com/WhatsappMessenger

Etiquetado: / /

Mapa Interactivo en Javascript

Este Mapa Interactivo en Javascript, permite registrar sencillamente cualquier ubicación y tener listados tus marcadores registrador por latitud y longitud.

Esta aplicación utiliza un api de libre uso de la página openstreetmap.org, si deseas más información sobre la definición de un api, puedes verificar en el siguiente enlace AWS Amazon:

Qué es un API

Te recomiendo que realices un recorrido por este blog, podrías utilizar esta aplicación y conectarla con cualquier otra de mis aplicaciones más básicas que tengo en mi apartado gratuito ya mis aplicaciones de pago generalmente tienen sistema de login integrado, y las versiones pro aun más avanzadas.

Este software es uno de los más de 80 aplicaciones gratuitas que tengo en este blog a plena disposición y puedes verlas en el siguiente enlace:

Mis Aplicaciones Gratuitas

En adición cuento con más de 60 aplicaciones que se podrían ajustar más a tus necesidades y las puedes navegar por medio del siguiente enlace:

Mis Aplicaciones de Pago

Te puedo alojar la aplicación

Este software de Mapa Interactivo en Javascript lo puedes ver alojado en el siguiente enlace

https://configuroweb.github.io/mapa/

Si deseas aprender como subir una página estática a GitHub Pages o más información al respecto puedes verificar en el siguiente enlace:

https://pages.github.com/

Si requieres igualmente que te aloje esta o cualquier otra aplicación que corra con PHP y MySQL, también te la puedo alojar en Hostinger, tu contratas el dominio con Hostinger también y yo te lo alojo con mi Hosting y te ayudo a administrar la aplicación por 10 USD mensuales.

Si te llega a interesar que te aloje la aplicación puedes consultar en el siguiente enlace de referido y contratar solo el servicio de Dominio y yo te lo puedo alojar y administrar fácilmente desde este punto.

mi enlace de hostinger

Contáctame a mí Whatsapp

Cualquier duda que llegues a tener me puedes escribir directamente a mi Whatsapp al siguiente enlace:

Mi enlace directo de Whatsapp

Puesta a punto del Mapa Interactivo en Javascript en un servidor local

Aplicaciones Previas

Como está aplicación es una página estática, puedes solo descargarla de GitHub y correr el archivo index.html, aunque también desde Visual Studio Code puedes cargar una extensión llamada Live Server que te puede generar una versión local de la aplicación sin ningún problema.

Visual Studio Code es el editor de código más popular del mundo y te recomiendo bastante que lo uses si aún no lo haces, puedes descargarlo en el siguiente enlace:

https://code.visualstudio.com/download

Descarga Aplicación de GitHub

El siguiente es el enlace de descarga de repositorio de GitHub de la aplicación de la aplicación de Mapa Interactivo en Javascript:

Mapa básico Interactivo hecho en Javascript

Subida del Mapa Interactivo en Javascript a un hosting

Por la sencillez de la aplicación, no abordaré el tema directamente, en el siguiente vídeo relacionado, explico a nivel general el proceso:

Subir pagina con PHP + Base de datos (MYSQL) a un Hosting

Si aun tienes dudas con el proceso de la puesta a punto de la aplicación en un servidor local aun puedes ver en la siguiente publicación con más detalle la implementación de aplicaciones PHP:

Como instalar aplicaciones PHP en un servidor local

Cualquier duda quedo al pendiente, si requieres más aplicaciones PHP, en Python o JavaScript te recomiendo te suscribas a mi contenido en Youtube y estés al pendiente de cualquier cambio, que vaya haciendo.

Etiquetado: /

Sistema de Login PHP con Roles de Usuario

Este Sistema de Login PHP con Roles de Usuario, redirecciona según el perfil de usuario a una pantalla u otra y al usuario de perfil administrador le permite abrir el la pantalla de usuario básico, pero el usuario básico logueado no puede acceder a la pantalla de administrador.

Video Explicativo

Login PHP Roles de Usuario

Esta aplicación se puede conectar con cualquier otra de mis aplicaciones más básicas que tengo en mi apartado gratuito ya mis aplicaciones de pago generalmente tienen sistema de login integrado, y las versiones pro aun más avanzadas.

Este software es uno de los más de 80 aplicaciones gratuitas que tengo en este blog a plena disposición y puedes verlas en el siguiente enlace:

Mis Aplicaciones Gratuitas

En adición cuento con más de 60 aplicaciones que se podrían ajustar más a tus necesidades y las puedes navegar por medio del siguiente enlace:

Mis Aplicaciones de Pago

Te puedo alojar la aplicación

Esta aplicación y cualquier otra que corra con PHP y MySQL, también te la puedo alojar en Hostinger, tu contratas el dominio con Hostinger también y yo te lo alojo con mi Hosting y te ayudo a administrar la aplicación por 10 USD mensuales.

Si te llega a interesar que te aloje la aplicación puedes consultar en el siguiente enlace de referido y contratar solo el servicio de Dominio y yo te lo puedo alojar y administrar fácilmente desde este punto.

mi enlace de hostinger

Contáctame a mí Whatsapp

Cualquier duda que llegues a tener me puedes escribir directamente a mi Whatsapp al siguiente enlace:

Mi enlace directo de Whatsapp

Puesta a punto del Sistema de Login PHP con Roles de Usuario en un servidor local

Aplicaciones Previas

Para realizar la instalación de la aplicación en un servidor local, te recomiendo la instalación previa de las siguiente aplicaciones:

XAMPPGitVisual Studio Code

XAMPP es la aplicación encargada de implementar un servidor apache para que funcionen los scripts PHP en un ordenador a nivel local.

Git es el gestor de repositorios más usado del mundo, con el que puedes descargar limpiamente, código de GitHub.

Visual Studio Code, es el editor de código más popular del mundo, que recomiendo ampliamente en prácticamente todas las publicaciones de este blog.

Descarga Aplicación de GitHub

El siguiente es el enlace de descarga de repositorio de GitHub de la aplicación del Sistema de Login PHP con Roles de Usuario:

Login PHP con Roles de Usuario

Configuración del Sistema de Login PHP con Roles de Usuario para su funcionamiento en tu ordenador

Debes instalar las aplicaciones mencionadas, con todos los parámetros por defecto, posterior a este procedimiento, desde Visual Studio Code, debes abrir la siguiente ubicación:

C:\xampp\htdocs

Desde esta ubicación en Visual Studio Code, pulsas View, Terminal. Dentro del Terminal eliges la opción de Git Bash y copias el siguiente código:

git init https://github.com/configuroweb/roles-login.git

Se creará la carpeta roles-login, dentro de la carpeta htdocs. A continuación deber abrir XAMPP en tu ordenador, activar los servicios de Apache y MySQL, y acceder a la siguiente URL, para crear la base de datos roles-login:

http://localhost/phpmyadmin/index.php

Base de Datos del Sistema de Login PHP con Roles de Usuario

Para que la aplicación te funcione correctamente, desde phpmyadmin, debes crear la base de datos con el nombre roles-login, posteriormente debes acceder al apartado SQL y pegar el código que se encuentra en el siguiente enlace:

Base de Datos del Login PHP con Roles de Usuario

Subida del Sistema de Login PHP con Roles de Usuario a un hosting

Por la sencillez de la aplicación, no abordaré el tema directamente, en el siguiente vídeo relacionado, explico a nivel general el proceso:

Subir pagina con PHP + Base de datos (MYSQL) a un Hosting

Si aun tienes dudas con el proceso de la puesta a punto de la aplicación en un servidor local aun puedes ver en la siguiente publicación con más detalle la implementación de aplicaciones PHP:

Como instalar aplicaciones PHP en un servidor local

Cualquier duda quedo al pendiente, si requieres más aplicaciones PHP, en Python o JavaScript te recomiendo te suscribas a mi contenido en Youtube y estés al pendiente de cualquier cambio, que vaya haciendo.

Etiquetado: / /
configuroweb.com
×
Hola de Nuevo
Abrir chat
¿Qué te interesa?
Selecciona los temas de interés sobre
los que deseas recibir noticias: