Skip to main content

Objetivo

Este tutorial describe cómo funciona el script kameleoon_to_confluence.py, paso a paso. Dado un ID de experimento de Kameleoon, un sitio de Confluence y un ID de espacio de Confluence, el script recupera los metadatos y los resultados estadísticos del experimento, identifica la variación con mejor rendimiento, e inserta o actualiza una fila para ese experimento en una tabla en una página de Confluence. Volver a ejecutar el script para el mismo experimento actualiza su fila existente en lugar de añadir un duplicado. Los pasos 1–5 reutilizan el mismo flujo de solicitud y consulta que el tutorial de exportación a Airtable. Solo cambia el destino.

Alternativa: exportar con un asistente de IA en lugar del script

Ejecutar el script requiere un entorno de Python, cuatro credenciales almacenadas, y una ejecución manual por cada experimento que quiera exportar. Si ya utiliza un asistente de IA compatible con MCP como Claude, puede realizar la misma exportación desde una conversación, conectándolo a los servidores MCP (Model Context Protocol) remotos propios de Kameleoon y de Atlassian, ya sea a través de una herramienta de código o directamente en la aplicación Claude. Siga la guía para exportar los resultados usando Claude.
El servidor MCP de Atlassian expone herramientas a través de Jira, Confluence y Bitbucket, incluyendo acceso de escritura a páginas de Confluence. El servidor MCP de Kameleoon también puede iniciar, pausar, detener o eliminar experimentos y feature flags. Revise cualquier acción que proponga cualquiera de los conectores antes de aprobarla.

Requisitos

  • Credenciales de la API de Kameleoon. La Automation API requiere un token de acceso. El script obtiene uno de forma programática a partir de un client_id y un client_secret mediante el grant client_credentials. Consulte Obtener un token de acceso.
  • Un token de API de Confluence, emparejado con la dirección de correo electrónico de la cuenta a la que pertenece. Cree un token en id.atlassian.com/manage-profile/security/api-tokens. El script envía ambos como autenticación HTTP básica en cada solicitud a Confluence.
  • El ID de espacio numérico de Confluence para el espacio que aloja la página. A diferencia de un ID de base de datos de Notion o un ID de base de Airtable, el ID numérico de un espacio no aparece en su URL (esa URL muestra la clave del espacio en su lugar), y tampoco se muestra en ningún lugar de la interfaz de usuario web de Confluence. Pida a un asistente de IA conectado por MCP que lo busque por usted, o consígalo usted mismo del endpoint Get spaces de la API REST de Confluence.
  • Python 3.9+ con la biblioteca requests (pip install requests).
Confluence no tiene equivalente a una base de datos de Notion o una tabla de Airtable que construya por adelantado. El script crea la página de destino a sí mismo, con su tabla, la primera vez que se ejecuta. En cada ejecución posterior, encuentra esa página por título y la actualiza.
Almacene todas las credenciales en variables de entorno. Nunca codifique secretos directamente en el script.
El tutorial utiliza el experimento de ejemplo Product Page Redesign (ID 188308), con dos variaciones además de la original: variación 828220 y variación 828221.

1. Autenticarse con la Automation API

Endpoint: obtenga un token de acceso enviando una solicitud POST al endpoint de token.
Ejemplo:
Respuesta:
Envíe el access_token devuelto como token Bearer en cada solicitud posterior a la Automation API. Los tokens de acceso son válidos durante 2 horas de forma predeterminada.

2. Recuperar el experimento

Endpoint: obtenga los metadatos del experimento enviando una solicitud GET al endpoint Get an experiment.
Ejemplo:
Respuesta (truncada):
El script lee name, status, dateStarted, dateEnded y description para la fila de Confluence, y mainGoalId para acotar la solicitud de resultados en el siguiente paso.
La API devuelve mainGoalId de forma predeterminada, por lo que no necesita un parámetro optionalFields para leerlo. La Automation API no publica una enumeración fija para el campo status, pero otros campos de tipo estado en toda la API utilizan sistemáticamente tokens en mayúsculas (por ejemplo, STOPPED, ACTIVE, DRAFT). El paso 6 asigna el campo status partiendo de ese supuesto. Confirme los tokens exactos que devuelve su cuenta con una solicitud real antes de confiar en la asignación.

3. Solicitar los resultados del experimento

Endpoint: active la generación del informe de resultados enviando una solicitud POST al endpoint Request experiment’s results.
Ejemplo:
Respuesta:
Kameleoon genera el informe de forma asíncrona. El endpoint devuelve un dataCode, que paso 4 utiliza para consultar el resultado.
Este script requiere bayesian: true y establece sequentialTesting: false. bayesian y sequentialTesting son métodos alternativos para calcular la significancia, y este tutorial reporta la probabilidad de éxito bayesiana. Con Bayesian habilitado, el valor reliability del informe representa la probabilidad de éxito bayesiana (la probabilidad de que una variación supere a la referencia), que el script asigna al campo Probability. Confirme el valor con el mismo informe en la aplicación Kameleoon si su cuenta utiliza un método estadístico predeterminado diferente.

4. Consultar los resultados

Endpoint: recupere el informe enviando solicitudes GET al endpoint Poll results hasta que esté listo.
El status de la respuesta es WAITING mientras Kameleoon calcula el informe, READY cuando los datos están disponibles, o ERROR / TIMEOUT en caso de fallo. Cuando el estado es ERROR o TIMEOUT, la respuesta incluye un errorDescription de nivel superior. El script consulta a intervalos fijos hasta que el estado es READY. Ejemplo:
Respuesta (truncada):

5. Seleccionar la variación con mejor rendimiento

Los resultados contienen una entrada por variación bajo variationData, además de la línea _reference para la página original. Para cada variación, las métricas del objetivo solicitado se encuentran bajo breakdownData._reference.generalData.goalsData[goalId]. El script omite la entrada _reference, lee el improvementRate y el reliability (la probabilidad de éxito bayesiana) de cada variación, y selecciona como mejor variación la que tiene la tasa de mejora más alta. El campo Result, asignado en el siguiente paso, registra si esa variación realmente ganó: si alcanzó una probabilidad de éxito suficientemente alta con una mejora positiva. Ejemplo:
En este ejemplo, ambas variaciones alcanzan una probabilidad de éxito bayesiana del 100%, pero la variación 828220 muestra una mejora del +211,48% frente al -43,33% de la variación 828221. Variación 828220 tiene por lo tanto la tasa de mejora más alta y, con una probabilidad superior al 95% y una mejora positiva, es la ganadora genuina.

6. Asignar los datos a las columnas de Confluence

El script transforma los metadatos del experimento y las métricas de la variación con mejor rendimiento en una fila para la tabla de Confluence, utilizando las mismas ocho columnas que las exportaciones a Notion y Airtable. Ejemplo:
La Automation API no publica una enumeración fija para el campo status del experimento, y los tokens pueden evolucionar. map_status compara sin distinguir mayúsculas y minúsculas y devuelve None para un estado no reconocido, lo que omite la celda Status en lugar de escribir un valor incorrecto. Confirme los tokens que devuelve su cuenta con una única solicitud GET /experiments/{experimentId} y amplíe STATUS_MAP si es necesario.

7. Analizar la tabla de Experimentos existente

Confluence no tiene un objeto de base de datos o tabla propio. En su lugar, el script mantiene una página dedicada con una única tabla HTML, una fila por experimento, y trata la columna Experiment Name de la misma manera que Notion trata una propiedad de título o Airtable trata un campo de fusión: como la clave en la que hace un upsert. El script construye esa tabla con una disposición full-width en lugar de la predeterminada más estrecha de Confluence, ya que ocho columnas de encabezados moderadamente largos se envuelven en mitad de palabra en el ancho de página predeterminado. El formato de almacenamiento de Confluence (el marcado similar a HTML en el que se almacena el cuerpo de una página) envuelve el texto de cada celda en una etiqueta <p>, y la fila de encabezado de una página recién creada son celdas <tr><th>...</th></tr> planas sin un <thead> circundante. El analizador de abajo, construido en el html.parser.HTMLParser estándar de Python, maneja tanto ese caso de encabezado plano como uno envuelto en <thead>, y trata una celda vacía igual si Confluence la renderiza como <p></p> vacío o como <p /> auto-cerrado. También se detiene en el primer </table>, así que una segunda tabla en otro lugar de la página (una que haya añadido manualmente, por ejemplo) nunca se fusiona con el resultado analizado, y cierra cualquier fila o celda que una edición mal formada dejó abierta, independientemente de si la siguiente etiqueta abre una fila nueva o la tabla misma termina, por lo que una etiqueta sin cerrar extraviada no puede eliminar silenciosamente una fila. Ejemplo:
reorder_row protege contra una tabla cuyas columnas fueron reordenadas manualmente en Confluence, por ejemplo por una persona arrastrando una columna en el editor. Sin ella, una búsqueda por posición compararía el Experiment Name de la fila nueva contra cualquier columna que ahora esté en esa posición en la tabla existente, coincidiendo silenciosamente con la fila equivocada o ninguna en absoluto. Solo realinea un verdadero reordenamiento, donde el encabezado aún tiene las mismas ocho etiquetas en un orden diferente. Si el texto de una celda de encabezado fue editado en sí mismo, por ejemplo retitulando Notes a Comments, las etiquetas ya no coinciden HEADER en absoluto, así que la función cae de vuelta al orden de columna existente e imprime una advertencia en lugar de adivinar, en lugar de silenciosamente blanquear los datos de esa columna en cada fila.

8. Buscar, crear o actualizar la página de Confluence

Buscar: busque la página por título dentro del espacio utilizando los parámetros de consulta title y space-id en el endpoint Get pages. Pasando body-format=storage devuelve el contenido de la tabla actual en la misma llamada.
Crear: si ninguna página coincide, cree una con el endpoint Create page, con la tabla ya construida a partir de una única fila.
Actualizar: si una página coincide, reconstruya la tabla completa a partir de sus filas existentes más la insertada o actualizada, y sobrescriba la página con el endpoint Update page.
Confluence no tiene un endpoint de actualización por fila o por campo. La actualización de una página reemplaza su cuerpo completo, así que el script siempre lee la tabla actual, inserta o actualiza una fila en memoria, y escribe la tabla completa de vuelta. Ese reemplazo de cuerpo completo difiere de la exportación a Airtable, que parchea un único registro, y de la exportación a Notion, que parchea las propiedades de una única página.
A diferencia de las APIs de Notion y Airtable, Confluence requiere que la persona que hace la llamada incremente version.number en cada actualización, al número de versión actual más uno. Enviar el número actual de nuevo, u omitir version, hace que la solicitud falle. Un asistente de IA conectado por MCP usando las herramientas propias de Atlassian maneja esto automáticamente; una llamada REST directa, como en este script, no.
Ejemplo:
Respuesta (truncada):

9. Ejecutar el script

Pase el ID del experimento, el sitio de Confluence y el ID del espacio como argumentos:
El script imprime cada paso: la autenticación, el experimento obtenido, la variación con mejor rendimiento, la fila asignada, y si creó o actualizó la página de Confluence. Pase --page-title para dirigirse a un nombre de página distinto del predeterminado Experiments.

Script completo

El script completo de abajo coincide función por función con kameleoon_to_confluence.py. Cópielo directamente, o descargue el archivo desde ese enlace.

Notas de personalización

  • La asignación de estado vive en la constante STATUS_MAP, indexada por los tokens de estado en mayúsculas que devuelve la API. Ajuste los valores de destino si sus opciones de Status difieren de Running / Implementing / Completed / Defunct, y confirme los tokens que devuelve su cuenta con una solicitud real GET /experiments/{experimentId} antes de confiar en la asignación.
  • Probability procede de la probabilidad de éxito bayesiana medida, que requiere bayesian: true en la solicitud de resultados. Si desea una estimación previa al experimento en su lugar, elimine la línea Probability de build_row.
  • La selección de objetivo usa el mainGoalId del experimento. Para generar el informe sobre un objetivo diferente, pase su ID a request_results y pick_best_variation.
  • Clave de upsert. El coincidencia en Experiment Name es exacta, por lo que las diferencias de mayúsculas/minúsculas o espacios crean una fila nueva en lugar de actualizar la existente. Porque el flujo de búsqueda-entonces-escritura no es atómico, evite ejecutar dos exportaciones para el mismo experimento simultáneamente, y evite renombrar un experimento entre ejecuciones a menos que también quiera una fila nueva para él.
  • Actualizaciones de página completa. Cada actualización reescribe la tabla completa, ya que Confluence no tiene una escritura por fila. Si mantiene la página manualmente entre ejecuciones del script, mantenga sus ediciones dentro de la tabla que construye el script. El script actualmente no conserva contenido fuera de esa tabla.
  • Conflictos de versión. El script siempre lee el version.number actual de la página inmediatamente antes de escribir, por lo que una edición manual hecha entre la lectura y la escritura hace que el siguiente PUT falle con un conflicto de versión. Ejecute el script de nuevo si eso sucede.
  • Límites de frecuencia. La Automation API permite hasta 50 solicitudes cada 10 segundos y 1000 por hora, pero Kameleoon recomienda mantenerse por debajo de 12 llamadas por minuto por cuenta. Confluence Cloud aplica sus propios límites de frecuencia, que varían según el plan; consulte la documentación de limitación de frecuencia de Atlassian para valores actuales. Si procesa muchos experimentos por lotes, almacene en caché los tokens, limite la frecuencia de las solicitudes, y considere la Data API para necesidades de gran volumen.