no olvidar instalar la libreria de Vision
npm install --save @google-cloud/vision
Bienvenida e Introducción
Qué aprenderás sobre las firebase cloud functions
Qué es firebase y las cloud functions
Consola web de administración
Consola de administración y documentación
Creación del proyecto de Cloud Functions
Extendiendo la Gestión de Usuarios con Cloud Functions.
Creación de las cloud functions de autenticación
Probando y desplegando las Cloud Functions de autenticación
Extendiendo Firestore con Cloud Functions.
Creación de las cloud functions de Firestore
Probando y desplegando las cloud functions de Firestore
Extendiendo el Almacenamiento con Cloud Functions.
Creación de las cloud functions para el storage
Terminando de crear cloud functions para el storage y probando su funcionamiento
Probando y desplegando las cloud functions de almacenamiento con Firestore
Creando Cloud Functions HTTPS
Creación de la cloud function HTTPS
Bonus: Construyendo un controlador para la función HTTP
Probando y desplegando las cloud function HTTPS
Extendiendo el Hosting con Cloud Functions.
Usando las firebase cloud functions desde el hosting
Extendiendo crashlytics con Cloud Functions.
Creación de las cloud functions de Crashlytics
Probando y desplegando la cloud function de Crashlytics
Extendiendo Analytics con Cloud Functions.
Creación de las cloud functions cuando se registra un evento en las analíticas de Firebase
Probando y desplegando la cloud function de analíticas
Creación de pruebas unitarias a las Cloud Functions.
Creando pruebas unitarias en Firebase Cloud Functions
Optimizando las Cloud Functions.
Buenas practicas para las cloud functions
Cierre
Conclusiones finales y cierre
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Google Vision API es una poderosa herramienta que nos permite validar el contenido de las imágenes sin necesidad de modificar el frontend de nuestras aplicaciones. Esto es posible gracias a la creación de clientes a través de sus bibliotecas y la ejecución de funciones específicas para detectar y clasificar contenidos potencialmente inapropiados en imágenes. Analicemos cómo lograr esta integración paso a paso.
Para utilizar Google Vision API, empezamos creando un cliente de "ImageAnnotatorClient". Esta instancia es fundamental, ya que nos permite enviar imágenes a Google y recibir etiquetas sobre su contenido, evaluandoasí si la imagen contiene material violento, adulto o médico.
const vision = require('@google-cloud/vision');
const client = new vision.ImageAnnotatorClient();
Para procesar una imagen con Vision API, primero necesitamos descargarla desde un bucket de almacenamiento en la nube. Utilizamos el método file
para indicar la imagen a descargar y download
para especificar su destino en nuestro entorno temporal de Cloud Fusion.
const bucket = storage.bucket('nombre-del-bucket');
await bucket.file('ruta/al/archivo.jpg').download({destination: '/tmp/ruta-de-archivo'});
Una vez descargada, la imagen se pasa a la función safeSearchDetection
del cliente de Vision para analizar su contenido. Esta función aplica algoritmos de machine learning para asegurarse de que la imagen es segura.
const [result] = await client.safeSearchDetection('/tmp/ruta-de-archivo');
const detections = result.safeSearchAnnotation;
Los resultados devueltos por Vision API indican la probabilidad de que la imagen contenga contenido específico. Clasificamos estos resultados en variables como adulto
, violencia
, y médico
.
const adulto = detections.adult;
const violencia = detections.violence;
const médico = detections.medical;
El siguiente paso es comparar estos valores con etiquetas predefinidas para determinar si la imagen es adecuada. Si la imagen es apropiada, se actualiza el estado en la base de datos para que la imagen se publique. Si no, se notifica al usuario que la imagen no es adecuada.
if (esAdecuada(adulto) && esAdecuada(violencia) && esAdecuada(médico)) {
await actualizarEstadoDelPost(idPost, true);
} else {
await enviarNotificacion(idPost);
}
Usamos una función para buscar por ID el post en la base de datos y cambiar su estado de publicación.
async function actualizarEstadoDelPost(idPost, estado) {
// Lógica para actualizar el estado del post en Firestore
}
Cuando la imagen no es apropiada, se debe notificar al usuario. Se utiliza el token del post para enviar un mensaje a través de Firebase.
async function enviarNotificacion(idPost) {
// Lógica para enviar la notificación al usuario
}
La gran ventaja de usar Google Vision API directamente desde el backend es que potencialmente podemos integrar funcionalidades avanzadas de detección de contenido sin tocar si quiera el código del frontend. Esta separación de responsabilidades permite a equipos de desarrollo trabajar de manera más eficiente, aumentando el valor ofrecido a los usuarios sin la necesidad de cambios significativos en la interfaz de usuario.
Este enfoque no solo mejora la rapidez del desarrollo, sino que también favorece la escalabilidad y seguridad al gestionar contenido potencialmente inapropiado de forma centralizada antes de que llegue a ser publicado. Esto demuestra una de las más grandes eficiencias que proporciona Google Cloud en el manejo de contenido multimedia.
Aportes 4
Preguntas 1
no olvidar instalar la libreria de Vision
npm install --save @google-cloud/vision
safeSerachDetection -> Google aplica machine learning para que este en formato seguro
Interesante!
Codigo de Post.js
const admin = require('firebase-admin')
const functions = require('firebase-functions')
const path = require('path')
const os = require('os')
const fs = require('fs')
const vision = require('@google-cloud/vision')
const { Email } = require('./../utilidad/EmailHelper.js')
const plantillas = require('./../utilidad/PlantillasEmail.js')
const { Notificaciones } = require('./../notificaciones/Notificaciones.js')
class Posts {
registrarAuditoria (idPost, nuevoPost, viejoPost) {
// Reto
}
validarImagenPost (archivo) {
const rutaArchivo = archivo.name
const nombreArchivo = path.basename(rutaArchivo)
const idPost = path.basename(rutaArchivo).split('.')[0]
const bucket = admin.storage().bucket()
const tmpRutaArchivo = path.join(os.tmpdir(), nombreArchivo)
const cliente = new vision.ImageAnnotatorClient()
return bucket
.file(rutaArchivo)
.download({
destination : tmpRutaArchivo
})
.then(() => {
return cliente.safeSearchDetection(tmpRutaArchivo)
})
.then(resultado => {
const adulto = resultado[0].safeSearchAnnotation.adult
const violence = resultado[0].safeSearchAnnotation.violence
const medical = resultado[0].safeSearchAnnotation.medical
return (
this.esAdecuada(adulto) &&
this.esAdecuada(medical) &&
this.esAdecuada(violence)
)
})
.then(resp => {
if(resp){
this.actualizarEstadoPost(idPost, true)
return resp
}
return this.enviarNotRespImagenInapropiada(idPost)
})
}
esAdecuada (resultado) {
return (
resultado !== 'POSSIBLE' &&
resultado !== 'LIKELY' &&
resultado !== 'VERY_LIKELY'
)
}
actualizarEstadoPost (idPost, estado) {
const refAuditoria = admin
.firestore()
.collection('posts')
.doc(idPost)
return refAuditoria.update({
publicado: estado
})
}
enviarNotRespImagenInapropiada (idPost) {
console.log(`Consultar Token idPost => ${idPost}`)
return admin
.firestore()
.collection('posts')
.doc(idPost)
.get()
.then(post => {
console.log(post)
if (post.data().token !== null && post.data().token !== undefined) {
console.log(`idPost token => ${post.data().token}`)
const notificaciones = new Notificaciones()
notificaciones.enviarNotificacionAToken(
'Posts con imagen no permitida',
'Tu post no se puede mostrar ya que la imagen no es permitida',
'notvalidacionimagen',
post.data().token
)
}
return post
})
}
enviarPostSemana (topicoNotificacion) {}
}
exports.Posts = Posts```
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?