Webhooks – Hændelser i realtid
BigBlueButton Webhooks lader din applikation modtage HTTP POST-notifikationer i realtid, hver gang mødehændelser opstår. I stedet for gentagne gange at polle getMeetings eller getMeetingInfo registrerer du en callback-URL, og BigBlueButton sender automatisk hændelser til dig. Dette kapitel dækker de tre webhook-API-endpoints, callback-formatet, hændelsestyper, retry-adfærd og serverkonfiguration.
Webhooks kræver, at pakken bbb-webhooks er installeret på serveren. Flere detaljer beskrevet i dette kapitel er ikke dækket af den officielle BigBlueButton-dokumentation og er blevet fastslået gennem kildekodeanalyse. undocumented
Forudsætninger
Pakken bbb-webhooks skal være installeret på BigBlueButton-serveren, før webhook-endpoints bliver tilgængelige:
sudo apt-get install bbb-webhooks Hvis webhook-applikationen ikke kører, når et møde oprettes, etableres der ingen intern mødekobling. Som resultat vil der ikke blive udløst nogen callbacks for det møde.
hooks/create — registrér en webhook
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/create?<parameters>&checksum=replace-with-checksum Den officielle dokumentation angiver ikke en HTTP-metode. Express-routeren registrerer kun GET-routes — POST-requests accepteres ikke. undocumented
| Parameter | Type | Påkrævet | Standard | Beskrivelse |
|---|---|---|---|---|
callbackURL | String | Ja | — | Den URL, der vil modtage POST-callbacks. Dubletdetektion er udelukkende baseret på denne URL — den samme URL kan ikke registreres to gange, selv ikke med en anden meetingID eller eventID. |
meetingID | String | Nej | — | Begrænser hooket til et bestemt møde (ekstern møde-ID). Hvis den udelades, bliver hooket et globalt hook, der udløses for alle møder. |
eventID | String | Nej | — | Kommasepareret liste over hændelsestyper, der skal lyttes efter (f.eks. user-joined,meeting-ended). Hvis den udelades, leveres alle hændelser. Filteret er ikke følsomt over for store/små bogstaver. Tilgængelig siden BBB 2.5. |
getRaw | Boolean | Nej | false | Når sat til true, indeholder callbacks den rå Redis-meddelelse i stedet for de behandlede hændelsesdata. |
Vellykket svar
<response>
<returncode>SUCCESS</returncode>
<hookID>replace-with-hook-id</hookID>
<permanentHook>false</permanentHook>
<rawData>false</rawData>
</response> Dubletregistrering
Hvis den samme callbackURL registreres igen, returnerer svaret stadig SUCCESS, men inkluderer en duplicateWarning. Det eksisterende hook bevares uændret — meetingID, eventID og getRaw opdateres ikke.
<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> Fejlsvar
messageKey | Beskrivelse |
|---|---|
checksumError | Checksum er ugyldig eller mangler. |
missingParamCallbackURL | Parameteren callbackURL blev ikke angivet. undocumented |
createHookError | Der opstod en intern fejl (f.eks. Redis utilgængelig). Tjek serverloggene. |
hooks/list — vis registrerede webhooks
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/list?<parameters>&checksum=replace-with-checksum | Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
meetingID | String | Nej | Filtrerer efter møde-ID. Resultatet omfatter både hooks for det angivne møde og alle globale hooks. Hvis det udelades, returneres alle registrerede hooks. |
Vellykket svar
<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> <meetingID>-elementet vises kun for mødespecifikke hooks. Globale hooks har intet <meetingID>-element. Tilsvarende vises <eventID> kun, når et hændelsesfilter blev sat under oprettelsen.
Fejlsvar
messageKey | Beskrivelse |
|---|---|
checksumError | Checksum er ugyldig eller mangler. |
listHookError | Der opstod en intern fejl under visning af hooks. Tjek serverloggene. undocumented |
hooks/destroy — fjern en webhook
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/destroy?<parameters>&checksum=replace-with-checksum | Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
hookID | String | Ja | ID'et for det hook, der skal fjernes (hentet fra hooks/create eller hooks/list). |
Vellykket svar
<response>
<returncode>SUCCESS</returncode>
<removed>true</removed>
</response> Permanente hooks (konfigureret på serversiden via permanentURLs) kan ikke slettes gennem API'et. Forsøg på at gøre det returnerer en destroyMissingHook-fejl, som om hooket ikke findes.
Fejlsvar
messageKey | Beskrivelse |
|---|---|
checksumError | Checksum er ugyldig eller mangler. |
missingParamHookID | Parameteren hookID blev ikke angivet. |
destroyMissingHook | Hook-ID'et findes ikke eller tilhører et permanent hook. |
destroyHookError | Der opstod en intern fejl under fjernelse af hooket. Tjek serverloggene. |
hooks/ping — health check
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/ping Dette diagnostiske endpoint kræver ingen checksum. Hvis webhook-applikationen kan nås, returnerer det klartekststrengen bbb-webhooks API up! (ikke XML, indholdstype text/plain). undocumented
Callback-format
Webhook-callbacks sendes som HTTP POST-anmodninger med indholdstypen application/x-www-form-urlencoded. Anmodningens brødtekst indeholder tre felter:
| Felt | Beskrivelse |
|---|---|
domain | Serverdomænet (fra webhook-konfigurationen). undocumented |
event | Et JSON-array, der indeholder hændelsesdataene. Altid et array, selv for en enkelt hændelse. |
timestamp | Et Unix-tidsstempel i millisekunder på afsendelsestidspunktet. |
Behandlet callback-body (getRaw=false)
domain=myserver.com&event=[{"data":{"type":"event","id":"user-joined","attributes":{...},"event":{"ts":1532718316938}}}]×tamp=1532718316953 Rå callback-body (getRaw=true)
domain=myserver.com&event=[{"envelope":{"name":"UserJoinedMeetingEvtMsg","routing":{"sender":"bbb-apps-akka"}},"core":{"header":{...},"body":{...}}}]×tamp=1532718316953 Når serveren er konfigureret med multiEvent større end 1, kan flere hændelser samles i event-arrayet inden for et enkelt callback.
Validering af callback-checksum
I standardtilstand modtager hver callback-URL en query-parameter checksum, som din applikation bør verificere:
https://api-guide.bbbserver.com/callbacks/webhook?checksum=replace-with-checksum Valideringsformlen er:
sha<algo>(<callback-URL-without-checksum> + <URL-encoded-body> + <shared-secret>) Tag den registrerede callback-URL uden checksum-parameteren.
Tilføj den fulde URL-kodede anmodningsbrødtekst (domain=...&event=[...]×tamp=...).
Tilføj BBB shared secret.
Hash den resulterende streng med den konfigurerede algoritme (standard: sha1, kan konfigureres via hookChecksumAlgorithm).
Auth 2.0 / Bearer-tilstand
Alternativt kan serveren konfigureres med auth2_0: true. I denne tilstand føjes ingen checksum-parameter til callback-URL'en. I stedet sendes shared secret som en Bearer-token i headeren Authorization: undocumented
Authorization: Bearer <shared-secret> Callback-adfærd
- Accepterede HTTP-statuskoder: HTTP
2xxog HTTP401behandles som succesfuld levering. Alle andre statuskoder udløser et retry. undocumented - Redirects: HTTP
3xx-svar følges (op til 10 hop). Kun hvis ingen2xx/401nås efter 10 redirects, tæller callbacken som mislykket. - Timeout: Hver callback-anmodning har en timeout på 5 sekunder (kan konfigureres via
requestTimeout). - Genforsøgsintervaller: Ved fejl bruger genforsøg eksponentiel back-off:
100ms, 500ms, 1s, 2s, 4s, 8s, 10s, 30s, 60s, 60s, 60s, 60s(12 forsøg over cirka 5 minutter, kan konfigureres viaretryIntervals). - Når alle genforsøg er opbrugt: Ikke-permanente hooks fjernes automatisk. Permanente hooks fortsætter med at prøve igen på ubestemt tid med 60-sekunders intervaller (kan konfigureres via
permanentIntervalReset).
Hændelsestyper
Mødehændelser
| Hændelses-ID | Beskrivelse |
|---|---|
meeting-created | Et møde blev oprettet. |
meeting-ended | Et møde er afsluttet. Dette udløser også syntetiske user-left-hændelser for alle tilsluttede brugere. |
meeting-recording-started | Optagelse er startet. |
meeting-recording-stopped | Optagelse er stoppet. |
meeting-recording-unhandled | Ubehandlet optagelseshændelse (fallback når optagelsesstatus hverken er true eller false). |
meeting-screenshare-started | Skærmdeling startet (inkluderer præsentatordata for brugeren). |
meeting-screenshare-stopped | Skærmdeling stoppet (inkluderer ejerdatadata for brugeren). |
meeting-presentation-changed | Den aktive præsentation blev ændret (inkluderer presentation-id). |
Brugerhændelser
| Hændelses-ID | Beskrivelse |
|---|---|
user-joined | En bruger deltog i mødet (inkluderer gæsteflag, brugerdata, IP-adresse, User-Agent). |
user-left | En bruger forlod mødet (inkluderer gæsteflag). Genereres også syntetisk ved meeting-ended. |
user-audio-voice-enabled | Lyd aktiveret (inkluderer listening-only-, sharing-mic-, muted-flag). |
user-audio-voice-disabled | Lyd deaktiveret. |
user-audio-muted | Bruger blev slået fra lyden. |
user-audio-unmuted | Bruger fik lyden slået til igen. |
user-audio-unhandled | Uhåndteret lydbegivenhed (fallback). |
user-cam-broadcast-start | Webcam startet (inkluderer stream-id). |
user-cam-broadcast-end | Webkamera stoppet. |
user-presenter-assigned | Bruger blev tildelt præsentatørrollen. |
user-presenter-unassigned | Bruger blev fjernet fra præsentatørrollen. |
user-emoji-changed | Brugerens emoji eller reaktion blev ændret (inkluderer emoji-værdi). |
user-raise-hand-changed | Bruger rakte hånden op eller sænkede den igen (inkluderer raise-hand boolean). På BBB-versioner før 2.7 genereres dette syntetisk fra user-emoji-changed. |
Chat- og notehændelser
| Hændelses-ID | Beskrivelse |
|---|---|
chat-group-message-sent | Der blev sendt en besked i den offentlige chat. Private chatbeskeder genererer ikke webhook-hændelser. |
transcript-updated | Transskription opdateret (inkluderer transcript, locale, final-flag). |
pad-content | Indhold i delte noter ændret (inkluderer pad-id, rev, text). |
Afstemningshændelser
| Hændelses-ID | Beskrivelse |
|---|---|
poll-started | En afstemning blev startet (inkluderer spørgsmål og svarmuligheder). |
poll-responded | En deltager svarede på en afstemning (inkluderer svar-id'er). |
Optagelses- og afspilningshændelser (RAP)
| Hændelses-ID | Beskrivelse |
|---|---|
rap-archive-started | Arkivering startet. |
rap-archive-ended | Arkivering fuldført (inkluderer recorded-flag og varighed). |
rap-sanity-started | Integritetskontrol startet. |
rap-sanity-ended | Integritetskontrol fuldført. |
rap-post-archive-started | Efterarkivering startet. |
rap-post-archive-ended | Efterarkivering fuldført. |
rap-process-started | Behandling startet. |
rap-process-ended | Behandling fuldført. |
rap-post-process-started | Efterbehandling startet. |
rap-post-process-ended | Efterbehandling fuldført. |
rap-publish-started | Publicering startet. |
rap-publish-ended | Publicering fuldført (inkluderer komplet optagelsesobjekt med metadata, afspilnings- og downloadoplysninger). |
rap-post-publish-started | Efterpublicering startet. |
rap-post-publish-ended | Efterpublicering fuldført. |
rap-published | Optagelse publiceret. |
rap-unpublished | Optagelse afpubliceret. |
rap-deleted | Optagelse slettet. |
De fleste RAP-hændelser inkluderer record-id, success (boolean) og step-time. Hændelser med et workflow-felt indeholder desuden navnet på behandlingsworkflowet.
Serverkonfiguration
Følgende indstillinger kan konfigureres i /etc/bigbluebutton/bbb-webhooks.yml eller config/default.yml. De fleste af disse indstillinger er ikke dækket i den officielle dokumentation. undocumented
| Mulighed | Standard | Beskrivelse |
|---|---|---|
hookChecksumAlgorithm | sha1 | Hash-algoritme til callback-checksums (sha1, sha256, sha384, sha512). |
api.supportedChecksumAlgorithms | [sha1, sha256, sha384, sha512] | Accepterede algoritmer til kontrolsummer for indgående API-anmodninger. |
api.port | 3005 | Port for webhook-API-serveren. |
api.bind | 127.0.0.1 | Bindingsadresse for API-serveren. |
includeEvents | [] | Serverdækkende hændelsesfilter: kun disse hændelser leveres til alle hooks. Tom betyder alle hændelser. |
excludeEvents | [] | Serverdækkende hændelsesfilter: disse hændelser undertrykkes for alle hooks. Tom betyder ingen undtagelser. |
permanentURLs | [] | Liste over permanente hook-URL'er, der registreres ved opstart og ikke kan fjernes via API'et. |
retryIntervals | [100,500,1000,...,60000] | Genforsøgsintervaller i millisekunder for mislykkede callbacks. |
permanentIntervalReset | 60000 | Genforsøgsinterval i millisekunder for permanente hooks, efter at alle normale genforsøg er opbrugt. |
requestTimeout | 5000 | HTTP-timeout i millisekunder for callback-anmodninger. |
multiEvent | 1 | Når den sættes til en værdi større end 1, samles flere hændelser i hændelsesarrayet pr. callback. |
queueSize | 10000 | Maksimal størrelse på den interne hændelseskø. |
bbb.auth2_0 | false | Aktiverer Bearer-tokenautentifikation i stedet for URL-checksum til callbacks. |
includeEvents og excludeEvents er serveromfattende filtre, der anvendes ud over det pr.-hook eventID-filter. En hændelse skal bestå begge filtre for at blive leveret.
Driftsbemærkninger
- Persistens: Hooks gemmes i Redis og overlever servergenstarter (gensynkroniseres ved opstart).
- Rækkefølge: Callbacks sendes sekventielt pr. hook, én ad gangen, så hændelsesrækkefølgen bevares.
- URL-unikhed: Dubletdetektion er udelukkende baseret på callback-URL'en. Den samme URL kan ikke registreres med forskellige
meetingID- ellereventID-filtre — den første registrering vinder. - Dataoprydning: Interne mødetilknytninger fjernes efter én uges inaktivitet (kan konfigureres via
mappings.timeout, standard: 604800000 ms). - Syntetiske hændelser: Når et møde afsluttes, genereres
user-left-hændelser automatisk for alle stadig tilsluttede brugere, fordi BigBlueButton selv ikke udsenderUserLeftMeetingEvtMsgved mødets afslutning. - Private chats: Kun offentlige chatbeskeder genererer
chat-group-message-sent-hændelser. Private beskeder ignoreres uden varsel.
meetingID kræves for hver hook — globale hooks uden et meetingID understøttes ikke; (2) persondata i hændelser sløres automatisk af hensyn til privatlivet (f.eks. er deltagernes IP-adresser ikke synlige).Ofte stillede spørgsmål
bbb-webhooks skal installeres via apt-get install bbb-webhooks. Uden den er endpoints hooks/create, hooks/list og hooks/destroy ikke tilgængelige.duplicateWarning, og den eksisterende hook forbliver uændret. For at overvåge bestemte møder separat skal du bruge forskellige callback-URL'er.MAIN-PUBLIC-GROUP-CHAT) udløser en chat-group-message-sent-hændelse. Private beskeder mellem deltagere genererer ingen webhook-hændelser.getRaw=false (standard) modtager du behandlede hændelsesdata med en standardiseret struktur, der indeholder felterne type, id og attributes. Med getRaw=true modtager du den rå Redis-meddelelse som publiceret internt af BigBlueButton, som indeholder felterne envelope og core. Det rå format er nyttigt til debugging eller når du har brug for data, der ikke indgår i det behandlede format.permanentURLs og kan ikke fjernes gennem API'et. Kald af hooks/destroy på en permanent hook returnerer en destroyMissingHook-fejl, som om hooken ikke eksisterede.2xx og HTTP 401 behandles begge som succesfuld levering. Alle andre statuskoder, inklusive 3xx (efter at have fulgt op til 10 redirects), 4xx (undtagen 401) og 5xx, udløser et retry. Denne adfærd er ikke dokumenteret i den officielle BigBlueButton-dokumentation.