Cargar lugar del Sheet y ejecutar el scraping.
Configura una vez la conexión y copia el ejemplo de cada endpoint.
Comprobando autorización de DPIA…
Acceso validado mediante tu access_token DPIA.
Guardá este token en un lugar seguro. Por seguridad, no podrá volver a visualizarse completo después de cerrar esta pantalla.
| ID | Usuario | Integración | Token | Creación | Vencimiento | Último uso | Peticiones | Permisos | Estado | Acciones |
|---|
No hay tokens generados.
Administración: se valida automáticamente tu access_token de DPIA, con rol ADMINISTRADOR o MODERADOR. No hay un segundo login. Consumo desde Base44: usa exclusivamente un token generado de la tabla api. Ambos sistemas son independientes.
localStorage no se comparte entre dominios ni puertos. La app principal debe abrir esta pantalla con window.open e instalar el puente de autenticación: descargar puente para DPIA. Configura el origen HTTPS exacto del scrapeador en el puente. El receptor solo acepta la respuesta de su ventana de origen, desde un dominio DPIA permitido y con el nonce solicitado. El token queda solo en memoria. No se admiten tokens en URLs ni mensajes con origen comodín.
La API está en /api/scraper/v1. Usa un dominio público con HTTPS para producción.
Genera tu credencial desde Administración de tokens API. Su hash y metadatos se guardan en la tabla api; el token completo solo se muestra al crearlo. Conserva APIFY_TOKEN para Apify. Solo los flujos con Sheets requieren SHEET_ID_DETECTOR_TENDENCIA y PAHT_SHEET.
URL de producción prevista: https://api.dpia.site/api/scraper/v1. El diagnóstico local no certifica DNS, certificado HTTPS ni Nginx.
SCRAPER_URL=https://api.dpia.site/api/scraper/v1
SCRAPER_API_KEY=TOKEN_GENERADOEnvía Authorization: Bearer TOKEN_GENERADO y Content-Type application/json para POST. Solo OPTIONS responde sin token. Las consultas requieren scraper:read; scraping, imágenes y escrituras requieren scraper:write. Los trabajos y archivos compartidos requieren además un usuario DPIA administrador; una publicación no puede indicar otro usuario salvo que el titular sea administrador.
La clave antigua de entorno se conserva para transición, pero solo se acepta al activar explícitamente SCRAPER_ALLOW_LEGACY_KEY=true. No genera historial individual ni permite revocación por registro: desactívala al terminar la migración. Un token dpia_ inválido nunca utiliza ese fallback.
Crea los secretos SCRAPER_URL (URL completa que termina en /api/scraper/v1, sin barra final) y SCRAPER_API_KEY (el token recién generado). No los incluyas en el frontend.
Crea la función backend dpia-scraper y copia el código de abajo. Para proyectos CLI, el archivo es base44/functions/dpia-scraper/entry.ts. Esta función exige un usuario conectado con rol admin en Base44: inicia sesión como administrador para usar los ejemplos.
Los ejemplos siguientes se pegan en un módulo de tu app Base44 y usan su cliente @/api/base44Client. Si tu proyecto lo ubica en otro sitio, ajusta solo ese import. Puedes llamar a ejecutar() desde el botón correspondiente en vez de al cargar el módulo. Los nombres FECHA_HORA, ASIN y datos de publicación son ilustrativos: sustitúyelos por los devueltos por tus consultas.
Referencia del formato de funciones, autenticación y secretos: documentación oficial de Base44.
scrapingSheet y conserva archivo_base. Sheets solo aporta filas con Producto, estado ACTIVO y validado FALSE.scrapingImagenes con ese archivo como nombre_archivo y archivo_base. Si elegiste otro resultado original, usa su nombre en nombre_archivo.tablaB y archivo_relacionado. Cada fila incluye las imágenes imagen a imagen6. Los filtros descartan precio inválido; con rating, exigen al menos 4,4 y 50 reseñas.publicar con la fila completa, no con el índice del botón. Desactiva el botón durante el envío y tras confirmar guardado=true.trabajos, relaciones y resultado.sheet_name es el nombre exacto de tu pestaña (por ejemplo, argentina). No es lo mismo que las claves de países de las búsquedas directas. El prefijo de archivos también distingue mayúsculas.
import { base44 } from "@/api/base44Client";
async function prepararPublicaciones() {
const sheet_name = "argentina";
const inicial = (await base44.functions.invoke("dpia-scraper", {
action: "scrapingSheet", body: { sheet_name }
})).data;
if (!inicial.success) throw new Error(inicial.error);
if (!inicial.archivo_base) return { tablaB: [], mensaje: "No hay filas activas pendientes" };
const imagenes = (await base44.functions.invoke("dpia-scraper", {
action: "scrapingImagenes",
body: { sheet_name, nombre_archivo: inicial.archivo_base, archivo_base: inicial.archivo_base }
})).data;
if (!imagenes.success) throw new Error(imagenes.error);
return { ...imagenes, sheet_name, archivo_base: inicial.archivo_base };
}
// Ejecutar una sola vez desde el botón de scraping.
const trabajo = await prepararPublicaciones();
console.log(trabajo.tablaB);
// Usar esta función desde el botón Enviar de una fila.
async function enviarFila(fila) {
const result = (await base44.functions.invoke("dpia-scraper", {
action: "publicar",
body: {
sheet_name: trabajo.sheet_name,
fila,
archivo_relacionado: trabajo.archivo_relacionado
}
})).data;
if (!result.guardado) throw new Error(result.error || "No se pudo guardar");
// Ya está en la BD. Si hay advertencias, no repetir la publicación.
console.log(result.publicaciones_ids, result.advertencias);
return result;
}Cargando endpoints…
No hay endpoints que coincidan con la búsqueda.
Las respuestas de ejemplo muestran la estructura; los arrays pueden venir vacíos. Cuando no hay filas activas pendientes, los endpoints de Sheet pueden devolver {"success":true,"datos":[]}. Verifica siempre si existen tablaA, tablaB y los nombres de archivo antes de continuar.
functions.invoke lance una excepción: muestra el error en tu interfaz con try/catch.advertencias, revisa sheet_validado y archivo_validado; no reenvíes la publicación para corregir la sincronización. No hay deduplicación de peticiones.batch_size de 1–20 y puede devolver errores por lote dentro de datos aunque success sea true. No guardan archivos ni publican en BD.