ドキュメント

カード CLI コマンド

カードタイプの検索、カードの作成、パラメーターとライブデータの設定、プレビュー、署名付き Webhook による外部システムからのデータ更新。

ここにあるコマンドはすべて CLI リファレンスの説明どおりに動作します。グローバルフラグ、JSON 出力、終了コード、リビジョン、再試行。

カード

カードの種類を調べ、インスタンスを作成し、そのライブデータを更新します。プレイリストには返されたカードIDを配置します。

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
パラメータータイプ必須デフォルトメモ
cards list --tag TAGstringいいえなしカタログのタグに一致します。
cards list --category CATEGORYstringいいえなしカタログのカテゴリに一致します。--tag と併用すると、両方に一致するカードだけが対象です。
cards show <id>stringはいなしcards list で得られるカタログのカードID(たとえば gauge)。
card create --type IDstringはいなしcards list で得られるカタログのカードID。
card create --major Nintegerいいえ現在のメジャーバージョンカタログのメジャーバージョンを固定します。
card create --file FILEパスはいなし静的パラメーターを最大 1 MiB の JSON オブジェクトで指定します(stdin の場合は -)。
<id>stringはいなしcard show、card params、card delete、card data が受け取る crd_ のカードID。
card params --file FILEパスはいなし新しい静的パラメーターで、card create と同じ方法で読み込みます。古いものは即座に置き換わります。
card data put --file FILEパスはいなしデータドキュメントを JSON オブジェクトで指定します(stdin の場合は -)。ドキュメント全体が置き換わります。
card data put --ttl DURATIONstringいいえなしこの時間が過ぎるとデータを空にします。オフラインのスクリーンも対象です: 30m、12h、1d など、1s から 365d まで。--expires-at とは併用できません。
card data put --expires-at INSTANTstringいいえなしこの ISO 8601 のタイムスタンプ(タイムゾーン付き)にデータを空にします。どちらのオプションも付けずに書き込むと、以前の有効期限は消えます。
card data put --expect-rev REVISIONstringいいえなしデータがまだこのリビジョン(card data get が示すもの)の場合のみ書き込みます。古い値は revision_conflict(exit 6)になります。
card preview <type|id>stringはいなしカタログのカードID、または crd_ のカードID(そのインスタンスを自身のパラメーターとデータで描画します)。
card preview --output FILEパスはいなしPNG をここに書き出します。親ディレクトリは作成されます。
card preview --params FILEパスいいえなし静的プロパティを JSON オブジェクトで指定します。
card preview --data FILEパスいいえなし動的ドキュメントを JSON オブジェクトで指定します。
card preview --feed FILEパスいいえなしホストフィードのドキュメントを JSON オブジェクトで指定します。カードが必要とするフィードを省略した場合は報告されます。
card preview --width PX / --height PXintegerいいえ1920 / 1080画像サイズ。1 から 8192 です。
card preview --layout LAYOUTstringいいえfullfull、free、center、wide、header、footer、corner、chip、strip のいずれか。描画するレイアウトです。
card preview --anchor ANCHORstringいいえなしcorner または chip レイアウトの隅、もしくは strip の辺。
card preview --now ISOstringいいえ現在の時刻この ISO 8601 の時刻で時計を固定します。
card preview --timezone ZONEstringいいえこのマシンのものこの IANA タイムゾーンで描画します(たとえば America/Vancouver)。

cards show はカードの params_schema と data_schema、静的・動的プロパティ、ティア、レイアウト、フィード、およびプレイリストのページにコピーできる例を表示します。card create はインスタンスの crd_ ID を返し、応答が失われたあとに同じコマンドを再実行すると、保存済みの冪等キーが再利用されます。

card data put はプレイリストを再公開せずに、ドキュメントを即座に置き換えます。カード自身の検証は、表示できないドキュメントを拒否します(card_data_invalid)。有効期限を設定すると、何も更新しない場合にすべてのスクリーンでデータが空になります。card delete はインスタンスとそのデータを削除し、プレイリストが配置している間は resource_conflict(exit 5)を返します。

card preview はローカルの Chromium または Chrome でカードを描画して PNG を書き出します。何も公開しません。通常のブラウザーがどれもインストールされていない場合は、SCREENRIG_BROWSER にブラウザーのパスを設定してください。data.file は書き出したパス、data.unrendered はプレビューで描画できなかったもの(たとえば指定しなかったホストフィード)の一覧です。公開する前に画像を開いて確認してください。組み込みカードでは、各カードのレイアウト、プロパティ、フィードを説明しています。

カードWebhook

カードWebhookは、1枚のカードのデータドキュメントを書き込むURLです。CMS、POS、スクリプトなどの外部システムが、HTTP POST 1回でカードにデータを送れます。kv webhook create、list、rotate-secret、delete は --app-id の代わりに --card CARD_ID を受け付け、両方は指定できません。以下の update と deliveries はカード専用です。カードは最大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

カードWebhookの作成にキーは不要です。--map FILE(stdin の場合は -)がマッピングで、--key-template でキー別ドキュメントを書き込み、--signing で署名を有効にし、--verify と --handshake でベンダー独自の送信を受け付けます(ベンダーの署名とハンドシェイク)。レスポンスには data.secret と、署名する場合は data.signing_secret が含まれ、それぞれ一度だけ表示されます。

送信側の認証はアプリケーションWebhookと同じです。srkw_… シークレットを使った Authorization: Bearer <secret>、またはWebhook IDをユーザー名にしたHTTP Basicで認証するため、URLしか受け付けない送信側には https://kvw_ID:srkw_…@api.screenrig.ai/… が使えます。ボディは最大1 MiBのJSONまたは application/x-www-form-urlencoded で、繰り返されたフォーム名は配列になります。マッピングがない場合、送信されたオブジェクトがカードのデータドキュメントになります。

マッピングは、リクエストボディからドキュメントを組み立てるJSONテンプレートです。{{body.alert.title}} や {{body.items[0].name}} のようなプレースホルダーを含む文字列はテキストになり、プレースホルダー1つだけの文字列は値の型を保ちます。パスは body または query(URLのクエリパラメーター)で始まり、何も保持しないパスはテキスト内では空になり、単独の値は省略されます。$each は item と index を使える状態で配列をマッピングし、$group は $by で最初に現れた順にグループ化し、$number は 1,234.50、$3.50、3,50 €、12% を読み取り(小数点がカンマの場合は "$decimal": "," を追加)、$bool は true、yes、y、1、x を読み取り、$text は $max と併用してテキストを切り詰めます。テンプレートは保存時に検証され、invalid_request が失敗した箇所を示します。

{
  "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 は、カード自身のドキュメントの代わりに、キー別のドキュメントを書き込みます。テンプレートは {screen.field.NAME} トークンを含むカードデータキー(たとえば room-{screen.field.room})で、マッピング後のオブジェクト(マッピングがない場合は送信された本文)は {fields, document} オブジェクトの documents 配列だけを持ちます。各 fields オブジェクトがテンプレートを埋め、各 document は生成されたキーのもとに書き込まれます。同じテンプレートを data に指定したページ項目は、各スクリーンに自分のフィールドに対応するドキュメントを表示します。すべてのドキュメントは、どれかが書き込まれる前に検証され、重複したキーは拒否されます。ストレージの障害でバッチの一部だけが書き込まれることがあります。その場合は同じ本文と同じ Idempotency-Key で再送してください。送信で省略したキーはデータを保ち、Webhook は有効期限を設定しません。キー別ドキュメントにマッピングの例があります。

投稿は、カード自身のデータとして検査されます。card_data_invalid がパスを示し、何も書き込まれません。カードの現在のものと同じドキュメントには unchanged と答え、何も書き込まないので、スクリーンは起こされません。受け付けた投稿はエージェントリクエストの上限に数えられません。Webhookは1分あたり最大120件の投稿を受け付け、Idempotency-Key ヘッダーは送信側の再試行を24時間重複排除します。

誤ったアドレス、誤ったまたは欠けたシークレット、無効化されたWebhook、欠けたまたは誤った署名、そしてすべての GET には同じ 404 が返るため、リンクのプレビューや当てずっぽうでは何もわかりません。理由は kv webhook deliveries でわかります。

--signing を指定すると、すべての送信に ScreenRig-Signature: t=<unix seconds>,v1=<hex> も必要です。v1 は、署名シークレット whsec_… による t、ドット、生のボディの HMAC-SHA256 で、t はサーバーの時計から5分以内でなければなりません。これは screenRIG 自身のWebhook署名と同じ形式です。

ベンダーの署名とハンドシェイク

ベンダーは独自の方法で送信に署名し、中にはシークレットをそもそも送れないものもあります。カード Webhook は、シークレットの代わりにベンダーの署名を検証し、ベンダーのセットアップのハンドシェイクに応答できるため、GitHub、Stripe、Shopify、Slack、Linear、Vercel、Asana、Microsoft Graph、monday.com、Trello、Azure Event Grid は、中継なしで直接送信できます。HMAC で署名するその他の送信元も使えます。kv webhook create で --verify と --handshake を設定し、kv webhook update で変更します。

  • --verify VENDOR はベンダー独自の署名を受け付けます。--verify-secret-file FILE(stdin の場合は -、引数では渡せません)にベンダーが示すシークレットを入れます。generic_hmac では、--verify-header NAME が署名を運ぶヘッダーを指定し、--verify-encoding は hex(既定)または base64、--verify-timestamp-header NAME は Unix 時刻を運ぶヘッダーを指定し、--verify-tolerance SECONDS はサーバーの時計からどこまでずれてよいかを表します(既定は 300)。ベンダーの有効な署名を持つ送信は、Webhook 自身の srkw_ シークレットなしで受け付けられ、そのシークレットも並行して使えます。ベンダーのシークレットは封印して保存され、set とその末尾 4 文字の hint だけが表示されます。kv webhook update では、--verify-secret-file なしの --verify はベンダーが同じである限り保存済みのシークレットを保ち、--clear-verify は検証とそのシークレットを削除します。--verify と --signing は同時に使えません。
  • --handshake VENDOR は microsoft_graph、monday、trello、azure_event_grid のいずれかで、--clear-handshake で削除されます。Slack と Asana は、--verify を通じて自分たちのハンドシェイクに応答します。
--verifyヘッダー署名の対象タイムスタンプ
githubX-Hub-Signature-256本文の HMAC-SHA256なし
stripeStripe-Signatureタイムスタンプ、ドット、本文の HMAC-SHA256。v1 のいずれかが一致すれば有効です5 分
shopifyX-Shopify-Hmac-Sha256本文の HMAC-SHA256 (base64)なし
slackX-Slack-Signaturev0:、タイムスタンプ、コロン、本文の HMAC-SHA256X-Slack-Request-Timestamp、5 分
linearLinear-Signature本文の HMAC-SHA256本文内の webhookTimestamp、1 分
vercelx-vercel-signature本文の HMAC-SHA1なし
asanaX-Hook-Signatureハンドシェイクの X-Hook-Secret をキーとする、本文の HMAC-SHA256なし
generic_hmac指定した --verify-header本文の HMAC-SHA256。--verify-timestamp-header がある場合は、タイムスタンプ、ドット、本文の HMAC-SHA256--verify-tolerance

すべての HMAC のキーは、ベンダーが表示するとおりのシークレットのテキストです (Stripe のものには whsec_ が含まれます)。署名は、受信したままの本文に対して、一定時間で、送信が書き込み予算を消費する前に検証され、タイムスタンプより先に判定されます。そのため timestamp_stale は常にシークレットが正しかったことを意味します。本文は JSON、フォーム、multipart/form-data のいずれかで、テキストフィールドは body.FIELD になり、ファイルは数えるだけで読み取りません。

ベンダーscreenRIG の応答その後の送信
Slack (--verify slack)署名済みの url_verification とその challenge。curl でテストする人は、代わりに Webhook のシークレットを送れます署名シークレットで署名
Asana (--verify asana)ハンドシェイクの X-Hook-Secret。これを封印して保持し、すべての X-Hook-Signature のキーとして使います。同じシークレットをもう一度送ると再試行として扱われ、別のものは handshake_invalid として拒否されますX-Hook-Signature
Microsoft Graph (--handshake microsoft_graph)デコードした ?validationToken= を text/plain としてWebhook のシークレットを付けて送ります
monday.com (--handshake monday)送られてくる challenge を JSON としてそのまま返しますWebhook のシークレットを付けて送ります
Trello (--handshake trello)HEAD のチェックには、この Webhook に限り、本文なしで 200 を返しますWebhook のシークレットを付けて送ります
Azure Event Grid (--handshake azure_event_grid){"validationResponse": "CODE"}Webhook のシークレットを付けて送ります

ハンドシェイクに応答するのは、そのベンダー用に設定された Webhook だけで、認証情報が求められる前に、そのハンドシェイクであるリクエストに対してのみ行い、無効な Webhook は応答しません。何も書き込まず、課金されず、レート予算も消費しません。Microsoft Graph、monday.com、Trello、Azure Event Grid は screenRIG が検証するヘッダーを送らないため、その配信は Webhook のシークレットがある場合にのみ受け付けられます。Azure Event Grid は、シークレットとして指定した静的な配信ヘッダー Authorization: Bearer srkw_… でそれを渡し、イベントは配列で届くため、マッピングは body[0] を読み取ります。

ベンダーベンダーの設定画面
GitHubSettings、Webhooks、Add webhook: Payload URL には Webhook の url、コンテンツタイプには application/json、そして同じシークレットを指定します。GitHub の ping は署名され、受け付けられます
StripeWorkbench、Webhooks: url を追加し、その署名シークレットを表示します。Stripe がシークレットをローテーションしている間は、それぞれに対して v1 を送り、どちらも受け付けられます。その後、保存済みのシークレットを kv webhook update --verify stripe --verify-secret-file FILE で置き換えます
Shopifyurl を JSON 形式で登録します。シークレットはアプリのクライアントシークレットです
SlackEvents API の Request URL は url で、シークレットはアプリの署名シークレットです。スラッシュコマンドはフォームを送信します: {{body.text}}、{{body.user_name}}
LinearAPI の設定で url を指定して Webhook を作成し、その署名シークレットをコピーします。本文の webhookTimestamp は、サーバーの時計から 1 分以内でなければなりません
VercelTeam settings、Webhooks: url を指定して作成します。Vercel はシークレットを 1 回だけ表示します
Asana--verify asana で Webhook を作成します。まだシークレットがなく、イベントは secret_pending として拒否されます。次に、target を url にして Asana の Webhook を作成すると、ハンドシェイクがシークレットを設定します。新しいシークレットにするには、--clear-verify を付けて kv webhook update を実行し、もう一度 --verify asana を指定します
Microsoft GraphnotificationUrl を url にしてサブスクリプションを作成します
monday.comurl を指定して create_webhook を実行します
TrellocallbackURL を url にして POST /1/webhooks
Azure Event GridWebhook エンドポイントとして url を指定してイベントサブスクリプションを作成し、上記の配信ヘッダーを追加します
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 -

独自の HMAC で署名する送信元は、ヘッダー、エンコード、そしてタイムスタンプに署名する場合はタイムスタンプのヘッダーを指定します:

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"

失敗はすべて、他の拒否と同じ 404 になります。kv webhook deliveries で理由を確認でき、ハンドシェイクは結果 handshake として表示されます:

理由意味
signature_missingベンダー検証が設定されていて、送信にシークレットもベンダーのヘッダーも含まれていませんでした
signature_invalidヘッダーの形式が正しくないか、本文と一致しません
timestamp_missing署名にはタイムスタンプが必要ですが、送信に含まれていませんでした
timestamp_stale署名は有効ですが、タイムスタンプが許容範囲外です
secret_pendingAsana の検証が、まだハンドシェイクを待っています
handshake_invalidリクエストはベンダーのハンドシェイクですが、応答できません

kv webhook update#

カードWebhookを変更します。説明、マッピング、キー別ドキュメント、有効状態、署名、ベンダー検証、ハンドシェイクを変更できます。

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]
パラメータータイプ必須デフォルトメモ
<webhook_id>stringはいなしkvw_Webhook ID
--card CARD_IDstringはいなしcrd_ のカードID。
--description TEXTstringいいえなしこれに送信するもの、最大200バイト。認証情報を含んではいけません。
--map FILEパスいいえなしファイルから読み込んだ JSON オブジェクトでマッピングを置き換えます(stdin の場合は -)。--clear-map とは併用できません。
--clear-mapbooleanいいえオフマッピングを削除します。送信されたオブジェクトがそのままドキュメントになります。
--key-template TEMPLATEstringいいえなしドキュメントのキーを決めるキーテンプレートを設定します(たとえば room-{screen.field.room})。--clear-key-template とは併用できません。
--clear-key-templatebooleanいいえオフカード自身のドキュメントを書き込む動作に戻します。
--enable / --disablebooleanいいえオフ--enable を指定するまで、--disable はすべての送信に誤ったシークレットと同じ応答を返します。
--signing / --no-signingbooleanいいえオフ--signing は署名ヘッダーを必須にし、署名シークレットを一度だけ表示します。すでに署名する Webhook は既存のシークレットを保ち、それは kv webhook rotate-secret --signing で置き換えます。--no-signing は署名ヘッダーの要求をやめます。--verify とは併用できません。
--verify VENDORstringいいえなしベンダー検証を置き換えます: github、stripe、shopify、slack、linear、vercel、asana、generic_hmac のいずれか。--verify-secret-file を省略すると、ベンダーが同じ場合は保存済みのシークレットが保たれるので、ヘッダーや時間幅だけを変更できます。別のベンダーには専用のシークレットが必要です。--clear-verify とは併用できません。
--verify-secret-file FILEパスいいえ保存済みのシークレットベンダーのシークレットをファイルから読み込みます(stdin の場合は -、引数では渡せません)。asana は不要です。stdin から読めるオプションは 1 つだけです。
--verify-header NAMEstringgeneric_hmac とともになし署名を運ぶヘッダー。1 から 100 文字の英数字、-、_ です。
--verify-encoding ENCODINGstringいいえhexgeneric_hmac の場合: hex または base64。先頭に sha256= が付いていてもかまいません。
--verify-timestamp-header NAMEstringいいえなしgeneric_hmac の場合: Unix 時刻を秒、または 13 桁のミリ秒で運ぶヘッダー。
--verify-tolerance SECONDSintegerいいえ300--verify-timestamp-header の場合: タイムスタンプがサーバーの時計からずれてよい範囲。1 から 86400 です。
--clear-verifybooleanいいえオフベンダーの署名の受け付けをやめ、そのシークレットを破棄します。Asana の検証は、--clear-verify のあとに再度 --verify asana を指定した場合にのみ新しいハンドシェイクを受け付けます。
--handshake VENDORstringいいえなしこの URL が応答するハンドシェイクを設定します: microsoft_graph、monday、trello、azure_event_grid のいずれか。--clear-handshake とは併用できません。
--clear-handshakebooleanいいえオフベンダーのハンドシェイクへの応答をやめます。

変更を少なくとも 1 つ指定してください。

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

エンベロープはWebhookです。data.signing_secret は、署名を有効にした応答にだけ一度だけ含まれます。更新が中断またはあいまいになった場合は、同じコマンドを再実行してください。保存済みの冪等キーが再利用されます。

kv webhook deliveries#

カードWebhookの配信ログを、過去7日分、新しい順に読み取ります。

kv webhook deliveries <webhook_id> --card CARD_ID [--limit N]
パラメータータイプ必須デフォルトメモ
<webhook_id>stringはいなしkvw_Webhook ID
--card CARD_IDstringはいなしcrd_ のカードID。
--limit Nnumberいいえ100返す配信の件数。1〜100。
screenrig kv webhook deliveries kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

各項目には at、outcome (written、unchanged、refused、invalid、handshake)、reason (credentials、署名に失敗した ScreenRig-Signature を表す signature、disabled、body、mapping、card_data_invalid、rate_limited、internal、または上の表のベンダー別の理由)、detail、status、bytes、files (マルチパート送信のファイル部分で、無視されます)、revision、request_id があります。本文、ヘッダー、認証情報は保存されず、誤ったアドレスへの送信は行を残しません。

ほかのコマンドグループ