¿Tiene problemas con los permisos de carga de archivos de la API de Zoho Cliq? Muchos desarrolladores se encuentran con el error "El alcance no existe" al intentar cargar archivos mediante la API REST de Zoho Cliq. Esta guía completa le guiará por los pasos para resolver problemas de alcance de OAuth e implementar correctamente la función de carga de archivos en sus integraciones de Zoho Cliq.
El problema más común que enfrentan los desarrolladores es el uso de ámbitos OAuth incorrectos para la funcionalidad de carga de archivos de Zoho Cliq.
Alcance: ZohoCliq.Webhooks.Create (✗ Permisos insuficientes) Obligatorio: ZohoCliq.files.CREATE (❓ Se necesita validación del alcance) Respuesta de la API: "El alcance no existe"
Las convenciones de nomenclatura de los ámbitos OAuth de Zoho pueden ser inconsistentes, y la documentación podría no reflejar siempre los últimos cambios en la API. El punto de conexión /buddies/{email}/files
requiere permisos específicos que no están contemplados en los ámbitos de los webhooks.
Pruebe estas variaciones de alcance:
Archivos ZohoCliq.CREAR ZohoCliq.files.create ZohoCliq.Archivos.CREAR ZohoCliq.Archivos.Crear ZohoCliq.file.CREAR
Para la URL de autorización:
https://accounts.zoho.com/oauth/v2/auth?scope=ZohoCliq.files.CREATE&client_id={your_client_id}&response_type=code&redirect_uri={your_redirect_uri}&access_type=offline&prompt=consent
Para el intercambio de tokens:
curl -X POST "https://accounts.zoho.com/oauth/v2/token" \ -H "Tipo de contenido: aplicación/x-www-form-urlencoded" \ -d "tipo_de_concesión=código_de_autorización" \ -d "id_de_cliente={su_id_de_cliente}" \ -d "secreto_de_cliente={su_secreto_de_cliente}" \ -d "uri_de_redirección={su_uri_de_redirección}" \ -d "código={código_de_autorización}"
curl -X POST "https://cliq.zoho.com/api/v2/buddies/{email}/files" \ -H "Autorización: Zoho-oauthtoken {token_de_acceso}" \ -H "Tipo de contenido: multipart/form-data" \ -F "archivo=@/ruta/a/su/archivo.pdf"
Si los alcances de archivos individuales no funcionan, solicite permisos de Cliq más amplios:
ZohoCliq.full_access ZohoCliq.mensajes.CREAR,ZohoCliq.archivos.CREAR,ZohoCliq.canales.CREAR
Implementación:
https://accounts.zoho.com/oauth/v2/auth?scope=ZohoCliq.full_access&client_id={your_client_id}&response_type=code&redirect_uri={your_redirect_uri}&access_type=offline
Utilice la API de mensajes de Cliq con archivos adjuntos:
constante shareFileViaMessage = async (chatId, ruta de archivo, token de acceso) => { const formData = nuevo FormData(); formData.append('text', 'Archivo compartido vía API'); formData.append('archivos adjuntos', fs.createReadStream(filePath)); respuesta constante = await fetch(`https://cliq.zoho.com/api/v2/chats/${chatId}/messages`, { método: 'POST', encabezados: { 'Autorización': `Zoho-oauthtoken ${accessToken}` }, cuerpo: formData }); devolver respuesta.json(); };
Ámbito obligatorio: ZohoCliq.messages.CREATE
o ZohoCliq.Webhooks.Create
{ "nombre": "FileUploadBot", "permisos": ["archivos.subir", "mensajes.enviar"], "webhook_url": "https://su-servidor.com/webhook" }
curl -X POST "https://cliq.zoho.com/api/v2/bots/{bot_id}/message" \ -H "Autorización: Zoho-oauthtoken {access_token}" \ -H "Tipo de contenido: aplicación/json" \ -d '{ "texto": "Archivo cargado exitosamente", "archivos adjuntos": [{"file_url": "tu_archivo_url"}] }'
Asegúrese de estar utilizando el punto final regional correcto:
constante getCliqApiBase = (región) => { puntos finales constantes = { 'EE. UU.': 'https://cliq.zoho.com/api/v2/', 'UE': 'https://cliq.zoho.eu/api/v2/', 'EN': 'https://cliq.zoho.in/api/v2/', 'AU': 'https://cliq.zoho.com.au/api/v2/', 'JP': 'https://cliq.zoho.jp/api/v2/' }; devolver puntos finales[región] || puntos finales['US']; };
curl -X GET "https://cliq.zoho.com/api/v2/users/me" \ -H "Autorización: Zoho-oauthtoken {access_token}"
curl -X GET "https://cliq.zoho.com/api/v2/buddies" \ -H "Autorización: Zoho-oauthtoken {access_token}"
constante refreshToken = async (refreshToken, clientId, clientSecret) => { respuesta constante = await fetch('https://accounts.zoho.com/oauth/v2/token', { método: 'POST', encabezados: { 'Tipo de contenido': 'application/x-www-form-urlencoded' }, cuerpo: nuevo URLSearchParams({ 'tipo_de_concesión': 'token_de_actualización', 'refresh_token': token de actualización, 'client_id': ID del cliente, 'secreto_del_cliente': secreto_del_cliente }) }); devolver respuesta.json(); };
const handleCliqApiError = (error, respuesta) => { si (respuesta.estado === 401) { devolver 'REFRESH_TOKEN_REQUIRED'; } de lo contrario si (respuesta.estado === 403) { devolver 'ALCANCE_INSUFICIENTE'; } de lo contrario si (respuesta.estado === 404) { devolver 'ENDPOINT_INVALID'; } devolver 'ERROR_DESCONOCIDO'; };
const rateLimitedRequest = async (url, opciones, maxRetries = 3) => { para (sea i = 0; i < maxRetries; i++) { const respuesta = await fetch(url, opciones); si (respuesta.estado === 429) { const retryAfter = response.headers.get('Retry-After') || 60; esperar nueva Promesa(resolver => setTimeout(resolver, retryAfter * 1000)); continuar; } respuesta de retorno; } lanzar nuevo Error('Se excedieron los reintentos máximos'); };
const validateFile = (archivo) => { constante tamaño máximo = 25 * 1024 * 1024; constantesPermitidosTipos = [ 'imagen/jpeg', 'imagen/png', 'imagen/gif', 'aplicación/pdf', 'texto/sin formato', 'aplicación/msword', 'aplicación/vnd.ms-excel' ]; si (archivo.tamaño > tamañomáximo) { lanzar nuevo Error('El tamaño del archivo excede el límite de 25 MB'); } si (!allowedTypes.includes(archivo.tipo)) { lanzar nuevo Error('Tipo de archivo no admitido'); } devuelve verdadero; };
¿Listo para implementar un intercambio de archivos robusto en sus aplicaciones? Inicie su proceso de integración con Zoho Cliq y explore todo el potencial de las API de colaboración en equipo.
Para soluciones integrales de comunicación en equipo, considere Zoho Workplace , que incluye Cliq junto con otras herramientas de productividad.
¿Tiene dificultades con integraciones complejas de Zoho? Nuestro equipo de Creator Scripts se especializa en implementaciones de API de Zoho y puede ayudarle a crear soluciones robustas y escalables.