Schede
Scopri i tipi di scheda, crea un’istanza e aggiorna i suoi dati in tempo reale. Una playlist colloca l’ID della scheda restituito.
screenrig cards list --category ops
screenrig cards show gauge
screenrig card create --type gauge --file gauge-params.json
screenrig card list
screenrig card show crd_01EXAMPLEGAUGE000000000
screenrig card params crd_01EXAMPLEGAUGE000000000 --file gauge-params.json
screenrig card data get crd_01EXAMPLEGAUGE000000000
screenrig card data put crd_01EXAMPLEGAUGE000000000 --file gauge-data.json --ttl 30m --expect-rev 1
screenrig card preview crd_01EXAMPLEGAUGE000000000 --output gauge.png
screenrig card delete crd_01EXAMPLEGAUGE000000000| Parametro | Tipo | Obbligatorio | Predefinito | Note |
|---|---|---|---|---|
cards list --tag TAG | string | no | nessuno | Corrisponde a un tag del catalogo. |
cards list --category CATEGORY | string | no | nessuno | Corrisponde a una categoria del catalogo. Con --tag, una scheda deve corrispondere a entrambe. |
cards show <id> | string | sì | nessuno | L’ID scheda del catalogo ottenuto da cards list, come gauge. |
card create --type ID | string | sì | nessuno | L’ID scheda del catalogo ottenuto da cards list. |
card create --major N | integer | no | versione principale attuale | Blocca una versione principale del catalogo. |
card create --file FILE | path | sì | nessuno | I parametri statici come oggetto JSON di al massimo 1 MiB, oppure - per stdin. |
<id> | string | sì | nessuno | L’ID scheda crd_ che accettano card show, card params, card delete e card data. |
card params --file FILE | path | sì | nessuno | I nuovi parametri statici, letti come per card create. Sostituiscono subito i vecchi. |
card data put --file FILE | path | sì | nessuno | Il documento dati come oggetto JSON, oppure - per stdin. Sostituisce l’intero documento. |
card data put --ttl DURATION | string | no | nessuno | Svuota i dati dopo questo tempo, schermi offline compresi: 30m, 12h o 1d, da 1s a 365d. Non insieme a --expires-at. |
card data put --expires-at INSTANT | string | no | nessuno | Svuota i dati a questo timestamp ISO 8601, che include un fuso orario. Una scrittura senza nessuna delle due opzioni cancella la scadenza precedente. |
card data put --expect-rev REVISION | string | no | nessuno | Scrive solo se i dati sono ancora a questa revisione, come la mostra card data get. Un valore obsoleto dà revision_conflict (uscita 6). |
card preview <type|id> | string | sì | nessuno | Un ID di scheda del catalogo, oppure un ID di scheda crd_ per disegnare quell’istanza con i suoi parametri e dati. |
card preview --output FILE | path | sì | nessuno | Scrive qui il PNG. Le cartelle genitore sono create. |
card preview --params FILE | path | no | nessuno | Proprietà statiche come oggetto JSON. |
card preview --data FILE | path | no | nessuno | Il documento dinamico come oggetto JSON. |
card preview --feed FILE | path | no | nessuno | Il documento feed dell’host come oggetto JSON. Un feed di cui la scheda ha bisogno e che ometti viene segnalato. |
card preview --width PX / --height PX | integer | no | 1920 / 1080 | Dimensione dell’immagine, da 1 a 8192. |
card preview --layout LAYOUT | string | no | full | full, free, center, wide, header, footer, corner, chip o strip: il layout da disegnare. |
card preview --anchor ANCHOR | string | no | nessuno | L’angolo di un layout corner o chip, oppure il bordo di uno strip. |
card preview --now ISO | string | no | l’ora corrente | Blocca l’orologio a questo istante ISO 8601. |
card preview --timezone ZONE | string | no | quello di questa macchina | Disegna in questo fuso orario IANA, come America/Vancouver. |
cards show mostra params_schema e data_schema della scheda, le sue proprietà statiche e dinamiche, livello, layout e feed, e un esempio da copiare in una pagina di playlist. card create restituisce l’id crd_ dell’istanza, e una ripetizione identica dopo una risposta persa riutilizza la chiave di idempotenza salvata.
card data put sostituisce il documento subito, senza ripubblicare la playlist. La validazione della scheda rifiuta un documento che non può mostrare (card_data_invalid), e una scadenza svuota i dati su ogni schermo quando nulla li rinnova. card delete elimina l’istanza e i suoi dati e risponde resource_conflict (uscita 5) finché una playlist la colloca.
card preview disegna la scheda in un Chromium o Chrome locale e scrive un PNG; non pubblica nulla. Imposta SCREENRIG_BROWSER sul percorso del browser se non è installato nessuno di quelli abituali. data.file è il percorso scritto e data.unrendered elenca ciò che l’anteprima non ha potuto disegnare, per esempio un feed host che non hai fornito. Apri l’immagine prima di pubblicare. Schede integrate descrive i layout, le proprietà e i feed di ogni scheda.
Webhook delle schede
Un webhook di scheda è un URL che scrive il documento dati di una scheda, così un sistema esterno come un CMS, un punto vendita o uno script invia dati a una scheda con una singola richiesta HTTP POST. kv webhook create, list, rotate-secret e delete accettano --card CARD_ID al posto di --app-id, mai entrambi; update e deliveries qui sotto funzionano solo con le schede. Una scheda può avere al massimo 20 webhook.
kv webhook create --card CARD_ID [--description TEXT] [--map FILE|-] [--key-template TEMPLATE] [--signing]
[--verify VENDOR [--verify-secret-file FILE|-] [--verify-header NAME] [--verify-encoding hex|base64]
[--verify-timestamp-header NAME] [--verify-tolerance SECONDS]] [--handshake VENDOR]
kv webhook list --card CARD_ID
kv webhook rotate-secret <webhook_id> --card CARD_ID [--signing]
kv webhook delete <webhook_id> --card CARD_IDLa creazione di un webhook di scheda non richiede una chiave. --map FILE (o - per stdin) è la mappatura, --key-template scrive documenti per chiave, --signing attiva la firma, e --verify e --handshake accettano gli invii propri di un fornitore (Firme e handshake dei fornitori). La risposta contiene data.secret e, se il webhook firma, data.signing_secret, ciascuno mostrato una sola volta.
Il mittente si autentica come per un webhook di applicazione: Authorization: Bearer <secret> con il segreto srkw_…, oppure HTTP Basic con l'ID del webhook come nome utente, quindi https://kvw_ID:srkw_…@api.screenrig.ai/… va bene per un mittente che accetta solo un URL. Il corpo, al massimo 1 MiB, è JSON oppure application/x-www-form-urlencoded; un nome di modulo ripetuto diventa un array. Senza mappatura, l'oggetto inviato è il documento dati della scheda.
Una mappatura è un modello JSON che costruisce il documento dal corpo. Una stringa con segnaposto come {{body.alert.title}} o {{body.items[0].name}} è testo, e una stringa che è esattamente un segnaposto mantiene il tipo del valore. Un percorso inizia con body o query (i parametri di query dell'URL), e un percorso che non contiene nulla è vuoto nel testo e omette un valore isolato. $each mappa un array con item e index nell'ambito, $group con $by raggruppa nell'ordine della prima comparsa, $number legge 1,234.50, $3.50, 3,50 € o 12% (aggiungi "$decimal": "," per la virgola decimale), $bool legge true, yes, y, 1 e x, e $text con $max taglia il testo. Il modello viene controllato al salvataggio: invalid_request indica il punto che ha fallito.
{
"title": "{{body.alert.title}}",
"body": "{{body.alert.message}}",
"items": { "$each": "{{body.items}}", "$limit": 20, "$template": { "text": "{{item.name}}" } }
}curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks/kvw_01EXAMPLEWEBHOOK00000/write \
-H "Authorization: Bearer $CARD_WEBHOOK_SECRET" \
-H "Content-Type: application/json" \
--data '{"alert":{"title":"Fire drill","message":"Leave by the east door"},"items":[{"name":"Floor 2"}]}'--key-template TEMPLATE scrive documenti per chiave al posto del documento proprio della scheda. Il modello è una chiave dati della scheda con token {screen.field.NAME}, come room-{screen.field.room}, e l’oggetto mappato (o il corpo inviato, senza mappatura) contiene solo un array documents di oggetti {fields, document}: ogni oggetto fields riempie il modello e ogni document viene scritto sotto la chiave che produce. Un elemento di pagina che indica lo stesso modello come data mostra a ogni schermo il documento dei suoi campi. Ogni documento viene verificato prima che ne venga scritto qualcuno, e una chiave ripetuta viene rifiutata. Un errore di archiviazione può lasciare scritta una parte del lotto: reinvia lo stesso corpo con lo stesso Idempotency-Key. Le chiavi che un invio omette mantengono i loro dati, e un webhook non imposta alcuna scadenza. Documenti per chiave mostra una mappatura.
Ogni invio viene controllato come dati della scheda stessa: card_data_invalid indica il percorso e non viene scritto nulla. Un documento uguale a quello attuale della scheda riceve la risposta unchanged e non scrive nulla, quindi nessuno schermo viene risvegliato. Un invio accettato non conta nel limite di richieste agente, un webhook accetta al massimo 120 invii al minuto e un’intestazione Idempotency-Key deduplica i nuovi tentativi di un mittente per 24 ore.
Un indirizzo sbagliato, un segreto errato o mancante, un webhook disattivato, una firma mancante o errata e ogni GET ricevono la stessa risposta 404, così un'anteprima di link o un tentativo non rivela nulla. kv webhook deliveries ne spiega il motivo.
Con --signing, ogni invio deve anche includere ScreenRig-Signature: t=<unix seconds>,v1=<hex>, dove v1 è l'HMAC-SHA256 di t, un punto e il corpo grezzo con il segreto di firma whsec_…, e t deve distare al massimo cinque minuti dall'orologio del server. È il formato delle firme dei webhook di screenRIG.
Firme e handshake dei fornitori
I fornitori firmano i loro invii a modo loro, e alcuni non possono inviare affatto il tuo segreto. Un webhook di scheda può verificare la firma del fornitore al posto del segreto e rispondere all’handshake di configurazione del fornitore, così GitHub, Stripe, Shopify, Slack, Linear, Vercel, Asana, Microsoft Graph, monday.com, Trello e Azure Event Grid inviano direttamente, senza intermediari. Funziona anche qualsiasi altro mittente che firma con HMAC. Impostali con --verify e --handshake su kv webhook create e modificali con kv webhook update.
--verify VENDORaccetta la firma propria di un fornitore, con--verify-secret-file FILE(o-per stdin, mai come argomento) che contiene il segreto mostrato dal fornitore. Pergeneric_hmac,--verify-header NAMEindica l’intestazione che porta la firma,--verify-encodingèhex(predefinito) obase64,--verify-timestamp-header NAMEindica un’intestazione che porta l’ora Unix, e--verify-tolerance SECONDSè quanto può discostarsi dall’orologio del server (300 per impostazione predefinita). Un invio che porta la firma valida del fornitore viene accettato senza il segretosrkw_del webhook, che continua a funzionare accanto. Il segreto del fornitore è memorizzato sigillato e mostrato solo comesete unhintdei suoi ultimi quattro caratteri. Conkv webhook update,--verifysenza--verify-secret-filemantiene il segreto memorizzato finché il fornitore resta lo stesso, e--clear-verifyrimuove la verifica e il suo segreto.--verifye--signingsi escludono a vicenda.--handshake VENDORèmicrosoft_graph,monday,trellooazure_event_grid, e--clear-handshakelo rimuove. Slack e Asana rispondono ai propri handshake tramite--verify.
--verify | Intestazione | Cosa viene firmato | Marca temporale |
|---|---|---|---|
github | X-Hub-Signature-256 | HMAC-SHA256 del corpo | Nessuno |
stripe | Stripe-Signature | HMAC-SHA256 della marca temporale, di un punto e del corpo; qualsiasi v1 può corrispondere | 5 minuti |
shopify | X-Shopify-Hmac-Sha256 | HMAC-SHA256 del corpo, in base64 | Nessuno |
slack | X-Slack-Signature | HMAC-SHA256 di v0:, della marca temporale, di due punti e del corpo | X-Slack-Request-Timestamp, 5 minuti |
linear | Linear-Signature | HMAC-SHA256 del corpo | webhookTimestamp nel corpo, 1 minuto |
vercel | x-vercel-signature | HMAC-SHA1 del corpo | Nessuno |
asana | X-Hook-Signature | HMAC-SHA256 del corpo, con il X-Hook-Secret dell’handshake come chiave | Nessuno |
generic_hmac | L’--verify-header che indichi | HMAC-SHA256 del corpo oppure, con un --verify-timestamp-header, della marca temporale, di un punto e del corpo | --verify-tolerance |
La chiave di ogni HMAC è il testo del segreto come lo mostra il fornitore (quello di Stripe include whsec_). Una firma viene verificata sul corpo esattamente come è arrivato, in tempo costante, prima che l’invio consumi budget di scrittura, e viene giudicata prima della sua marca temporale: timestamp_stale significa sempre che il segreto era giusto. Un corpo può essere JSON, un modulo o multipart/form-data, dove un campo di testo è body.FIELD e i file vengono contati, non letti.
| Fornitore | screenRIG risponde | Invii successivi |
|---|---|---|
Slack (--verify slack) | Il url_verification firmato con il suo challenge; una persona che prova con curl può inviare invece il segreto del webhook | Firmati con il segreto di firma |
Asana (--verify asana) | L’X-Hook-Secret dell’handshake, che conserva sigillato come chiave di ogni X-Hook-Signature. Lo stesso segreto di nuovo è un nuovo tentativo; uno diverso viene rifiutato come handshake_invalid | X-Hook-Signature |
Microsoft Graph (--handshake microsoft_graph) | Il ?validationToken= decodificato come text/plain | Portano il segreto del webhook |
monday.com (--handshake monday) | Il challenge che invia, restituito come JSON | Portano il segreto del webhook |
Trello (--handshake trello) | Un controllo HEAD risponde 200 senza corpo, solo per questo webhook | Portano il segreto del webhook |
Azure Event Grid (--handshake azure_event_grid) | {"validationResponse": "CODE"} | Portano il segreto del webhook |
Un handshake riceve risposta solo per un webhook configurato per quel fornitore, prima che venga richiesta qualsiasi credenziale, a una richiesta che è quell’handshake, e mai da un webhook disattivato. Non scrive nulla, non viene mai fatturato e non consuma budget di frequenza. Microsoft Graph, monday.com, Trello e Azure Event Grid non inviano alcuna intestazione che screenRIG verifichi, quindi le loro consegne sono accettate solo con il segreto del webhook. Azure Event Grid lo porta come intestazione di consegna statica, Authorization: Bearer srkw_…, contrassegnata come segreta, e i suoi eventi arrivano come array, quindi una mappatura legge body[0].
| Fornitore | Nelle impostazioni del fornitore |
|---|---|
| GitHub | Settings, Webhooks, Add webhook: la Payload URL è l’url del webhook, il tipo di contenuto è application/json, e lo stesso segreto. Il ping di GitHub è firmato e accettato |
| Stripe | Workbench, Webhooks: aggiungi l’url e rivela il suo segreto di firma. Mentre Stripe ruota un segreto invia un v1 per ciascuno e uno qualsiasi dei due è accettato; poi sostituisci il segreto memorizzato con kv webhook update --verify stripe --verify-secret-file FILE |
| Shopify | Iscriviti con l’url in formato JSON. Il segreto è il segreto client dell’app |
| Slack | La Request URL della Events API è l’url, e il segreto è il segreto di firma dell’app. Un comando slash invia un modulo: {{body.text}}, {{body.user_name}} |
| Linear | Nelle impostazioni dell’API crea un webhook con l’url e copia il suo segreto di firma. Il webhookTimestamp del corpo deve essere entro un minuto dall’orologio del server |
| Vercel | Team settings, Webhooks: creane uno con l’url. Vercel mostra il segreto una sola volta |
| Asana | Crea il webhook con --verify asana: non ha ancora un segreto e rifiuta gli eventi come secret_pending. Poi crea il webhook Asana con target impostato sull’url, e l’handshake imposta il segreto. Per adottare un nuovo segreto, esegui kv webhook update con --clear-verify, poi di nuovo con --verify asana |
| Microsoft Graph | Crea la sottoscrizione con notificationUrl impostato sull’url |
| monday.com | Esegui create_webhook con l’url |
| Trello | POST /1/webhooks con callbackURL impostato sull’url |
| Azure Event Grid | Crea la sottoscrizione agli eventi con l’url come endpoint del webhook, e aggiungi l’intestazione di consegna qui sopra |
echo '{"title":"{{body.repository.full_name}}","body":"{{body.head_commit.message}}"}' |
screenrig kv webhook create --card crd_01EXAMPLEBOARD0000000000 --description "Pushes" \
--verify github --verify-secret-file github.secret --map -
Un mittente che firma con il proprio HMAC indica l’intestazione, la codifica e, se firma una marca temporale, l’intestazione della marca temporale:
echo '{"title":"{{body.sensor}}","body":"{{body.state}}"}' |
screenrig kv webhook create --card crd_01EXAMPLEBOARD0000000000 --verify generic_hmac --verify-secret-file acme.secret \
--verify-header X-Acme-Signature --verify-encoding base64 --verify-timestamp-header X-Acme-Time --verify-tolerance 120 \
--map -
ts=$(date +%s); body='{"sensor":"door","state":"open"}'
sig=$(printf '%s.%s' "$ts" "$body" | openssl dgst -sha256 -hmac "$SECRET" -binary | openssl base64 -A)
curl "$URL" -H "Content-Type: application/json" -H "X-Acme-Time: $ts" -H "X-Acme-Signature: $sig" -d "$body"
Ogni errore dà lo stesso 404 di qualsiasi altro rifiuto. kv webhook deliveries mostra il motivo, e un handshake compare con l’esito handshake:
| Motivo | Significato |
|---|---|
signature_missing | È impostata una verifica del fornitore e l’invio non portava né il segreto né l’intestazione del fornitore |
signature_invalid | L’intestazione è malformata o non corrisponde al corpo |
timestamp_missing | La firma richiede una marca temporale che l’invio non portava |
timestamp_stale | La firma è valida e la sua marca temporale è fuori finestra |
secret_pending | Una verifica Asana attende ancora il suo handshake |
handshake_invalid | La richiesta è l’handshake di un fornitore e non può ricevere risposta |
kv webhook update#
Modifica un webhook di scheda: descrizione, mappatura, documenti per chiave, stato di attivazione, firma, verifica del fornitore o handshake.
kv webhook update <webhook_id> --card CARD_ID [--description TEXT] [--map FILE|-] [--clear-map]
[--key-template TEMPLATE] [--clear-key-template] [--enable|--disable] [--signing|--no-signing]
[--verify VENDOR [--verify-secret-file FILE|-] [--verify-header NAME] [--verify-encoding hex|base64]
[--verify-timestamp-header NAME] [--verify-tolerance SECONDS]] [--clear-verify]
[--handshake VENDOR] [--clear-handshake]| Parametro | Tipo | Obbligatorio | Predefinito | Note |
|---|---|---|---|---|
<webhook_id> | string | sì | nessuno | L’ID webhook kvw_. |
--card CARD_ID | string | sì | nessuno | L'ID scheda crd_. |
--description TEXT | string | no | nessuno | Cosa invia, massimo 200 byte. Non deve contenere credenziali. |
--map FILE | path | no | nessuno | Sostituisce la mappatura con un oggetto JSON letto da un file, oppure - per stdin. Non insieme a --clear-map. |
--clear-map | boolean | no | spento | Rimuovi la mappatura: l'oggetto inviato diventa il documento. |
--key-template TEMPLATE | string | no | nessuno | Imposta il modello di chiave che assegna la chiave ai documenti, come room-{screen.field.room}. Non insieme a --clear-key-template. |
--clear-key-template | boolean | no | spento | Torna a scrivere il documento proprio della scheda. |
--enable / --disable | boolean | no | spento | --disable risponde a ogni invio come a un segreto errato finché non si usa --enable. |
--signing / --no-signing | boolean | no | spento | --signing richiede l’intestazione di firma e mostra il segreto di firma una sola volta; un webhook che già firma mantiene il suo segreto, che kv webhook rotate-secret --signing sostituisce. --no-signing smette di richiederla. Non insieme a --verify. |
--verify VENDOR | string | no | nessuno | Sostituisce la verifica del fornitore: github, stripe, shopify, slack, linear, vercel, asana o generic_hmac. Senza --verify-secret-file, il segreto memorizzato viene mantenuto se il fornitore è lo stesso, così un’intestazione o una finestra può cambiare da sola; un fornitore diverso richiede il proprio. Non insieme a --clear-verify. |
--verify-secret-file FILE | path | no | il segreto memorizzato | Legge il segreto del fornitore da un file, oppure - per stdin (mai come argomento). asana non ne accetta. Una sola opzione legge stdin. |
--verify-header NAME | string | con generic_hmac | nessuno | L’intestazione che porta la firma, da 1 a 100 lettere, cifre, - o _. |
--verify-encoding ENCODING | string | no | hex | Con generic_hmac: hex o base64; può iniziare con sha256=. |
--verify-timestamp-header NAME | string | no | nessuno | Con generic_hmac: un’intestazione che porta l’ora Unix in secondi o in millisecondi con 13 cifre. |
--verify-tolerance SECONDS | integer | no | 300 | Con --verify-timestamp-header: quanto il timestamp può discostarsi dall’orologio del server, da 1 a 86400. |
--clear-verify | boolean | no | spento | Smette di accettare la firma del fornitore e dimentica il suo segreto. Una verifica Asana accetta un nuovo handshake solo dopo --clear-verify e di nuovo --verify asana. |
--handshake VENDOR | string | no | nessuno | Imposta l’handshake a cui risponde l’URL: microsoft_graph, monday, trello o azure_event_grid. Non insieme a --clear-handshake. |
--clear-handshake | boolean | no | spento | Smette di rispondere all’handshake del fornitore. |
È richiesta almeno una modifica.
screenrig kv webhook update kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --map alert-map.json
screenrig kv webhook update kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --verify stripe --verify-secret-file stripe.secret
screenrig kv webhook update kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --clear-verifyLa busta è il webhook. data.signing_secret compare una sola volta, nella risposta che ha attivato la firma. Dopo un aggiornamento interrotto o ambiguo, riesegui lo stesso comando: riutilizza la chiave di idempotenza salvata.
kv webhook deliveries#
Leggi il registro delle consegne di un webhook di scheda, dal più recente, degli ultimi sette giorni.
kv webhook deliveries <webhook_id> --card CARD_ID [--limit N]| Parametro | Tipo | Obbligatorio | Predefinito | Note |
|---|---|---|---|---|
<webhook_id> | string | sì | nessuno | L’ID webhook kvw_. |
--card CARD_ID | string | sì | nessuno | L'ID scheda crd_. |
--limit N | number | no | 100 | Quante consegne restituire, da 1 a 100. |
screenrig kv webhook deliveries kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000Ogni voce ha at, outcome (written, unchanged, refused, invalid o handshake), reason (credentials, signature per una ScreenRig-Signature fallita, disabled, body, mapping, card_data_invalid, rate_limited, internal o un motivo del fornitore dalla tabella sopra), detail, status, bytes, files (le parti file di un invio multipart, che vengono ignorate), revision e request_id. Non viene memorizzato alcun corpo, intestazione o credenziale, e un invio a un indirizzo sbagliato non lascia alcuna riga.