Webhooks – Echtzeit-Ereignisse
BigBlueButton-Webhooks ermöglichen Ihrer Anwendung, HTTP-POST-Benachrichtigungen in Echtzeit zu empfangen, sobald Meeting-Ereignisse auftreten. Anstatt wiederholt getMeetings oder getMeetingInfo abzufragen, registrieren Sie eine Callback-URL und BigBlueButton pusht die Ereignisse automatisch an Sie. Dieses Kapitel behandelt die drei Webhook-API-Endpunkte, das Callback-Format, Ereignistypen, Wiederholungsverhalten und die Serverkonfiguration.
Webhooks erfordern, dass das Paket bbb-webhooks auf dem Server installiert ist. Mehrere in diesem Kapitel beschriebene Details werden in der offiziellen BigBlueButton-Dokumentation nicht behandelt und wurden durch Quellcodeanalyse ermittelt. undocumented
Voraussetzungen
Das Paket bbb-webhooks muss auf dem BigBlueButton-Server installiert sein, bevor Webhook-Endpunkte verfügbar werden:
sudo apt-get install bbb-webhooks Wenn die Webhook-Anwendung nicht läuft, wenn ein Meeting erstellt wird, wird keine interne Meeting-Zuordnung eingerichtet. Infolgedessen werden für dieses Meeting keine Callbacks ausgelöst.
hooks/create — Einen Webhook registrieren
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/create?<parameters>&checksum=replace-with-checksum Die offizielle Dokumentation gibt keine HTTP-Methode an. Der Express-Router registriert nur GET-Routen — POST-Anfragen werden nicht akzeptiert. undocumented
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
callbackURL | String | Ja | — | Die URL, die POST-Callbacks empfangen wird. Die Duplikaterkennung basiert ausschließlich auf dieser URL — dieselbe URL kann nicht zweimal registriert werden, auch nicht mit einem anderen meetingID oder eventID. |
meetingID | String | Nein | — | Beschränkt den Hook auf ein bestimmtes Meeting (externe Meeting-ID). Wenn weggelassen, wird der Hook zu einem globalen Hook, der für alle Meetings ausgelöst wird. |
eventID | String | Nein | — | Kommagetrennte Liste von Ereignistypen, auf die gehört werden soll (z. B. user-joined,meeting-ended). Wenn weggelassen, werden alle Ereignisse zugestellt. Der Filter ist nicht case-sensitiv. Verfügbar seit BBB 2.5. |
getRaw | Boolean | Nein | false | Wenn auf true gesetzt, enthalten Callbacks die rohe Redis-Nachricht statt der verarbeiteten Ereignisdaten. |
Erfolgreiche Antwort
<response>
<returncode>SUCCESS</returncode>
<hookID>replace-with-hook-id</hookID>
<permanentHook>false</permanentHook>
<rawData>false</rawData>
</response> Doppelte Registrierung
Wenn dieselbe callbackURL erneut registriert wird, gibt die Antwort weiterhin SUCCESS zurück, enthält jedoch eine duplicateWarning. Der vorhandene Hook bleibt unverändert — meetingID, eventID und getRaw werden nicht aktualisiert.
<response>
<returncode>SUCCESS</returncode>
<hookID>replace-with-hook-id</hookID>
<messageKey>duplicateWarning</messageKey>
<message>There is already a hook for this callback URL.</message>
</response> Fehlerantworten
messageKey | Beschreibung |
|---|---|
checksumError | Die Checksum ist ungültig oder fehlt. |
missingParamCallbackURL | Der Parameter callbackURL wurde nicht angegeben. undocumented |
createHookError | Es ist ein interner Fehler aufgetreten (z. B. Redis nicht erreichbar). Prüfen Sie die Server-Logs. |
hooks/list — Registrierte Webhooks auflisten
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/list?<parameters>&checksum=replace-with-checksum | Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
meetingID | String | Nein | Filtert nach Meeting-ID. Das Ergebnis enthält sowohl Hooks für das angegebene Meeting als auch alle globalen Hooks. Wenn weggelassen, werden alle registrierten Hooks zurückgegeben. |
Erfolgreiche Antwort
<response>
<returncode>SUCCESS</returncode>
<hooks>
<hook>
<hookID>replace-with-hook-id</hookID>
<callbackURL><![CDATA[https://api-guide.bbbserver.com/callbacks/webhook]]></callbackURL>
<meetingID><![CDATA[replace-with-meeting-id]]></meetingID>
<eventID>user-joined,meeting-ended</eventID>
<permanentHook>false</permanentHook>
<rawData>false</rawData>
</hook>
</hooks>
</response> Das Element <meetingID> erscheint nur bei Meeting-spezifischen Hooks. Globale Hooks haben kein Element <meetingID>. Ebenso erscheint <eventID> nur, wenn bei der Erstellung ein Ereignisfilter gesetzt wurde.
Fehlerantworten
messageKey | Beschreibung |
|---|---|
checksumError | Die Checksum ist ungültig oder fehlt. |
listHookError | Beim Auflisten der Hooks ist ein interner Fehler aufgetreten. Prüfen Sie die Server-Logs. undocumented |
hooks/destroy — Einen Webhook entfernen
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/destroy?<parameters>&checksum=replace-with-checksum | Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
hookID | String | Ja | Die ID des zu entfernenden Hooks (erhalten von hooks/create oder hooks/list). |
Erfolgreiche Antwort
<response>
<returncode>SUCCESS</returncode>
<removed>true</removed>
</response> Permanente Hooks (serverseitig über permanentURLs konfiguriert) können nicht über die API gelöscht werden. Ein entsprechender Versuch liefert einen Fehler destroyMissingHook zurück, als ob der Hook nicht existieren würde.
Fehlerantworten
messageKey | Beschreibung |
|---|---|
checksumError | Die Checksum ist ungültig oder fehlt. |
missingParamHookID | Der Parameter hookID wurde nicht angegeben. |
destroyMissingHook | Die Hook-ID existiert nicht oder gehört zu einem permanenten Hook. |
destroyHookError | Beim Entfernen des Hooks ist ein interner Fehler aufgetreten. Prüfen Sie die Server-Logs. |
hooks/ping — Health-Check
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/ping Dieser Diagnose-Endpunkt benötigt keine Prüfsumme. Wenn die Webhook-Anwendung erreichbar ist, gibt er die Klartext-Zeichenfolge bbb-webhooks API up! zurück (nicht XML, Content-Type text/plain). undocumented
Callback-Format
Webhook-Callbacks werden als HTTP-POST-Anfragen mit dem Content-Type application/x-www-form-urlencoded gesendet. Der Request-Body enthält drei Felder:
| Feld | Beschreibung |
|---|---|
domain | Die Server-Domain (aus der Webhook-Konfiguration). undocumented |
event | Ein JSON-Array, das die Ereignisdaten enthält. Immer ein Array, auch bei nur einem einzelnen Ereignis. |
timestamp | Ein Unix-Zeitstempel in Millisekunden zum Zeitpunkt des Versands. |
Verarbeiteter Callback-Body (getRaw=false)
domain=myserver.com&event=[{"data":{"type":"event","id":"user-joined","attributes":{...},"event":{"ts":1532718316938}}}]×tamp=1532718316953 Roher Callback-Body (getRaw=true)
domain=myserver.com&event=[{"envelope":{"name":"UserJoinedMeetingEvtMsg","routing":{"sender":"bbb-apps-akka"}},"core":{"header":{...},"body":{...}}}]×tamp=1532718316953 Wenn der Server mit einem Wert für multiEvent größer als 1 konfiguriert ist, können mehrere Ereignisse im Array event innerhalb eines einzelnen Callbacks gebündelt werden.
Validierung der Callback-Prüfsumme
Im Standardmodus erhält jede Callback-URL einen Query-Parameter checksum, den Ihre Anwendung überprüfen sollte:
https://api-guide.bbbserver.com/callbacks/webhook?checksum=replace-with-checksum Die Validierungsformel lautet:
sha<algo>(<callback-URL-without-checksum> + <URL-encoded-body> + <shared-secret>) Nehmen Sie die registrierte Callback-URL ohne den Prüfsummen-Parameter.
Hängen Sie den vollständig URL-kodierten Request-Body (domain=...&event=[...]×tamp=...) an.
Hängen Sie das BBB Shared Secret an.
Hashen Sie die resultierende Zeichenfolge mit dem konfigurierten Algorithmus (Standard: sha1, konfigurierbar über hookChecksumAlgorithm).
Auth 2.0 / Bearer-Modus
Alternativ kann der Server mit auth2_0: true konfiguriert werden. In diesem Modus wird kein Checksum-Parameter an die Callback-URL angehängt. Stattdessen wird das Shared Secret als Bearer-Token im Header Authorization gesendet: undocumented
Authorization: Bearer <shared-secret> Callback-Verhalten
- Akzeptierte HTTP-Statuscodes: HTTP
2xxund HTTP401werden als erfolgreiche Zustellung behandelt. Alle anderen Statuscodes lösen einen Wiederholungsversuch aus. undocumented - Weiterleitungen: HTTP-
3xx-Antworten wird gefolgt (bis zu 10 Sprünge). Erst wenn nach 10 Weiterleitungen kein2xx/401erreicht wird, gilt der Callback als fehlgeschlagen. - Timeout: Jede Callback-Anfrage hat ein Timeout von 5 Sekunden (konfigurierbar über
requestTimeout). - Wiederholungsintervalle: Bei einem Fehler verwenden Wiederholungen exponentielles Back-off:
100ms, 500ms, 1s, 2s, 4s, 8s, 10s, 30s, 60s, 60s, 60s, 60s(12 Versuche über ungefähr 5 Minuten, konfigurierbar überretryIntervals). - Nachdem alle Wiederholungen ausgeschöpft sind: Nicht permanente Hooks werden automatisch entfernt. Permanente Hooks versuchen die Zustellung weiterhin unbegrenzt in 60-Sekunden-Intervallen (konfigurierbar über
permanentIntervalReset).
Ereignistypen
Meeting-Ereignisse
| Ereignis-ID | Beschreibung |
|---|---|
meeting-created | Ein Meeting wurde erstellt. |
meeting-ended | Ein Meeting wurde beendet. Dies löst außerdem synthetische user-left-Ereignisse für alle verbundenen Benutzer aus. |
meeting-recording-started | Die Aufzeichnung wurde gestartet. |
meeting-recording-stopped | Die Aufzeichnung wurde gestoppt. |
meeting-recording-unhandled | Nicht behandeltes Recording-Ereignis (Fallback, wenn der Recording-Status weder true noch false ist). |
meeting-screenshare-started | Die Bildschirmfreigabe wurde gestartet (einschließlich Presenter-Benutzerdaten). |
meeting-screenshare-stopped | Die Bildschirmfreigabe wurde beendet (einschließlich Eigentümer-Benutzerdaten). |
meeting-presentation-changed | Die aktive Präsentation wurde geändert (einschließlich presentation-id). |
Benutzerereignisse
| Ereignis-ID | Beschreibung |
|---|---|
user-joined | Ein Benutzer ist dem Meeting beigetreten (enthält Gast-Flag, Benutzerdaten, IP-Adresse, User-Agent). |
user-left | Ein Benutzer hat das Meeting verlassen (einschließlich Gast-Flag). Wird auch bei meeting-ended synthetisch erzeugt. |
user-audio-voice-enabled | Audio aktiviert (enthält listening-only-, sharing-mic-, muted-Flags). |
user-audio-voice-disabled | Audio deaktiviert. |
user-audio-muted | Benutzer wurde stummgeschaltet. |
user-audio-unmuted | Stummschaltung des Benutzers wurde aufgehoben. |
user-audio-unhandled | Nicht behandeltes Audioereignis (Fallback). |
user-cam-broadcast-start | Webcam gestartet (enthält stream-id). |
user-cam-broadcast-end | Webcam gestoppt. |
user-presenter-assigned | Benutzer wurde die Präsentatorrolle zugewiesen. |
user-presenter-unassigned | Benutzer wurde aus der Präsentatorrolle entfernt. |
user-emoji-changed | Benutzer-Emoji oder -Reaktion geändert (einschließlich Emoji-Wert). |
user-raise-hand-changed | Benutzer hat die Hand gehoben oder gesenkt (enthält raise-hand-Boolean). In BBB-Versionen vor 2.7 wird dies synthetisch aus user-emoji-changed erzeugt. |
Chat- und Notizereignisse
| Ereignis-ID | Beschreibung |
|---|---|
chat-group-message-sent | Eine Nachricht wurde im öffentlichen Chat gesendet. Private Chat-Nachrichten erzeugen keine Webhook-Ereignisse. |
transcript-updated | Transkription aktualisiert (enthält transcript, locale, final-Flag). |
pad-content | Inhalt der geteilten Notizen geändert (enthält pad-id, rev, text). |
Umfrageereignisse
| Ereignis-ID | Beschreibung |
|---|---|
poll-started | Eine Umfrage wurde gestartet (einschließlich Frage und Antwortoptionen). |
poll-responded | Ein Teilnehmer hat auf eine Umfrage geantwortet (einschließlich Antwort-IDs). |
Aufnahme- und Wiedergabeereignisse (RAP)
| Ereignis-ID | Beschreibung |
|---|---|
rap-archive-started | Archivierung gestartet. |
rap-archive-ended | Archivierung abgeschlossen (enthält recorded-Flag und Dauer). |
rap-sanity-started | Integritätsprüfung gestartet. |
rap-sanity-ended | Integritätsprüfung abgeschlossen. |
rap-post-archive-started | Nacharchivierung gestartet. |
rap-post-archive-ended | Nacharchivierung abgeschlossen. |
rap-process-started | Verarbeitung gestartet. |
rap-process-ended | Verarbeitung abgeschlossen. |
rap-post-process-started | Nachverarbeitung gestartet. |
rap-post-process-ended | Nachverarbeitung abgeschlossen. |
rap-publish-started | Veröffentlichung gestartet. |
rap-publish-ended | Veröffentlichung abgeschlossen (einschließlich vollständigem Aufnahmeobjekt mit Metadaten, Wiedergabe- und Download-Informationen). |
rap-post-publish-started | Nachveröffentlichung gestartet. |
rap-post-publish-ended | Nachveröffentlichung abgeschlossen. |
rap-published | Aufnahme veröffentlicht. |
rap-unpublished | Veröffentlichung der Aufnahme aufgehoben. |
rap-deleted | Aufnahme gelöscht. |
Die meisten RAP-Ereignisse enthalten record-id, success (Boolean) und step-time. Ereignisse mit einem workflow-Feld enthalten zusätzlich den Namen des Verarbeitungs-Workflows.
Serverkonfiguration
Die folgenden Optionen können in /etc/bigbluebutton/bbb-webhooks.yml oder config/default.yml konfiguriert werden. Die meisten dieser Optionen werden in der offiziellen Dokumentation nicht behandelt. undocumented
| Option | Standard | Beschreibung |
|---|---|---|
hookChecksumAlgorithm | sha1 | Hash-Algorithmus für Callback-Checksummen (sha1, sha256, sha384, sha512). |
api.supportedChecksumAlgorithms | [sha1, sha256, sha384, sha512] | Akzeptierte Algorithmen für eingehende API-Prüfsummen. |
api.port | 3005 | Port des Webhook-API-Servers. |
api.bind | 127.0.0.1 | Bind-Adresse des API-Servers. |
includeEvents | [] | Serverweiter Ereignisfilter: Nur diese Ereignisse werden an alle Hooks ausgeliefert. Leer bedeutet alle Ereignisse. |
excludeEvents | [] | Serverweiter Ereignisfilter: Diese Ereignisse werden für alle Hooks unterdrückt. Leer bedeutet keine Ausschlüsse. |
permanentURLs | [] | Liste permanenter Hook-URLs, die beim Start registriert werden und nicht über die API entfernt werden können. |
retryIntervals | [100,500,1000,...,60000] | Wiederholungsintervalle in Millisekunden für fehlgeschlagene Callbacks. |
permanentIntervalReset | 60000 | Wiederholungsintervall in Millisekunden für permanente Hooks, nachdem alle regulären Wiederholungen ausgeschöpft sind. |
requestTimeout | 5000 | HTTP-Timeout in Millisekunden für Callback-Anfragen. |
multiEvent | 1 | Wenn auf einen Wert größer als 1 gesetzt, werden mehrere Ereignisse pro Callback im Ereignis-Array gebündelt. |
queueSize | 10000 | Maximale Größe der internen Ereigniswarteschlange. |
bbb.auth2_0 | false | Aktiviert Bearer-Token-Authentifizierung statt URL-Checksum für Callbacks. |
includeEvents und excludeEvents sind serverweite Filter, die zusätzlich zum pro Hook definierten eventID-Filter gelten. Ein Ereignis muss beide Filter bestehen, um zugestellt zu werden.
Betriebshinweise
- Persistenz: Hooks werden in Redis gespeichert und überstehen Server-Neustarts (beim Start erneut synchronisiert).
- Reihenfolge: Callbacks werden pro Hook nacheinander gesendet, jeweils einer nach dem anderen, wobei die Ereignisreihenfolge erhalten bleibt.
- URL-Eindeutigkeit: Die Duplikaterkennung basiert ausschließlich auf der Callback-URL. Dieselbe URL kann nicht mit unterschiedlichen
meetingID- odereventID-Filtern registriert werden — die erste Registrierung gewinnt. - Datenbereinigung: Interne Meeting-Zuordnungen werden nach einer Woche Inaktivität entfernt (konfigurierbar über
mappings.timeout, Standard: 604800000 ms). - Synthetische Ereignisse: Wenn ein Meeting endet, werden
user-left-Ereignisse automatisch für alle noch verbundenen Benutzer erzeugt, weil BigBlueButton selbst bei Meeting-Ende keineUserLeftMeetingEvtMsgausgibt. - Private Chats: Nur öffentliche Chatnachrichten erzeugen
chat-group-message-sent-Ereignisse. Private Nachrichten werden stillschweigend ignoriert.
meetingID erforderlich — globale Hooks ohne meetingID werden nicht unterstützt; (2) personenbezogene Daten in Ereignissen werden aus Datenschutzgründen automatisch verschleiert (z. B. sind IP-Adressen von Teilnehmern nicht sichtbar).Häufig gestellte Fragen
bbb-webhooks muss über apt-get install bbb-webhooks installiert werden. Ohne dieses sind die Endpunkte hooks/create, hooks/list und hooks/destroy nicht verfügbar.duplicateWarning und der bestehende Hook bleibt unverändert. Um bestimmte Meetings getrennt zu überwachen, verwenden Sie unterschiedliche Callback-URLs.MAIN-PUBLIC-GROUP-CHAT) gesendet werden, lösen ein Ereignis chat-group-message-sent aus. Private Nachrichten zwischen Teilnehmern erzeugen keine Webhook-Ereignisse.getRaw=false (dem Standard) erhalten Sie verarbeitete Ereignisdaten mit einer standardisierten Struktur, die die Felder type, id und attributes enthält. Mit getRaw=true erhalten Sie die rohe Redis-Nachricht, wie sie intern von BigBlueButton veröffentlicht wird, einschließlich der Felder envelope und core. Das Rohformat ist nützlich für Debugging oder wenn Sie Daten benötigen, die im verarbeiteten Format nicht enthalten sind.permanentURLs konfiguriert und können nicht über die API entfernt werden. Ein Aufruf von hooks/destroy für einen permanenten Hook gibt einen Fehler destroyMissingHook zurück, als ob der Hook nicht existieren würde.2xx und HTTP 401 werden beide als erfolgreiche Zustellung behandelt. Alle anderen Statuscodes, einschließlich 3xx (nach bis zu 10 Weiterleitungen), 4xx (außer 401) und 5xx, lösen einen Wiederholungsversuch aus. Dieses Verhalten ist in der offiziellen BigBlueButton-Dokumentation nicht dokumentiert.