Kapitel 17 GET POST

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}}}]&timestamp=1532718316953

Rå callback-body (getRaw=true)

domain=myserver.com&event=[{"envelope":{"name":"UserJoinedMeetingEvtMsg","routing":{"sender":"bbb-apps-akka"}},"core":{"header":{...},"body":{...}}}]&timestamp=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=[...]&timestamp=...).

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 2xx og HTTP 401 behandles som succesfuld levering. Alle andre statuskoder udløser et retry. undocumented
  • Redirects: HTTP 3xx-svar følges (op til 10 hop). Kun hvis ingen 2xx/401 nå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 via retryIntervals).
  • 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- eller eventID-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 udsender UserLeftMeetingEvtMsg ved mødets afslutning.
  • Private chats: Kun offentlige chatbeskeder genererer chat-group-message-sent-hændelser. Private beskeder ignoreres uden varsel.
bbbserver.de er webhooks tilgængelige med to begrænsninger: (1) et 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

Ja. Pakken bbb-webhooks skal installeres via apt-get install bbb-webhooks. Uden den er endpoints hooks/create, hooks/list og hooks/destroy ikke tilgængelige.

Webhook-systemet forsøger levering igen med eksponentiel backoff over cirka 5 minutter (12 forsøg). Hvis alle genforsøg mislykkes, fjernes ikke-permanente hooks automatisk. Permanente hooks fortsætter med at forsøge igen på ubestemt tid med 60 sekunders intervaller.

Nej. Dubletdetektion er udelukkende baseret på callback-URL'en. Hvis du registrerer den samme URL igen, modtager du en duplicateWarning, og den eksisterende hook forbliver uændret. For at overvåge bestemte møder separat skal du bruge forskellige callback-URL'er.

Nej. Kun beskeder sendt til den offentlige chat (MAIN-PUBLIC-GROUP-CHAT) udløser en chat-group-message-sent-hændelse. Private beskeder mellem deltagere genererer ingen webhook-hændelser.

Med 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.

Nej. Permanente hooks konfigureres på serversiden via indstillingen 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.

HTTP 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.