Bölüm 17 GET POST

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

Ham Callback Gövdesi (getRaw=true)

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

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 2xx ve HTTP 401 başarılı teslimat olarak kabul edilir. Diğer tüm durum kodları yeniden denemeyi tetikler. undocumented
  • Yönlendirmeler: HTTP 3xx yanıtları takip edilir (10 sıçramaya kadar). Yalnızca 10 yönlendirmeden sonra hiçbir 2xx/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 (requestTimeout ile 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, retryIntervals ile 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 (permanentIntervalReset ile 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ı meetingID veya eventID filtreleriyle kaydedilemez — ilk kayıt kazanır.
  • Veri temizliği: Dahili toplantı eşlemeleri, bir haftalık hareketsizlikten sonra kaldırılır (mappings.timeout ile 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-left olayları otomatik olarak üretilir; çünkü BigBlueButton, toplantı bittiğinde kendisi UserLeftMeetingEvtMsg yayınlamaz.
  • Özel sohbetler: Yalnızca genel sohbet mesajları chat-group-message-sent etkinlikleri üretir. Özel mesajlar sessizce yok sayılır.
bbbserver.de üzerinde webhooks iki kısıtlamayla kullanılabilir: (1) her hook için bir 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

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

Webhook sistemi yaklaşık 5 dakika boyunca üstel geri çekilme ile yeniden deneme yapar (12 deneme). Tüm yeniden denemeler başarısız olursa kalıcı olmayan hook'lar otomatik olarak kaldırılır. Kalıcı hook'lar ise 60 saniyelik aralıklarla süresiz olarak yeniden denenmeye devam eder.

Hayır. Yinelenen tespiti yalnızca callback URL'sine dayanır. Aynı URL'yi tekrar kaydederseniz bir 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.

Hayır. Yalnızca genel sohbete (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.

Hayır. Kalıcı hook'lar 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.

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