Webhooks – Gerçek Zamanlı Etkinlikler
BigBlueButton Webhooks, toplantı olayları gerçekleştiğinde uygulamanızın gerçek zamanlı HTTP POST bildirimleri almasını sağlar. Sürekli olarak getMeetings veya getMeetingInfo yoklamak yerine, bir callback URL'si kaydedersiniz ve BigBlueButton olayları size otomatik olarak gönderir. Bu bölüm, üç webhook API uç noktasını, callback biçimini, olay türlerini, yeniden deneme davranışını ve sunucu yapılandırmasını kapsar.
Webhooks'un çalışması için sunucuda bbb-webhooks paketinin kurulu olması gerekir. Bu bölümde açıklanan birkaç ayrıntı resmî BigBlueButton dokümantasyonunda yer almaz ve kaynak kodu analizi yoluyla belirlenmiştir. undocumented
Önkoşullar
Webhook uç noktalarının kullanılabilir hâle gelmesi için bbb-webhooks paketinin BigBlueButton sunucusuna önceden kurulmuş olması gerekir:
sudo apt-get install bbb-webhooks Bir toplantı oluşturulduğunda webhook uygulaması çalışmıyorsa, dahili toplantı eşlemesi oluşturulmaz. Sonuç olarak, o toplantı için hiçbir callback tetiklenmez.
hooks/create — Bir Webhook Kaydet
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/create?<parameters>&checksum=replace-with-checksum Resmî dokümantasyon bir HTTP yöntemi belirtmez. Express yönlendiricisi yalnızca GET rotalarını kaydeder — POST istekleri kabul edilmez. undocumented
| Parametre | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
callbackURL | String | Evet | — | POST callback'lerini alacak URL. Yinelenen tespiti yalnızca bu URL'ye dayanır — aynı URL, farklı bir meetingID veya eventID ile bile iki kez kaydedilemez. |
meetingID | String | Hayır | — | Hook'u belirli bir toplantıyla sınırlar (harici toplantı kimliği). Atlanırsa, hook tüm toplantılar için tetiklenen genel bir hook olur. |
eventID | String | Hayır | — | Dinlenecek olay türlerinin virgülle ayrılmış listesi (ör. user-joined,meeting-ended). Atlanırsa, tüm olaylar iletilir. Filtre büyük/küçük harfe duyarlı değildir. BBB 2.5'ten beri kullanılabilir. |
getRaw | Boolean | Hayır | false | true olarak ayarlandığında, callback'ler işlenmiş olay verileri yerine ham Redis mesajını içerir. |
Başarılı Yanıt
<response>
<returncode>SUCCESS</returncode>
<hookID>replace-with-hook-id</hookID>
<permanentHook>false</permanentHook>
<rawData>false</rawData>
</response> Yinelenen Kayıt
Aynı callbackURL yeniden kaydedilirse, yanıt yine de SUCCESS döndürür ancak bir duplicateWarning içerir. Mevcut hook değişmeden korunur — meetingID, eventID ve getRaw güncellenmez.
<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> Hata Yanıtları
messageKey | Açıklama |
|---|---|
checksumError | Checksum geçersiz veya eksik. |
missingParamCallbackURL | callbackURL parametresi sağlanmadı. undocumented |
createHookError | Dahili bir hata oluştu (ör. Redis erişilemez). Sunucu günlüklerini kontrol edin. |
hooks/list — Kayıtlı Webhook'ları Listele
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/list?<parameters>&checksum=replace-with-checksum | Parametre | Tür | Gerekli | Açıklama |
|---|---|---|---|
meetingID | String | Hayır | Toplantı kimliğine göre filtreler. Sonuç, belirtilen toplantı için olan hook'ları ve tüm genel hook'ları içerir. Belirtilmezse, kayıtlı tüm hook'lar döndürülür. |
Başarılı Yanıt
<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> öğesi yalnızca toplantıya özgü hook'lar için görünür. Genel hook'larda <meetingID> öğesi yoktur. Benzer şekilde, <eventID> yalnızca oluşturma sırasında bir olay filtresi ayarlanmışsa görünür.
Hata Yanıtları
messageKey | Açıklama |
|---|---|
checksumError | Checksum geçersiz veya eksik. |
listHookError | Hook'lar listelenirken dahili bir hata oluştu. Sunucu günlüklerini kontrol edin. undocumented |
hooks/destroy — Bir Webhook'u Kaldır
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/destroy?<parameters>&checksum=replace-with-checksum | Parametre | Tür | Gerekli | Açıklama |
|---|---|---|---|
hookID | String | Evet | Kaldırılacak hook'un kimliği (hooks/create veya hooks/list üzerinden elde edilir). |
Başarılı Yanıt
<response>
<returncode>SUCCESS</returncode>
<removed>true</removed>
</response> Kalıcı hook'lar (permanentURLs aracılığıyla sunucu tarafında yapılandırılanlar) API üzerinden silinemez. Bunu yapmaya çalışmak, hook mevcut değilmiş gibi destroyMissingHook hatası döndürür.
Hata Yanıtları
messageKey | Açıklama |
|---|---|
checksumError | Checksum geçersiz veya eksik. |
missingParamHookID | hookID parametresi sağlanmadı. |
destroyMissingHook | Hook kimliği mevcut değil veya kalıcı bir hook'a ait. |
destroyHookError | Hook kaldırılırken dahili bir hata oluştu. Sunucu günlüklerini kontrol edin. |
hooks/ping — Sağlık Kontrolü
GET https://api-guide.bbbserver.com/bigbluebutton/api/hooks/ping Bu tanılama uç noktası checksum gerektirmez. Webhook uygulamasına erişilebiliyorsa düz metin olarak bbb-webhooks API up! dizesini döndürür (XML değil, içerik türü text/plain). undocumented
Geri Çağrı Biçimi
Webhook geri çağrıları, içerik türü olacak şekilde HTTP POSTapplication/x-www-form-urlencoded istekleri olarak gönderilir. İstek gövdesi üç alan içerir:
| Alan | Açıklama |
|---|---|
domain | Sunucu alan adı (webhook yapılandırmasından). undocumented |
event | Olay verilerini içeren bir JSON dizisi. Tek bir olay için bile her zaman bir dizidir. |
timestamp | Gönderim anındaki milisaniye cinsinden bir Unix zaman damgası. |
İşlenmiş Callback Gövdesi (getRaw=false)
domain=myserver.com&event=[{"data":{"type":"event","id":"user-joined","attributes":{...},"event":{"ts":1532718316938}}}]×tamp=1532718316953 Ham Callback Gövdesi (getRaw=true)
domain=myserver.com&event=[{"envelope":{"name":"UserJoinedMeetingEvtMsg","routing":{"sender":"bbb-apps-akka"}},"core":{"header":{...},"body":{...}}}]×tamp=1532718316953 Sunucu multiEvent 1'den büyük olacak şekilde yapılandırıldığında, birden fazla olay tek bir geri çağrı içinde event dizisinde paketlenebilir.
Geri Çağrı Checksum Doğrulaması
Varsayılan modda, her callback URL'si uygulamanızın doğrulaması gereken bir checksum sorgu parametresi alır:
https://api-guide.bbbserver.com/callbacks/webhook?checksum=replace-with-checksum Doğrulama formülü şöyledir:
sha<algo>(<callback-URL-without-checksum> + <URL-encoded-body> + <shared-secret>) Kayıtlı geri çağrı URL'sini checksum parametresi olmadan alın.
Tam URL kodlu istek gövdesini ekleyin (domain=...&event=[...]×tamp=...).
BBB paylaşılan gizli anahtarını ekleyin.
Ortaya çıkan dizeyi yapılandırılmış algoritma ile hash'leyin (varsayılan: sha1, hookChecksumAlgorithm ile yapılandırılabilir).
Auth 2.0 / Bearer Modu
Alternatif olarak, sunucu auth2_0: true ile yapılandırılabilir. Bu modda callback URL'sine checksum parametresi eklenmez. Bunun yerine paylaşılan gizli anahtar, Bearer başlığında bir Authorization token olarak gönderilir: undocumented
Authorization: Bearer <shared-secret> Geri Çağrı Davranışı
- Kabul edilen HTTP durum kodları: HTTP
2xxve HTTP401başarılı teslimat olarak kabul edilir. Diğer tüm durum kodları yeniden denemeyi tetikler. undocumented - Yönlendirmeler: HTTP
3xxyanıtları takip edilir (10 sıçramaya kadar). Yalnızca 10 yönlendirmeden sonra hiçbir2xx/401'ye ulaşılamazsa callback başarısız sayılır. - Zaman aşımı: Her geri çağrı isteği için 5 saniyelik bir zaman aşımı vardır (
requestTimeoutile yapılandırılabilir). - Yeniden deneme aralıkları: Başarısızlık durumunda, yeniden denemeler üstel geri çekilme kullanır:
100ms, 500ms, 1s, 2s, 4s, 8s, 10s, 30s, 60s, 60s, 60s, 60s(yaklaşık 5 dakika boyunca 12 deneme,retryIntervalsile yapılandırılabilir). - Tüm yeniden denemeler tükendiğinde: Kalıcı olmayan hook'lar otomatik olarak kaldırılır. Kalıcı hook'lar ise 60 saniyelik aralıklarla süresiz olarak yeniden denemeye devam eder (
permanentIntervalResetile yapılandırılabilir).
Olay Türleri
Toplantı Olayları
| Olay Kimliği | Açıklama |
|---|---|
meeting-created | Bir toplantı oluşturuldu. |
meeting-ended | Bir toplantı sona erdi. Bu, bağlı tüm kullanıcılar için sentetik user-left olaylarını da tetikler. |
meeting-recording-started | Kayıt başladı. |
meeting-recording-stopped | Kayıt durdu. |
meeting-recording-unhandled | İşlenmemiş kayıt olayı (kayıt durumu true ya da false değilse geri dönüş durumu). |
meeting-screenshare-started | Ekran paylaşımı başladı (sunucu kullanıcı verilerini içerir). |
meeting-screenshare-stopped | Ekran paylaşımı durdu (sahip kullanıcı verilerini içerir). |
meeting-presentation-changed | Etkin sunum değişti (presentation-id içerir). |
Kullanıcı Olayları
| Olay Kimliği | Açıklama |
|---|---|
user-joined | Bir kullanıcı toplantıya katıldı (misafir bayrağı, kullanıcı verileri, IP adresi, User-Agent içerir). |
user-left | Bir kullanıcı toplantıdan ayrıldı (misafir bayrağı içerir). Ayrıca meeting-ended üzerinde sentetik olarak üretilir. |
user-audio-voice-enabled | Ses etkinleştirildi (listening-only, sharing-mic, muted bayraklarını içerir). |
user-audio-voice-disabled | Ses devre dışı bırakıldı. |
user-audio-muted | Kullanıcının sesi kapatıldı. |
user-audio-unmuted | Kullanıcının sesi açıldı. |
user-audio-unhandled | İşlenmeyen ses olayı (yedek). |
user-cam-broadcast-start | Web kamerası başlatıldı (stream-id içerir). |
user-cam-broadcast-end | Web kamerası durduruldu. |
user-presenter-assigned | Kullanıcıya sunucu rolü atandı. |
user-presenter-unassigned | Kullanıcı sunucu rolünden çıkarıldı. |
user-emoji-changed | Kullanıcı emojisi veya tepkisi değişti (emoji değerini içerir). |
user-raise-hand-changed | Kullanıcı elini kaldırdı veya indirdi (raise-hand boolean değerini içerir). BBB 2.7 öncesi sürümlerde bu olay user-emoji-changed'den sentetik olarak üretilir. |
Sohbet ve Notlar Olayları
| Olay Kimliği | Açıklama |
|---|---|
chat-group-message-sent | genel sohbette bir mesaj gönderildi. Özel sohbet mesajları webhook olayları oluşturmaz. |
transcript-updated | Transkripsiyon güncellendi (transcript, locale, final bayrağını içerir). |
pad-content | Paylaşılan notlar içeriği değişti (pad-id, rev, text içerir). |
Anket Olayları
| Olay Kimliği | Açıklama |
|---|---|
poll-started | Bir anket başlatıldı (soru ve cevap seçeneklerini içerir). |
poll-responded | Bir katılımcı ankete yanıt verdi (cevap kimliklerini içerir). |
Kayıt ve Oynatma (RAP) Olayları
| Olay Kimliği | Açıklama |
|---|---|
rap-archive-started | Arşivleme başlatıldı. |
rap-archive-ended | Arşivleme tamamlandı (recorded bayrağı ve süreyi içerir). |
rap-sanity-started | Bütünlük denetimi başlatıldı. |
rap-sanity-ended | Bütünlük denetimi tamamlandı. |
rap-post-archive-started | Arşivleme sonrası başlatıldı. |
rap-post-archive-ended | Arşivleme sonrası tamamlandı. |
rap-process-started | İşleme başlatıldı. |
rap-process-ended | İşleme tamamlandı. |
rap-post-process-started | İşlem sonrası başlatıldı. |
rap-post-process-ended | İşlem sonrası tamamlandı. |
rap-publish-started | Yayımlama başlatıldı. |
rap-publish-ended | Yayımlama tamamlandı (metadata, oynatma ve indirme bilgileriyle birlikte tam kayıt nesnesini içerir). |
rap-post-publish-started | Yayımlama sonrası başlatıldı. |
rap-post-publish-ended | Yayımlama sonrası tamamlandı. |
rap-published | Kayıt yayımlandı. |
rap-unpublished | Kayıt yayından kaldırıldı. |
rap-deleted | Kayıt silindi. |
Çoğu RAP olayı record-id, success (boolean) ve step-time içerir. workflow alanına sahip olaylar ayrıca işleme iş akışı adını da içerir.
Sunucu Yapılandırması
Aşağıdaki seçenekler /etc/bigbluebutton/bbb-webhooks.yml veya config/default.yml içinde yapılandırılabilir. Bu seçeneklerin çoğu resmi belgelerde yer almamaktadır. undocumented
| Seçenek | Varsayılan | Açıklama |
|---|---|---|
hookChecksumAlgorithm | sha1 | Callback checksum'ları için hash algoritması (sha1, sha256, sha384, sha512). |
api.supportedChecksumAlgorithms | [sha1, sha256, sha384, sha512] | Gelen API sağlama toplamları için kabul edilen algoritmalar. |
api.port | 3005 | Webhook API sunucusunun portu. |
api.bind | 127.0.0.1 | API sunucusunun bağlanma adresi. |
includeEvents | [] | Sunucu genelinde olay filtresi: yalnızca bu olaylar tüm kancalara iletilir. Boş olması tüm olaylar anlamına gelir. |
excludeEvents | [] | Sunucu genelinde olay filtresi: bu olaylar tüm kancalar için bastırılır. Boş olması hariç tutma olmadığı anlamına gelir. |
permanentURLs | [] | Başlangıçta kaydedilen ve API üzerinden kaldırılamayan kalıcı kanca URL'lerinin listesi. |
retryIntervals | [100,500,1000,...,60000] | Başarısız geri çağrılar için milisaniye cinsinden yeniden deneme aralıkları. |
permanentIntervalReset | 60000 | Tüm normal yeniden denemeler tükendikten sonra kalıcı kancalar için milisaniye cinsinden yeniden deneme aralığı. |
requestTimeout | 5000 | Geri çağrı istekleri için milisaniye cinsinden HTTP zaman aşımı. |
multiEvent | 1 | 1'den büyük bir değere ayarlandığında, her geri çağrı için olay dizisinde birden fazla olay paketlenir. |
queueSize | 10000 | Dahili olay kuyruğunun maksimum boyutu. |
bbb.auth2_0 | false | Callback'ler için URL checksum'u yerine Bearer token kimlik doğrulamasını etkinleştirir. |
includeEvents ve excludeEvents, her hook için kullanılan eventID filtresine ek olarak uygulanan sunucu genelindeki filtrelerdir. Bir etkinliğin iletilmesi için her iki filtreden de geçmesi gerekir.
Operasyonel Notlar
- Kalıcılık: Hook'lar Redis içinde saklanır ve sunucu yeniden başlatmalarından etkilenmez (başlangıçta yeniden senkronize edilir).
- Sıralama: Geri çağırmalar her hook için sırayla, aynı anda bir tane olacak şekilde gönderilir ve etkinlik sırası korunur.
- URL benzersizliği: Yinelenen tespiti yalnızca callback URL'sine dayanır. Aynı URL, farklı
meetingIDveyaeventIDfiltreleriyle kaydedilemez — ilk kayıt kazanır. - Veri temizliği: Dahili toplantı eşlemeleri, bir haftalık hareketsizlikten sonra kaldırılır (
mappings.timeoutile yapılandırılabilir, varsayılan: 604800000 ms). - Sentetik olaylar: Bir toplantı sona erdiğinde, hâlâ bağlı olan tüm kullanıcılar için
user-leftolayları otomatik olarak üretilir; çünkü BigBlueButton, toplantı bittiğinde kendisiUserLeftMeetingEvtMsgyayınlamaz. - Özel sohbetler: Yalnızca genel sohbet mesajları
chat-group-message-sentetkinlikleri üretir. Özel mesajlar sessizce yok sayılır.
meetingID gereklidir — meetingID olmadan global hook'lar desteklenmez; (2) olaylardaki kişisel veriler gizlilik için otomatik olarak maskelenir (ör. katılımcı IP adresleri görünmez).Sıkça Sorulan Sorular
bbb-webhooks paketi apt-get install bbb-webhooks aracılığıyla kurulmalıdır. Bu paket olmadan hooks/create, hooks/list ve hooks/destroy uç noktaları mevcut olmaz.duplicateWarning alırsınız ve mevcut hook değişmeden kalır. Belirli toplantıları ayrı ayrı izlemek için farklı callback URL'leri kullanın.MAIN-PUBLIC-GROUP-CHAT) gönderilen mesajlar bir chat-group-message-sent olayını tetikler. Katılımcılar arasındaki özel mesajlar herhangi bir webhook olayı oluşturmaz.getRaw=false ile (varsayılan), type, id ve attributes alanlarını içeren standartlaştırılmış bir yapıda işlenmiş olay verileri alırsınız. getRaw=true ile ise, Redis tarafından dahili olarak yayımlanan ham BigBlueButton mesajını alırsınız; bu mesaj envelope ve core alanlarını içerir. Ham biçim, hata ayıklama için veya işlenmiş biçimde bulunmayan verilere ihtiyaç duyduğunuzda faydalıdır.permanentURLs ayarı aracılığıyla sunucu tarafında yapılandırılır ve API üzerinden kaldırılamaz. Kalıcı bir hook üzerinde hooks/destroy çağrısı yapmak, sanki hook mevcut değilmiş gibi bir destroyMissingHook hatası döndürür.2xx ve HTTP 401 her ikisi de başarılı teslimat olarak kabul edilir. 3xx (10 yönlendirmeye kadar takip edildikten sonra), 4xx (401 hariç) ve 5xx dahil diğer tüm durum kodları yeniden denemeyi tetikler. Bu davranış resmî BigBlueButton dokümantasyonunda belgelenmemiştir.