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.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_idy unclient_secretmediante el grantclient_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).
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:
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:
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:
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:
5. Seleccionar la variación con mejor rendimiento
Los resultados contienen una entrada por variación bajovariationData, 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:
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ónfull-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 consultatitle y space-id en el endpoint Get pages. Pasando body-format=storage devuelve el contenido de la tabla actual en la misma llamada.
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.9. Ejecutar el script
Pase el ID del experimento, el sitio de Confluence y el ID del espacio como argumentos:--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 deRunning/Implementing/Completed/Defunct, y confirme los tokens que devuelve su cuenta con una solicitud realGET /experiments/{experimentId}antes de confiar en la asignación. - Probability procede de la probabilidad de éxito bayesiana medida, que requiere
bayesian: trueen la solicitud de resultados. Si desea una estimación previa al experimento en su lugar, elimine la líneaProbabilitydebuild_row. - La selección de objetivo usa el
mainGoalIddel experimento. Para generar el informe sobre un objetivo diferente, pase su ID arequest_resultsypick_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.numberactual 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 siguientePUTfalle 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.