Documentazione

Card: comandi CLI

Trova i tipi di card, crea una card, imposta parametri e dati live, vedine l’anteprima e aggiorna i dati da sistemi esterni con webhook firmati.

Ogni comando funziona come descritto nel riferimento CLI: flag globali, output JSON, codici uscita, revisioni e ritentativi.

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
ParametroTipoObbligatorioPredefinitoNote
cards list --tag TAGstringnonessunoCorrisponde a un tag del catalogo.
cards list --category CATEGORYstringnonessunoCorrisponde a una categoria del catalogo. Con --tag, una scheda deve corrispondere a entrambe.
cards show <id>stringsìnessunoL’ID scheda del catalogo ottenuto da cards list, come gauge.
card create --type IDstringsìnessunoL’ID scheda del catalogo ottenuto da cards list.
card create --major Nintegernoversione principale attualeBlocca una versione principale del catalogo.
card create --file FILEpathsìnessunoI parametri statici come oggetto JSON di al massimo 1 MiB, oppure - per stdin.
<id>stringsìnessunoL’ID scheda crd_ che accettano card show, card params, card delete e card data.
card params --file FILEpathsìnessunoI nuovi parametri statici, letti come per card create. Sostituiscono subito i vecchi.
card data put --file FILEpathsìnessunoIl documento dati come oggetto JSON, oppure - per stdin. Sostituisce l’intero documento.
card data put --ttl DURATIONstringnonessunoSvuota 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 INSTANTstringnonessunoSvuota 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 REVISIONstringnonessunoScrive 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>stringsìnessunoUn ID di scheda del catalogo, oppure un ID di scheda crd_ per disegnare quell’istanza con i suoi parametri e dati.
card preview --output FILEpathsìnessunoScrive qui il PNG. Le cartelle genitore sono create.
card preview --params FILEpathnonessunoProprietà statiche come oggetto JSON.
card preview --data FILEpathnonessunoIl documento dinamico come oggetto JSON.
card preview --feed FILEpathnonessunoIl 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 PXintegerno1920 / 1080Dimensione dell’immagine, da 1 a 8192.
card preview --layout LAYOUTstringnofullfull, free, center, wide, header, footer, corner, chip o strip: il layout da disegnare.
card preview --anchor ANCHORstringnonessunoL’angolo di un layout corner o chip, oppure il bordo di uno strip.
card preview --now ISOstringnol’ora correnteBlocca l’orologio a questo istante ISO 8601.
card preview --timezone ZONEstringnoquello di questa macchinaDisegna 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_ID

La 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 VENDOR accetta la firma propria di un fornitore, con --verify-secret-file FILE (o - per stdin, mai come argomento) che contiene il segreto mostrato dal fornitore. Per generic_hmac, --verify-header NAME indica l’intestazione che porta la firma, --verify-encoding è hex (predefinito) o base64, --verify-timestamp-header NAME indica 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 segreto srkw_ del webhook, che continua a funzionare accanto. Il segreto del fornitore è memorizzato sigillato e mostrato solo come set e un hint dei suoi ultimi quattro caratteri. Con kv webhook update, --verify senza --verify-secret-file mantiene il segreto memorizzato finché il fornitore resta lo stesso, e --clear-verify rimuove la verifica e il suo segreto. --verify e --signing si escludono a vicenda.
  • --handshake VENDOR è microsoft_graph, monday, trello o azure_event_grid, e --clear-handshake lo rimuove. Slack e Asana rispondono ai propri handshake tramite --verify.
--verifyIntestazioneCosa viene firmatoMarca temporale
githubX-Hub-Signature-256HMAC-SHA256 del corpoNessuno
stripeStripe-SignatureHMAC-SHA256 della marca temporale, di un punto e del corpo; qualsiasi v1 può corrispondere5 minuti
shopifyX-Shopify-Hmac-Sha256HMAC-SHA256 del corpo, in base64Nessuno
slackX-Slack-SignatureHMAC-SHA256 di v0:, della marca temporale, di due punti e del corpoX-Slack-Request-Timestamp, 5 minuti
linearLinear-SignatureHMAC-SHA256 del corpowebhookTimestamp nel corpo, 1 minuto
vercelx-vercel-signatureHMAC-SHA1 del corpoNessuno
asanaX-Hook-SignatureHMAC-SHA256 del corpo, con il X-Hook-Secret dell’handshake come chiaveNessuno
generic_hmacL’--verify-header che indichiHMAC-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.

FornitorescreenRIG rispondeInvii successivi
Slack (--verify slack)Il url_verification firmato con il suo challenge; una persona che prova con curl può inviare invece il segreto del webhookFirmati 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_invalidX-Hook-Signature
Microsoft Graph (--handshake microsoft_graph)Il ?validationToken= decodificato come text/plainPortano il segreto del webhook
monday.com (--handshake monday)Il challenge che invia, restituito come JSONPortano il segreto del webhook
Trello (--handshake trello)Un controllo HEAD risponde 200 senza corpo, solo per questo webhookPortano 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].

FornitoreNelle impostazioni del fornitore
GitHubSettings, 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
StripeWorkbench, 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
ShopifyIscriviti con l’url in formato JSON. Il segreto è il segreto client dell’app
SlackLa 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}}
LinearNelle 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
VercelTeam settings, Webhooks: creane uno con l’url. Vercel mostra il segreto una sola volta
AsanaCrea 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 GraphCrea la sottoscrizione con notificationUrl impostato sull’url
monday.comEsegui create_webhook con l’url
TrelloPOST /1/webhooks con callbackURL impostato sull’url
Azure Event GridCrea 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:

MotivoSignificato
signature_missingÈ impostata una verifica del fornitore e l’invio non portava né il segreto né l’intestazione del fornitore
signature_invalidL’intestazione è malformata o non corrisponde al corpo
timestamp_missingLa firma richiede una marca temporale che l’invio non portava
timestamp_staleLa firma è valida e la sua marca temporale è fuori finestra
secret_pendingUna verifica Asana attende ancora il suo handshake
handshake_invalidLa 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]
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--card CARD_IDstringsìnessunoL'ID scheda crd_.
--description TEXTstringnonessunoCosa invia, massimo 200 byte. Non deve contenere credenziali.
--map FILEpathnonessunoSostituisce la mappatura con un oggetto JSON letto da un file, oppure - per stdin. Non insieme a --clear-map.
--clear-mapbooleannospentoRimuovi la mappatura: l'oggetto inviato diventa il documento.
--key-template TEMPLATEstringnonessunoImposta il modello di chiave che assegna la chiave ai documenti, come room-{screen.field.room}. Non insieme a --clear-key-template.
--clear-key-templatebooleannospentoTorna a scrivere il documento proprio della scheda.
--enable / --disablebooleannospento--disable risponde a ogni invio come a un segreto errato finché non si usa --enable.
--signing / --no-signingbooleannospento--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 VENDORstringnonessunoSostituisce 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 FILEpathnoil segreto memorizzatoLegge il segreto del fornitore da un file, oppure - per stdin (mai come argomento). asana non ne accetta. Una sola opzione legge stdin.
--verify-header NAMEstringcon generic_hmacnessunoL’intestazione che porta la firma, da 1 a 100 lettere, cifre, - o _.
--verify-encoding ENCODINGstringnohexCon generic_hmac: hex o base64; può iniziare con sha256=.
--verify-timestamp-header NAMEstringnonessunoCon generic_hmac: un’intestazione che porta l’ora Unix in secondi o in millisecondi con 13 cifre.
--verify-tolerance SECONDSintegerno300Con --verify-timestamp-header: quanto il timestamp può discostarsi dall’orologio del server, da 1 a 86400.
--clear-verifybooleannospentoSmette 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 VENDORstringnonessunoImposta l’handshake a cui risponde l’URL: microsoft_graph, monday, trello o azure_event_grid. Non insieme a --clear-handshake.
--clear-handshakebooleannospentoSmette 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-verify

La 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]
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--card CARD_IDstringsìnessunoL'ID scheda crd_.
--limit Nnumberno100Quante consegne restituire, da 1 a 100.
screenrig kv webhook deliveries kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

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

Altri gruppi di comandi