← Cloudflare Stream / stream / manage-video-library
Použití webhooků
Webhooky informují vaši službu, jakmile video úspěšně dokončí zpracování a je připravené ke streamování, nebo pokud přejde do chybového stavu.
Přihlaste se k odběru oznámení webhooků
Chcete-li si nechat na svou službu zasílat oznámení webhooku nebo upravit stávající odběr, vygenerujte token API na API tokeny účtu stránce v Cloudflare dashboard.
Přejděte na API tokeny účtu ↗Adresa URL pro webhookové oznámení musí obsahovat protokol. Pouze http:// nebo https:// je podporováno.
curl -X PUT --header 'Authorization: Bearer <API_TOKEN>' \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/webhook \
--data '{"notificationUrl":"<WEBHOOK_NOTIFICATION_URL>"}'{
"result": {
"notificationUrl": "http://www.your-service-webhook-handler.com",
"modified": "2019-01-01T01:02:21.076571Z",
"secret": "85011ed3a913c6ad5f9cf6c5573cc0a7"
},
"success": true,
"errors": [],
"messages": []
}Oznámení
Jakmile video ve vašem účtu dokončí zpracování, obdržíte POST oznámení požadavku s informacemi o videu.
{
"uid": "6b9e68b07dfee8cc2d116e4c51d6a957",
"creator": null,
"thumbnail": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/thumbnails/thumbnail.jpg",
"thumbnailTimestampPct": 0,
"readyToStream": true,
"status": {
"state": "ready",
"pctComplete": "39.000000",
"errorReasonCode": "",
"errorReasonText": ""
},
"meta": {
"filename": "small.mp4",
"filetype": "video/mp4",
"name": "small.mp4",
"relativePath": "null",
"type": "video/mp4"
},
"created": "2022-06-30T17:53:12.512033Z",
"modified": "2022-06-30T17:53:21.774299Z",
"size": 383631,
"preview": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/watch",
"allowedOrigins": [],
"requireSignedURLs": false,
"uploaded": "2022-06-30T17:53:12.511981Z",
"uploadExpiry": "2022-07-01T17:53:12.511973Z",
"maxSizeBytes": null,
"maxDurationSeconds": null,
"duration": 5.5,
"input": {
"width": 560,
"height": 320
},
"playback": {
"hls": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/manifest/video.m3u8",
"dash": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/manifest/video.mpd"
},
"watermark": null
}-
uid: Jedinečný identifikátor videa. -
readytoStream: Vrátítruejakmile je zakódována alespoň jedna úroveň kvality a je připravena ke streamování. -
status: Stav zpracování.-
state: Vrátíreadyjakmile je zpracování videa dokončeno a jsou zakódovány všechny úrovně kvality. -
pctComplete: Procento dokončeného zpracování. Jakmile dosáhne100, jsou k dispozici všechny úrovně kvality.
-
-
meta: Metadata přiřazená k nahranému souboru. -
created: Časové razítko udávající, kdy byl záznam videa vytvořen.
Kódy chyb
Pokud se video nepodařilo úspěšně zpracovat, state pole vrací error, a errReasonCode vrací jednu z hodnot uvedených níže.
ERR_NON_VIDEO: Nahraný soubor není video.ERR_DURATION_EXCEED_CONSTRAINT: Délka videa přesahuje omezení definovaná v přímém nahrávání tvůrcem.ERR_FETCH_ORIGIN_ERROR: Video se nepodařilo stáhnout z URL adresy.ERR_MALFORMED_VIDEO: Video je platný soubor, ale obsahuje poškozená data, která nelze obnovit.ERR_DURATION_TOO_SHORT: Délka videa je kratší než 0.1 sekundy.ERR_UNKNOWN: Pokud Stream nedokáže automaticky určit, proč video vrátilo chybu,ERR_UNKNOWNkód bude použit.
Kromě state pole, u videa readyToStream pole musí být také true aby se video mohlo přehrát.
{
"readyToStream": false,
"status": {
"state": "error",
"step": "encoding",
"pctComplete": "39",
"errReasonCode": "ERR_MALFORMED_VIDEO",
"errReasonText": "The video was deemed to be corrupted or malformed.",
}
}Ověření pravosti webhooku
Cloudflare Stream podepíše webhookové požadavky odeslané na vaše notifikační URL adresy a podpis každého požadavku zahrne do Webhook-Signature HTTP hlavičku. Díky tomu může vaše aplikace ověřit, že webhookové požadavky odesílá Stream.
Chcete-li ověřit podpis, musíte získat tajný klíč pro podepisování webhooku. Tato hodnota se vrací v odpovědi API při vytvoření nebo načtení webhooku.
Chcete-li ověřit podpis, získejte hodnotu Webhook-Signature hlavičku, která bude vypadat podobně jako příklad níže.
Webhook-Signature: time=1230811200,sig1=60493ec9388b44585a29543bcf0de62e377d4da393246a8b1c901d0e3e672404
1. Analyzujte podpis
Načtěte Webhook-Signature hlavičku z požadavku webhooku a rozdělte řetězec pomocí , znak.
Každou hodnotu znovu rozdělte pomocí = znak.
Hodnota pro time je aktuální Unixový čas ↗ kdy server odeslal požadavek. sig1 je podpis těla požadavku.
V tomto okamžiku byste měli zahodit požadavky s časovými razítky, která jsou pro vaši aplikaci příliš stará.
2. Vytvořte zdrojový řetězec podpisu
Zdrojový řetězec podpisu připravte spojením následujících řetězců:
- Hodnota
timepole, například1230811200 - Znak
. - Tělo požadavku webhooku (včetně znaků nového řádku, pokud jsou relevantní)
Aby ověření podpisu proběhlo úspěšně, nesmí být v těle požadavku změněn ani jeden bajt.
3. Vytvořte očekávaný podpis
Vypočítejte HMAC pomocí funkce SHA256 (HMAC-SHA256), a to za použití vašeho webhookového tajného klíče a zdrojového řetězce z kroku 2. Tento krok závisí na programovacím jazyce, který vaše aplikace používá.
Podpis Cloudflare bude zakódován do hexadecimální podoby.
4. Porovnejte očekávaný a skutečný podpis
Porovnejte podpis v hlavičce požadavku s očekávaným podpisem. K porovnání podpisů raději použijte funkci s konstantní dobou porovnání.
Pokud se podpisy shodují, můžete si být jisti, že webhook odeslal Cloudflare.
Omezení
- Webhooky se odesílají až po dokončení zpracování videa a tělo zprávy uvádí, zda zpracování proběhlo úspěšně, nebo selhalo.
- Pro jeden účet je povolen pouze jeden odběr webhooku.
- Cloudflare nemůže odesílat webhooky na
localhostani lokální IP adresy. Je vyžadována veřejně přístupná URL adresa. Pro místní testování použijte Quick Tunnel a zpřístupněte tak svůj lokální server internetu. Podrobný postup krok za krokem najdete v Otestujte webhooky lokálně.
Příklady
Golang
Použití crypto/hmac ↗:
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"log"
)
func main() {
secret := []byte("secret from the Cloudflare API")
message := []byte("string from step 2")
hash := hmac.New(sha256.New, secret)
hash.Write(message)
hashToCheck := hex.EncodeToString(hash.Sum(nil))
log.Println(hashToCheck)
}Node.js
var crypto = require("crypto");
var key = "secret from the Cloudflare API";
var message = "string from step 2";
var hash = crypto.createHmac("sha256", key).update(message);
hash.digest("hex");Ruby
require 'openssl'
key = 'secret from the Cloudflare API'
message = 'string from step 2'
OpenSSL::HMAC.hexdigest('sha256', key, message)V JavaScriptu (například pro použití v Cloudflare Workers)
const key = "secret from the Cloudflare API";
const message = "string from step 2";
const getUtf8Bytes = (str) =>
new Uint8Array(
[...decodeURIComponent(encodeURIComponent(str))].map((c) =>
c.charCodeAt(0),
),
);
const keyBytes = getUtf8Bytes(key);
const messageBytes = getUtf8Bytes(message);
const cryptoKey = await crypto.subtle.importKey(
"raw",
keyBytes,
{ name: "HMAC", hash: "SHA-256" },
true,
["sign"],
);
const sig = await crypto.subtle.sign("HMAC", cryptoKey, messageBytes);
[...new Uint8Array(sig)].map((b) => b.toString(16).padStart(2, "0")).join("");