Ziel
Dieses Tutorial beschreibt Schritt für Schritt, wie das Skript kameleoon_to_confluence.py funktioniert. Anhand einer Kameleoon-Experiment-ID, einer Confluence-Site und einer Confluence-Space-ID ruft das Skript die Experimentmetadaten und die statistischen Ergebnisse ab, ermittelt die leistungsstärkste Variation, bildet die Daten auf das Confluence-Seitenschema ab und schreibt einen Datensatz per Upsert auf eine Confluence-Seite. Ein erneuter Lauf des Skripts für dasselbe Experiment aktualisiert die bestehende Zeile, statt ein Duplikat zu erstellen. Die Schritte 1–5 verwenden denselben Anfrage- und Abfrage-Ablauf wie das Airtable-Export-Tutorial. Nur das Ziel ist unterschiedlich.Alternative: Export mit einem KI-Assistenten statt mit dem Skript
Das Ausführen des Skripts erfordert eine Python-Umgebung, vier hinterlegte Anmeldedaten und einen manuellen erneuten Lauf für jedes Experiment, das Sie exportieren möchten. Wenn Sie bereits einen MCP-kompatiblen KI-Assistenten wie Claude verwenden, können Sie denselben Export stattdessen aus einer Konversation heraus durchführen, indem Sie ihn mit den Remote-MCP-Servern (Model Context Protocol) von Kameleoon und Atlassian verbinden – entweder über ein Coding-Tool oder direkt in der Claude-App. Folgen Sie unserem Leitfaden, um Ergebnisse mit Claude zu exportieren.Voraussetzungen
-
Kameleoon-API-Anmeldedaten. Die Automation API erfordert ein Access Token. Das Skript ruft dieses programmgesteuert anhand einer
client_idund einesclient_secretüber denclient_credentials-Grant ab. Siehe Access Token abrufen. - Ein Confluence-API-Token, gepaart mit der E-Mail-Adresse des Kontos, zu dem es gehört. Erstellen Sie ein Token auf id.atlassian.com/manage-profile/security/api-tokens. Das Skript sendet beide als HTTP-Basic-Authentifizierung auf jeder Confluence-Anfrage.
- Die numerische Confluence-Space-ID für den Space, der die Seite enthält. Im Gegensatz zu einer Notion-Datenbank-ID oder einer Airtable-Base-ID erscheint die numerische Space-ID nicht in ihrer URL (diese URL zeigt stattdessen den Space-Schlüssel), und sie wird auch nirgendwo in der Confluence-Benutzeroberfläche angezeigt. Bitten Sie einen MCP-verbundenen KI-Assistenten, sie für Sie nachzuschlagen, oder rufen Sie sie selbst vom Confluence-REST-API-Endpoint Get spaces ab.
-
Python 3.9+ mit der Bibliothek
requests(pip install requests).
188308) mit zwei Variationen zusätzlich zur Originalversion: Variation 828220 und Variation 828221.
1. Bei der Automation API authentifizieren
Endpoint: Rufen Sie ein Access Token ab, indem Sie eine POST-Anfrage an den Token-Endpoint senden.
Beispiel:
access_token als Bearer-Token bei jeder weiteren Anfrage an die Automation API. Access Tokens sind standardmäßig 2 Stunden lang gültig.
2. Das Experiment abrufen
Endpoint: Rufen Sie die Experimentmetadaten ab, indem Sie eine GET-Anfrage an den Endpoint Get an experiment senden.
Beispiel:
name, status, dateStarted, dateEnded und description für die Confluence-Zeile sowie mainGoalId, um die Ergebnisanfrage im nächsten Schritt einzugrenzen.
Die API gibt
mainGoalId standardmäßig zurück, sodass Sie keinen optionalFields-Parameter benötigen, um sie zu lesen. Die Automation API veröffentlicht kein festes Enum für das Feld status, aber andere statusartige Felder in der gesamten API verwenden durchgängig Token in Großbuchstaben (zum Beispiel STOPPED, ACTIVE, DRAFT). Schritt 6 bildet das Feld status unter dieser Annahme ab. Bestätigen Sie die genauen Token, die Ihr Konto zurückgibt, mit einer Live-Anfrage, bevor Sie sich auf dieses Mapping verlassen.3. Die Ergebnisse des Experiments anfordern
Endpoint: Lösen Sie die Erstellung des Ergebnisberichts aus, indem Sie eine POST-Anfrage an den Endpoint Request experiment’s results senden.
Beispiel:
dataCode zurück, den Schritt 4 verwendet, um das Ergebnis abzufragen.
Dieses Skript erfordert
bayesian: true und setzt sequentialTesting: false. bayesian und sequentialTesting sind alternative Methoden zur Berechnung der Signifikanz, und dieses Tutorial gibt die Bayesianische Erfolgswahrscheinlichkeit aus. Bei aktiviertem Bayesian-Modus trägt der Wert reliability des Berichts die Bayesianische Erfolgswahrscheinlichkeit (die Wahrscheinlichkeit, dass eine Variation die Referenz übertrifft), die das Skript auf das Feld Probability abbildet. Gleichen Sie den Wert mit demselben Bericht in der Kameleoon-App ab, wenn Ihr Konto eine andere Standardstatistikmethode verwendet.4. Die Ergebnisse abfragen
Endpoint: Rufen Sie den Bericht ab, indem Sie GET-Anfragen an den Endpoint Poll results senden, bis er bereit ist.
Der
status der Antwort lautet WAITING, solange Kameleoon den Bericht berechnet, READY, sobald die Daten verfügbar sind, oder ERROR beziehungsweise TIMEOUT bei einem Fehler. Wenn der Status ERROR oder TIMEOUT lautet, enthält die Antwort ein errorDescription-Feld auf oberster Ebene. Das Skript fragt in einem festen Intervall ab, bis der Status READY lautet.
Beispiel:
5. Die leistungsstärkste Variation auswählen
Die Ergebnisse enthalten untervariationData einen Eintrag pro Variation sowie die Zeile _reference für die Originalseite. Für jede Variation liegen die Metriken für das angeforderte Ziel unter breakdownData._reference.generalData.goalsData[goalId].
Das Skript überspringt den Eintrag _reference, liest für jede Variation improvementRate und reliability (die Bayesianische Erfolgswahrscheinlichkeit) und wählt die Variation mit der höchsten Verbesserungsrate als leistungsstärkste aus. Das im nächsten Schritt abgebildete Feld Result erfasst, ob diese Variation tatsächlich gewonnen hat: ob sie eine ausreichend hohe Erfolgswahrscheinlichkeit bei einer positiven Verbesserung erreicht hat.
Beispiel:
828220 zeigt eine Verbesserung von +211,48 % gegenüber -43,33 % bei Variation 828221. Variation 828220 ist daher die leistungsstärkste Variation und, mit einer Wahrscheinlichkeit über 95 % und einer positiven Verbesserung, ein echter Gewinner.
6. Die Daten auf Confluence-Spalten abbilden
Das Skript wandelt die Experimentmetadaten und die Metriken der leistungsstärksten Variation in eine Zeile für die Confluence-Tabelle um und verwendet dabei dieselben acht Spalten wie die Notion- und Airtable-Exporte.
Beispiel:
Die Automation API veröffentlicht kein festes Enum für das Feld
status des Experiments, und die Token können sich weiterentwickeln. map_status vergleicht ohne Berücksichtigung der Groß-/Kleinschreibung und gibt für einen nicht erkannten Status None zurück, wodurch die Zelle Status verworfen wird, statt einen falschen Wert zu schreiben. Bestätigen Sie die Token, die Ihr Konto zurückgibt, mit einer einzelnen GET /experiments/{experimentId}-Anfrage, und erweitern Sie STATUS_MAP bei Bedarf.7. Die vorhandene Experiments-Tabelle analysieren
Confluence hat kein Datenbank- oder Tabellenobjekt an sich. Stattdessen verwaltet das Skript eine dedizierte Seite mit einer einzelnen HTML-Tabelle darauf, eine Zeile pro Experiment, und behandelt die Spalte Experiment Name genauso wie Notion eine Titeleigenschaft oder Airtable ein Merge-Feld behandelt: als den Schlüssel, auf den es einen Upsert durchführt. Das Skript erstellt diese Tabelle mit einemfull-width-Layout, statt des schmaleren Standardlayouts von Confluence, da acht Spalten mit mittellangen Kopfzeilen bei der Standardseitenbreite umgebrochen werden.
Confluences Speicherformat (das HTML-ähnliche Markup, in dem der Inhalt einer Seite gespeichert ist) wickelt den Text jeder Zelle in ein <p>-Tag, und eine neu erstellte Seitenkopfzeile ist einfaches <tr><th>...</th></tr> ohne umgebendes <thead>. Der untenstehende Parser, basierend auf Pythons Standard html.parser.HTMLParser, verarbeitet sowohl diesen bloßen Header-Fall als auch einen von <thead> umhüllten, und behandelt eine leere Zelle gleich, ob Confluence sie als leeres <p></p> oder selbstschließendes <p /> rendert. Er stoppt auch beim ersten </table>, sodass eine zweite Tabelle an anderer Stelle auf der Seite (eine, die Sie von Hand hinzugefügt haben, zum Beispiel) niemals in das analysierte Ergebnis verschmilzt, und schließt jede Zeile oder Zelle, die eine fehlerhafte Bearbeitung offen gelassen hat, ob das nächste Tag eine neue Zeile öffnet oder die Tabelle selbst endet, damit ein verirrtes nicht geschlossenes Tag keine Zeile verlieren kann.
Beispiel:
reorder_row schützt vor einer Tabelle, deren Spalten in Confluence manuell neu angeordnet wurden, zum Beispiel wenn eine Person eine Spalte im Editor zieht. Ohne es würde eine Nachschlageverfolgung nach Position die Spalte Experiment Name der neuen Zeile gegen alles vergleichen, was jetzt an dieser Position in der vorhandenen Tabelle sitzt, wodurch die falsche Zeile stillschweigend abgeglichen oder gar keine wird. Sie richtet nur eine echte Neuanordnung aus, wenn der Header immer noch dieselben acht Beschriftungen in einer anderen Reihenfolge hat. Wenn der Text einer Kopfzelle selbst bearbeitet wurde, zum Beispiel wenn Notes in Comments umbenannt wurde, stimmen die Beschriftungen nicht länger mit HEADER überein, also fällt die Funktion auf die vorhandene Spaltenreihenfolge zurück und gibt eine Warnung aus, statt zu raten, statt stumm diese Spalte Daten auf jeder Zeile zu löschen.8. Die Confluence-Seite finden, erstellen oder aktualisieren
Suchen: Suchen Sie die Seite nach Titel innerhalb des Spaces unter Verwendung der Query-Parametertitle und space-id auf dem Endpoint Get pages. Das Übergeben von body-format=storage gibt den aktuellen Tabelleninhalt im selben Aufruf zurück.
Confluence hat keinen Schreibvorgang pro Zeile oder pro Feld. Das Aktualisieren einer Seite ersetzt ihren gesamten Body, daher liest das Skript immer die aktuelle Tabelle, upsert eine Zeile im Speicher und schreibt die gesamte Tabelle zurück. Diese ganze Body-Ersetzung unterscheidet sich vom Airtable-Export, der einen einzelnen Datensatz patcht, und vom Notion-Export, der die Eigenschaften einer einzelnen Seite patcht.
Im Gegensatz zu den Notion- und Airtable-APIs erfordert Confluence vom Aufrufer,
version.number bei jedem Update auf die aktuelle Versionsnummer plus eins zu inkrementieren. Das erneute Senden der aktuellen Nummer oder das Auslassen von version lässt die Anfrage fehlschlagen. Ein MCP-verbundener KI-Assistent mit Atlassian-eigenen Tools verarbeitet dies automatisch; ein direkter REST-Aufruf, wie in diesem Skript, nicht.9. Das Skript ausführen
Übergeben Sie die Experiment-ID, die Confluence-Site und die Space-ID als Argumente:--page-title, um eine Seitennamen andere als den Standard Experiments anzugeben.
Vollständiges Skript
Das vollständige Skript unten entspricht Funktion für Funktion kameleoon_to_confluence.py. Kopieren Sie es direkt, oder laden Sie die Datei über diesen Link herunter.Anpassungshinweise
- Status-Mapping befindet sich in der Konstante
STATUS_MAP, die anhand der von der API zurückgegebenen Status-Token in Großbuchstaben indiziert ist. Passen Sie die Zielwerte an, wenn Ihre Status-Beschriftungen vonRunning/Implementing/Completed/Defunctabweichen, und bestätigen Sie die Token, die Ihr Konto zurückgibt, mit einer Live-AnfrageGET /experiments/{experimentId}, bevor Sie sich auf das Mapping verlassen. - Probability stammt aus der gemessenen Bayesianischen Erfolgswahrscheinlichkeit, wofür
bayesian: truein der Ergebnisanfrage erforderlich ist. Wenn Sie eine Vor-Experiment-Schätzung statt einer gemessenen bevorzugen, entfernen Sie die ZeileProbabilityausbuild_row. - Zielauswahl verwendet die
mainGoalIddes Experiments. Um über ein anderes Ziel zu berichten, übergeben Sie dessen ID anrequest_resultsundpick_best_variation. - Upsert-Schlüssel. Der Abgleich nach Experiment Name ist exakt, daher erstellen Unterschiede bei Groß-/Kleinschreibung oder Leerzeichen eine neue Zeile, statt die bestehende zu aktualisieren. Weil der Find-then-Write-Ablauf nicht atomar ist, vermeiden Sie das gleichzeitige Ausführen zweier Exporte für dasselbe Experiment, und vermeiden Sie das Umbenennen eines Experiments zwischen Läufen, wenn Sie nicht auch eine neue Zeile dafür möchten.
- Ganz-Seiten-Updates. Jede Aktualisierung schreibt die gesamte Tabelle neu, da Confluence keinen Schreibvorgang pro Zeile hat. Wenn Sie die Seite zwischen Skriptläufen von Hand verwalten, halten Sie Ihre Bearbeitungen innerhalb der Tabelle, die das Skript erstellt. Das Skript bewahrt derzeit Inhalte außerhalb dieser Tabelle nicht.
- Versionskonflikte. Das Skript liest immer die aktuelle
version.numberder Seite unmittelbar vor dem Schreiben, daher lässt eine zwischen dem Lesen und dem Schreiben vorgenommene manuelle Bearbeitung die nächstePUTmit einem Versionskonflikt fehlschlagen. Führen Sie das Skript erneut aus, wenn dies geschieht. - Rate Limits. Die Automation API erlaubt bis zu 50 Anfragen pro 10 Sekunden und 1.000 pro Stunde, aber Kameleoon empfiehlt, pro Konto unter 12 Aufrufen pro Minute zu bleiben. Confluence Cloud erzwingt seine eigenen Rate Limits, die je nach Plan variieren; siehe Atlassian-Dokumentation zu Rate Limiting für aktuelle Werte. Wenn Sie viele Experimente in Batches verarbeiten, cachen Sie Tokens, drosseln Sie Anfragen, und ziehen Sie für Anwendungsfälle mit hohem Volumen die Data API in Betracht.