no olvidar instalar la libreria de Vision
npm install --save @google-cloud/vision
La moderación automática de imágenes es clave para la confianza. Aquí verás cómo usar la API de Cloud Vision de Google para validar contenido con safe search, descargar archivos desde un bucket, y automatizar el estado del post y las notificaciones, todo desde Cloud Fusion y sin tocar el front end.
¿Cómo configurar el cliente de Vision y preparar el bucket?
Primero se definen variables y constantes para la librería de Vision y el bucket. Luego se crea el cliente de Vision instanciando la clase ImageAnnotatorClient. Con esto podrás invocar el análisis de imágenes.
Ejemplo de configuración e instalación en código:
// Cliente de Vision const vision = require('@google-cloud/vision'); const client = new vision.ImageAnnotatorClient(); // Descarga desde el bucket a una ruta temporal await bucket.file(rutaArchivo).download({ destination: tmpRutaArchivo });
¿Cómo aplicar safe search y obtener las anotaciones clave?
Con el archivo ya en la ruta temporal, se llama a la función de Vision para la detección de contenido seguro. Con una sola línea, Google aplica machine learning para evaluar si la imagen es apropiada.
client.safeSearchDetection(tmpRutaArchivo).Código de análisis y extracción de atributos:
const [result] = await client.safeSearchDetection(tmpRutaArchivo); const safe = result.safeSearchAnnotation; // safeSearchAnnotation const adulto = safe.adult; // adult const violento = safe.violence; // violence const medico = safe.medical; // medical
¿Qué atributos devuelve safe search?
Se evalúan contra etiquetas de probabilidad como likely o very. Una función interna, por ejemplo esAdecuada, compara si el resultado es diferente a esos valores para considerar la imagen apropiada.
const esApta = ( esAdecuada(adulto) && esAdecuada(violento) && esAdecuada(medico) );
¿Qué acciones automatizamos en base de datos y notificaciones?
Si la imagen es adecuada, se actualiza el estado del post para que pueda publicarse. Si no lo es, se envía una notificación al usuario que subió la imagen, usando el token que está guardado en el post.
Flujo de decisión y acciones:
if (esApta) { await actualizarEstadoPost(idPost, true); // publicar return; } await enviarNotificacionRespuesta(idPost); // inapropiada
¿Qué hacen las funciones auxiliares en la base de datos?
Así, con promesas bien manejadas y acceso controlado al bucket, se orquesta una moderación robusta: descargar, analizar, evaluar y actuar. Si deseas profundizar en consultas y envío de notificaciones, puedes revisarlo en el curso de Firebase para la web.
¿Tienes casos de uso que quieras automatizar con Cloud Vision o reglas distintas para contenido adulto, violento o médico? Cuéntalo y lo exploramos juntos.
La moderación automática de imágenes es clave para la confianza. Aquí verás cómo usar la API de Cloud Vision de Google para validar contenido con safe search, descargar archivos desde un bucket, y automatizar el estado del post y las notificaciones, todo desde Cloud Fusion y sin tocar el front end.
Primero se definen variables y constantes para la librería de Vision y el bucket. Luego se crea el cliente de Vision instanciando la clase ImageAnnotatorClient. Con esto podrás invocar el análisis de imágenes.
Ejemplo de configuración e instalación en código:
// Cliente de Vision
const vision = require('@google-cloud/vision');
const client = new vision.ImageAnnotatorClient();
// Descarga desde el bucket a una ruta temporal
await bucket.file(rutaArchivo).download({ destination: tmpRutaArchivo });
Con el archivo ya en la ruta temporal, se llama a la función de Vision para la detección de contenido seguro. Con una sola línea, Google aplica machine learning para evaluar si la imagen es apropiada.
client.safeSearchDetection(tmpRutaArchivo).Código de análisis y extracción de atributos:
const [result] = await client.safeSearchDetection(tmpRutaArchivo);
const safe = result.safeSearchAnnotation; // safeSearchAnnotation
const adulto = safe.adult; // adult
const violento = safe.violence; // violence
const medico = safe.medical; // medical
Se evalúan contra etiquetas de probabilidad como likely o very. Una función interna, por ejemplo esAdecuada, compara si el resultado es diferente a esos valores para considerar la imagen apropiada.
const esApta = (
esAdecuada(adulto) && esAdecuada(violento) && esAdecuada(medico)
);
Si la imagen es adecuada, se actualiza el estado del post para que pueda publicarse. Si no lo es, se envía una notificación al usuario que subió la imagen, usando el token que está guardado en el post.
Flujo de decisión y acciones:
if (esApta) {
await actualizarEstadoPost(idPost, true); // publicar
return;
}
await enviarNotificacionRespuesta(idPost); // inapropiada
Así, con promesas bien manejadas y acceso controlado al bucket, se orquesta una moderación robusta: descargar, analizar, evaluar y actuar. Si deseas profundizar en consultas y envío de notificaciones, puedes revisarlo en el curso de Firebase para la web.
¿Tienes casos de uso que quieras automatizar con Cloud Vision o reglas distintas para contenido adulto, violento o médico? Cuéntalo y lo exploramos juntos.
no olvidar instalar la libreria de Vision
npm install --save @google-cloud/vision
safeSerachDetection -> Google aplica machine learning para que este en formato seguro
hola a todos.. consulta.. alguien sabe si es posible instalar la extension de firebase algolia para multiples indices?
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```
Marcos Orozco Rios
no olvidar instalar la libreria de Vision
npm install --save @google-cloud/vision
Jean Nuñez
safeSerachDetection -> Google aplica machine learning para que este en formato seguro
Alejandro Novillo
hola a todos.. consulta.. alguien sabe si es posible instalar la extension de firebase algolia para multiples indices?
Juan Guillermo Gómez Torres
ProfesorEdgar Mogollon
Interesante!
Martin DAVILA
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```