Anmelden

WebSocket-Echtzeit

Steuern Sie einen Cliqer-Raum aus Ihrer eigenen Software wie mit einem Fern-Presenter: mit Folien, Timer, Laserpointer und Nachrichten an den Host

Verbinden Sie sich mit wss://cliqer.io/ws, um einen Cliqer-Raum aus Ihrer eigenen Software oder Ihrem Show-Control-System wie mit einem Fern-Presenter zu steuern: Folien wechseln, den Timer des Hosts bedienen, mit einem Laserpunkt zeigen und dem Host Nachrichten senden. Ihre App tritt dem Raum in der Rolle eines Vortragenden bei; gehostet wird der Raum immer von der Cliqer-Desktop-App.

Authentifizierung: Verbinden Sie sich mit einem Session-Token: dem Cookie session_token (Browser senden es automatisch), einem Query-Parameter ?token= oder einem Header Authorization: Bearer. Das Token wird beim Verbindungsaufbau geprüft, nicht bei jedem Befehl. Wenn es abläuft, öffnen Sie also eine neue Verbindung mit einem frischen Token und treten dem Raum erneut bei. Ohne Token können Sie sich verbinden, die API aber nicht nutzen. Team-API-Schlüssel (cliqer_...) authentifizieren nur die REST-Endpunkte; auf diesem Socket ist ein Schlüssel kein Session-Token.

Verbindung

# WebSocket connections require a WebSocket client
# Using websocat for testing:
websocat "$WS_URL/ws?token=YOUR_ACCESS_TOKEN"

Der Server sendet connected mit Ihrer clientId, sobald er die Verbindung eingerichtet hat. Warten Sie darauf, bevor Sie etwas senden: Eine Nachricht, die früher eintrifft, wird mit einem error abgelehnt, und die Verbindung wird geschlossen.


Verbindung & Raumablauf

Foliensteuerung

Steuern Sie die Folien in einem Raum aus Ihrer eigenen Software, wie mit einem Fern-Presenter. Ihre App tritt dem Raum in der Rolle eines Vortragenden bei. Der Host sieht sie daher in der Liste der Vortragenden unter ihrem presenterName und steuert sie wie alle anderen Vortragenden: Der Operator kann ihre Klicks abschalten, sie entfernen oder sie sperren.

  • Verbinden Sie sich mit einem Session-Token (?token=, einem Header Authorization: Bearer oder dem Cookie session_token). Team-API-Schlüssel funktionieren nur an den REST-Endpunkten, nicht auf diesem Socket.
  • Der Plan des Raumbesitzers muss die Client API enthalten: über das API-Add-on bei Presenter, Studio HD und Studio 4K, inklusive bei Studio 8K und Enterprise.
  • Folien- und Timer-Befehle werden nur ausgeführt, solange der Host Klicks von Ihrer Verbindung zulässt.

Dem Raum beitreten

{ "type": "joinRoom", "payload": { "room": "ABC123", "presenterName": "Show control", "api": true } }
  • Senden Sie dies nach dem Ereignis connected: Der Server lehnt alles ab, was davor eintrifft.
  • presenterName ist der Name, den der Host sieht (Standard API). Ihre App ist im Raum immer ein Vortragender, nie der Host.
  • Warten Sie auf ein Ereignis clicksEnabled mit dem Payload true, bevor Sie Befehle senden. Der Host sendet es, sobald er Ihre Verbindung eingerichtet hat, und erneut, wann immer der Operator Ihre Klicks ein- oder ausschaltet.
  • Bewahren Sie den presenterKey aus joinedRoom auf und senden Sie ihn bei einer erneuten Verbindung in joinRoom mit, damit der Host Ihre Klickberechtigung beibehält.
  • Senden Sie alle 15 Sekunden den Text-Frame ping, um die Verbindung offen zu halten. Der Server antwortet mit dem Text-Frame pong (kein JSON).

Befehle senden

{ "type": "webAction", "payload": { "action": "goto", "slide": 5, "id": "a3" } }
actionZusatzfeldFunktion
nextNächste Folie (oder nächster Animationsschritt)
prevVorherige Folie (oder vorheriger Animationsschritt)
firstErste Folie
lastLetzte Folie
gotoslide: ganze Zahl von 1 bis 9999Zu dieser Folie springen
blackouton: true oder falseBildschirm schwarz schalten oder wieder anzeigen
  • id ist optional: 1 bis 64 Buchstaben, Ziffern, _, ., : oder -. Sie wird im Ergebnis zurückgegeben. Verwenden Sie für jeden Befehl eine neue id: Der Host verwirft einen Befehl, dessen id er in den letzten 5 Sekunden bereits von Ihrer Verbindung erhalten hat, sodass eine Wiederholung desselben Befehls nur einmal ausgeführt wird.
  • first, last, goto und blackout werden nur auf einem Host ausgeführt, dessen letztes controls-Ereignis sie in nav aufführt. Ein Host, der kein controls-Ereignis sendet, unterstützt nur next und prev. Sind mehrere Hosts im Raum, führt jeder Host die Befehle aus, die er unterstützt.
  • next oder prev bei schwarzem Bildschirm zeigt ihn wieder an, ohne die Folie zu wechseln.
  • Ein goto über die letzte Folie hinaus wird ignoriert.
  • Senden Sie höchstens 10 Befehle pro Sekunde, Folien- und Timer-Befehle zusammengerechnet. Der Host verwirft außerdem eine Wiederholung desselben Befehls innerhalb von 50 Millisekunden.

Was die einzelnen Präsentations-Apps derzeit unterstützen:

Präsentations-Appnext, prevfirst, lastgotoblackout
PowerPoint unter WindowsJaJaJaJa
PowerPoint auf dem MacJaJaNeinNein
KeynoteJaNeinNeinJa
Google Slides (mit verbundener Browsererweiterung)JaJaNeinNein
vMixJaNeinNeinNein
Fenster im FokusJaNeinNeinNein

Das Ereignis controls liefert die aktuelle Antwort für den Host, den Sie steuern: Lesen Sie nav daraus und nicht aus dieser Tabelle.

# One connection: wait for `connected`, join as an API client, give the host a
# moment to set it up, then send commands. Replies print as they arrive.
( sleep 2
  echo '{"type":"joinRoom","payload":{"room":"ABC123","presenterName":"Show control","api":true}}'
  sleep 3
  echo '{"type":"webAction","payload":{"action":"next","id":"a1"}}'
  sleep 1
  echo '{"type":"webAction","payload":{"action":"prev","id":"a2"}}'
  sleep 1 ) | websocat "$WS_URL/ws?token=YOUR_SESSION_TOKEN"

Ergebnisse und Ereignisse

Jeder Befehl wird mit einem webActionResult oder einem error beantwortet.

{ "type": "webActionResult", "payload": { "action": "next", "id": "a1", "hosts": 1 } }

hosts ist die Anzahl der Hosts, an die der Befehl zugestellt wurde. Den Nachweis, dass er ausgeführt wurde, liefert das nächste slide-Ereignis des Hosts; blackout ändert außerdem blackout im nächsten controls-Ereignis des Hosts. Ein Befehl, den der Host nicht ausführt (Klicks abgeschaltet, ein nicht unterstützter Befehl, ein goto über die letzte Folie hinaus), erhält ein Ergebnis, aber kein slide-Ereignis.

errorWann
auth_requiredjoinRoom mit api: true auf einer Verbindung ohne Session-Token
not_api_clientEin Befehl von einer Verbindung, die keinem Raum mit api: true beigetreten ist oder ihn bereits verlassen hat
invalid_web_actionUnbekannte action oder fehlender bzw. ungültiger Wert für slide, on oder id
invalid_timer_actionUnbekannte Timer-action oder fehlender bzw. ungültiger Wert für minutes oder id
invalid_messageEine Nachricht ohne text oder mit mehr als 1000 Zeichen
invalid_presenter_mouseEine Zeigerposition außerhalb von 0 bis 1
rate_limitedMehr als 10 Folien- und Timer-Befehle in einer Sekunde oder mehr als 5 Nachrichten in 10 Sekunden
no_hostMit dem Raum ist kein Host verbunden
host_update_requiredJeder Host im Raum nutzt eine ältere Cliqer-Version, die keine Befehle von der API annehmen kann
api_not_in_planDer Plan des Raumbesitzers enthält die Client API nicht

Fehler enthalten eine lesbare message und, sofern der Befehl wohlgeformt war, dessen action und id:

{ "type": "error", "error": "invalid_web_action", "payload": { "message": "Unknown or incomplete webAction. Use next, prev, first, last, goto with slide, or blackout with on.", "action": "goto", "id": "a3" } }

Ereignisse eines Hosts enthalten dessen ID in hostId:

EreignisPayload
clicksEnabledtrue, wenn der Host Ihre Befehle annimmt, false, wenn der Operator Ihre Klicks abgeschaltet hat
controls{ app, nav, blackout, timer }: die Präsentations-App, die zusätzlichen Folienbefehle, die sie unterstützt (first, last, goto, blackout), ob der Bildschirm schwarz ist und ob der Host Timer-Befehle annimmt
slide{ number, current, total, title, notes } nach jedem Befehl, den der Host ausgeführt hat (number ist "4/12", total ist null, wenn die App den Wert nicht meldet), oder null, wenn beim Host keine Präsentation geöffnet ist
countdownDie Zeit, die der Timer des Hosts anzeigt, etwa "4:59" ("-0:12" bei Überziehung), jede Sekunde, solange er läuft, oder null, wenn er stoppt
countdownPhase{ phase, blink }: phase ist idle, talk, warning (weniger als eine Minute übrig), overtime oder paused, und blink gibt an, ob der Timer des Hosts blinkt
messageFromHostEine Antwort des Operators am Host, siehe Nachrichten an den Host

Sie erhalten außerdem die Ereignisse des Raums selbst (clientJoined, clientLeft und weitere); ignorieren Sie die, die Sie nicht verwenden. Wenn der Operator Ihre Verbindung entfernt oder sperrt, erhalten Sie logout mit reason: "kicked".

Timer

Bedienen Sie den Timer in der Cliqer-App des Hosts mit denselben Befehlen, die ein Stream Deck oder Bitfocus Companion sendet.

{ "type": "timerAction", "payload": { "action": "set", "minutes": 25, "id": "t1" } }
actionFunktion
startTimer starten oder nach stop fortsetzen
stopTimer pausieren
resetTimer stoppen und auf die eingestellte Zeit zurücksetzen
plus1, plus2, plus51, 2 oder 5 Minuten hinzufügen
minus1, minus2, minus51, 2 oder 5 Minuten abziehen
preset5, preset10, preset15, preset20Timer stoppen und 5, 10, 15 oder 20 Minuten einstellen
setTimer stoppen und minutes einstellen, eine ganze Zahl von 1 bis 999
  • Jeder Befehl wird mit einem timerActionResult ({ action, id, hosts }, hosts wie bei Folien) oder einem error beantwortet. Den Nachweis, dass er ausgeführt wurde, liefert das nächste countdown- oder countdownPhase-Ereignis des Hosts.
  • Der Timer läuft nur auf einem Host, dessen letztes controls-Ereignis timer: true enthält. Hosts mit einer älteren Cliqer-Version melden dies nicht und ignorieren Timer-Befehle.
  • Für Timer-Befehle gelten dieselben Regeln wie für Folienbefehle: Der Host führt sie nur aus, solange er Klicks von Ihrer Verbindung zulässt, und sie teilen sich das Kontingent von 10 Befehlen pro Sekunde.
  • Die Timer-Einstellungen des Hosts gelten unverändert: Ein Timer, der auf Hochzählen eingestellt ist, zählt hoch, und ein Timer, der einem verbundenen Hardware-Timer folgt, übernimmt seine Zeit von diesem Gerät.

Laserpointer

Zeigen Sie einen Laserpunkt auf dem geteilten Bildschirm des Hosts an, so wie es das Smartphone eines Vortragenden tut.

{ "type": "presenterMouse", "payload": { "mouse": { "x": 0.5, "y": 0.25 } } }
  • x und y geben die Position auf dem geteilten Bildschirm an, gemessen von der oberen linken Ecke, von 0 bis 1.
  • Senden Sie { "pressed": false } als Payload, um den Punkt auszublenden. Andernfalls verschwindet er 30 bis 90 Sekunden nach Ihrer letzten Position.
  • Der Punkt erscheint nur, solange der Host einen Bildschirm teilt und Laserpointer eingeschaltet hat. Seine Farbe richtet sich nach Ihrem presenterName.
  • Senden Sie höchstens 30 Positionen pro Sekunde. Überzählige Positionen werden ohne Fehler verworfen, und es gibt kein Ergebnisereignis.

Nachrichten an den Host

Senden Sie dem Operator am Host eine Nachricht. Sie erscheint im Vortragenden-Chat des Hosts, genau wie eine Nachricht vom Smartphone eines Vortragenden, und die Antworten des Operators kommen als messageFromHost zurück.

# Join as an API client, then send a message. Replies print as they arrive.
( sleep 2
  echo '{"type":"joinRoom","payload":{"room":"ABC123","presenterName":"Show control","api":true}}'
  sleep 3
  echo '{"type":"messageToHosts","payload":{"text":"Two minutes to the break","id":"m1"}}'
  sleep 30 ) | websocat "$WS_URL/ws?token=YOUR_SESSION_TOKEN"

Antwort des Hosts:

{
  "type": "messageFromHost",
  "payload": {
    "fromClientId": "host_abc123",
    "fromPresenterName": "Stage PC",
    "originalPayload": { "text": "Thanks, got it" }
  },
  "hostId": "host_abc123"
}
  • text umfasst 1 bis 1000 Zeichen. Senden Sie höchstens 5 Nachrichten alle 10 Sekunden.
  • Jede Nachricht wird mit einem messageToHostsResult ({ id, hosts }) oder einem error beantwortet.
  • Der Operator sieht die Nachricht unter Ihrem presenterName, und der Host zeigt eine Benachrichtigung an, wenn seine Einstellung Benachrichtigungen aktiviert ist.

Ereignisreferenz

Ausgehende Ereignisse (Client → Server)

EreignisBeschreibung
joinRoomEinem Raum als API-Client mit api: true beitreten (siehe Foliensteuerung)
webActionFoliensteuerung (siehe Foliensteuerung)
timerActionTimer-Steuerung (siehe Timer)
presenterMousePosition des Laserpointers (siehe Laserpointer)
messageToHostsEine Nachricht an den Operator am Host senden (siehe Nachrichten an den Host)
logoutDen Raum verlassen; die Verbindung bleibt offen und kann erneut beitreten

Eingehende Ereignisse (Server → Client)

EreignisBeschreibung
connectedWird beim Öffnen mit { clientId, userId, isAuthenticated } gesendet
joinedRoomDem Raum erfolgreich beigetreten
clientJoinedJemand ist dem Raum beigetreten
clientLeftJemand hat den Raum verlassen
webActionResultEine webAction wurde an die Hosts des Raums zugestellt
timerActionResultEine timerAction wurde an die Hosts des Raums zugestellt
messageToHostsResultEine messageToHosts-Nachricht wurde an die Hosts des Raums zugestellt
clicksEnabledOb ein Host Ihre Befehle annimmt
controlsWas die Präsentations-App und der Timer eines Hosts unterstützen
slideDie aktuelle Folie eines Hosts nach einem Befehl
countdownDie Zeit auf dem Timer eines Hosts
countdownPhaseDie Phase des Timers eines Hosts
messageFromHostEine Nachricht vom Operator am Host
logoutDer Operator hat Ihre Verbindung entfernt oder gesperrt (reason: "kicked")
errorFehlermeldung