カード
カードの種類を調べ、インスタンスを作成し、そのライブデータを更新します。プレイリストには返されたカード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 TAG | string | いいえ | なし | カタログのタグに一致します。 |
cards list --category CATEGORY | string | いいえ | なし | カタログのカテゴリに一致します。--tag と併用すると、両方に一致するカードだけが対象です。 |
cards show <id> | string | はい | なし | cards list で得られるカタログのカードID(たとえば gauge)。 |
card create --type ID | string | はい | なし | cards list で得られるカタログのカードID。 |
card create --major N | integer | いいえ | 現在のメジャーバージョン | カタログのメジャーバージョンを固定します。 |
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 DURATION | string | いいえ | なし | この時間が過ぎるとデータを空にします。オフラインのスクリーンも対象です: 30m、12h、1d など、1s から 365d まで。--expires-at とは併用できません。 |
card data put --expires-at INSTANT | string | いいえ | なし | この ISO 8601 のタイムスタンプ(タイムゾーン付き)にデータを空にします。どちらのオプションも付けずに書き込むと、以前の有効期限は消えます。 |
card data put --expect-rev REVISION | string | いいえ | なし | データがまだこのリビジョン(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 PX | integer | いいえ | 1920 / 1080 | 画像サイズ。1 から 8192 です。 |
card preview --layout LAYOUT | string | いいえ | full | full、free、center、wide、header、footer、corner、chip、strip のいずれか。描画するレイアウトです。 |
card preview --anchor ANCHOR | string | いいえ | なし | corner または chip レイアウトの隅、もしくは strip の辺。 |
card preview --now ISO | string | いいえ | 現在の時刻 | この ISO 8601 の時刻で時計を固定します。 |
card preview --timezone ZONE | string | いいえ | このマシンのもの | この 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 | ヘッダー | 署名の対象 | タイムスタンプ |
|---|---|---|---|
github | X-Hub-Signature-256 | 本文の HMAC-SHA256 | なし |
stripe | Stripe-Signature | タイムスタンプ、ドット、本文の HMAC-SHA256。v1 のいずれかが一致すれば有効です | 5 分 |
shopify | X-Shopify-Hmac-Sha256 | 本文の HMAC-SHA256 (base64) | なし |
slack | X-Slack-Signature | v0:、タイムスタンプ、コロン、本文の HMAC-SHA256 | X-Slack-Request-Timestamp、5 分 |
linear | Linear-Signature | 本文の HMAC-SHA256 | 本文内の webhookTimestamp、1 分 |
vercel | x-vercel-signature | 本文の HMAC-SHA1 | なし |
asana | X-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] を読み取ります。
| ベンダー | ベンダーの設定画面 |
|---|---|
| GitHub | Settings、Webhooks、Add webhook: Payload URL には Webhook の url、コンテンツタイプには application/json、そして同じシークレットを指定します。GitHub の ping は署名され、受け付けられます |
| Stripe | Workbench、Webhooks: url を追加し、その署名シークレットを表示します。Stripe がシークレットをローテーションしている間は、それぞれに対して v1 を送り、どちらも受け付けられます。その後、保存済みのシークレットを kv webhook update --verify stripe --verify-secret-file FILE で置き換えます |
| Shopify | url を JSON 形式で登録します。シークレットはアプリのクライアントシークレットです |
| Slack | Events API の Request URL は url で、シークレットはアプリの署名シークレットです。スラッシュコマンドはフォームを送信します: {{body.text}}、{{body.user_name}} |
| Linear | API の設定で url を指定して Webhook を作成し、その署名シークレットをコピーします。本文の webhookTimestamp は、サーバーの時計から 1 分以内でなければなりません |
| Vercel | Team settings、Webhooks: url を指定して作成します。Vercel はシークレットを 1 回だけ表示します |
| Asana | --verify asana で Webhook を作成します。まだシークレットがなく、イベントは secret_pending として拒否されます。次に、target を url にして Asana の Webhook を作成すると、ハンドシェイクがシークレットを設定します。新しいシークレットにするには、--clear-verify を付けて kv webhook update を実行し、もう一度 --verify asana を指定します |
| Microsoft Graph | notificationUrl を url にしてサブスクリプションを作成します |
| monday.com | url を指定して create_webhook を実行します |
| Trello | callbackURL を url にして POST /1/webhooks |
| Azure Event Grid | Webhook エンドポイントとして 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_pending | Asana の検証が、まだハンドシェイクを待っています |
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_ID | string | はい | なし | crd_ のカードID。 |
--description TEXT | string | いいえ | なし | これに送信するもの、最大200バイト。認証情報を含んではいけません。 |
--map FILE | パス | いいえ | なし | ファイルから読み込んだ JSON オブジェクトでマッピングを置き換えます(stdin の場合は -)。--clear-map とは併用できません。 |
--clear-map | boolean | いいえ | オフ | マッピングを削除します。送信されたオブジェクトがそのままドキュメントになります。 |
--key-template TEMPLATE | string | いいえ | なし | ドキュメントのキーを決めるキーテンプレートを設定します(たとえば room-{screen.field.room})。--clear-key-template とは併用できません。 |
--clear-key-template | boolean | いいえ | オフ | カード自身のドキュメントを書き込む動作に戻します。 |
--enable / --disable | boolean | いいえ | オフ | --enable を指定するまで、--disable はすべての送信に誤ったシークレットと同じ応答を返します。 |
--signing / --no-signing | boolean | いいえ | オフ | --signing は署名ヘッダーを必須にし、署名シークレットを一度だけ表示します。すでに署名する Webhook は既存のシークレットを保ち、それは kv webhook rotate-secret --signing で置き換えます。--no-signing は署名ヘッダーの要求をやめます。--verify とは併用できません。 |
--verify VENDOR | string | いいえ | なし | ベンダー検証を置き換えます: github、stripe、shopify、slack、linear、vercel、asana、generic_hmac のいずれか。--verify-secret-file を省略すると、ベンダーが同じ場合は保存済みのシークレットが保たれるので、ヘッダーや時間幅だけを変更できます。別のベンダーには専用のシークレットが必要です。--clear-verify とは併用できません。 |
--verify-secret-file FILE | パス | いいえ | 保存済みのシークレット | ベンダーのシークレットをファイルから読み込みます(stdin の場合は -、引数では渡せません)。asana は不要です。stdin から読めるオプションは 1 つだけです。 |
--verify-header NAME | string | generic_hmac とともに | なし | 署名を運ぶヘッダー。1 から 100 文字の英数字、-、_ です。 |
--verify-encoding ENCODING | string | いいえ | hex | generic_hmac の場合: hex または base64。先頭に sha256= が付いていてもかまいません。 |
--verify-timestamp-header NAME | string | いいえ | なし | generic_hmac の場合: Unix 時刻を秒、または 13 桁のミリ秒で運ぶヘッダー。 |
--verify-tolerance SECONDS | integer | いいえ | 300 | --verify-timestamp-header の場合: タイムスタンプがサーバーの時計からずれてよい範囲。1 から 86400 です。 |
--clear-verify | boolean | いいえ | オフ | ベンダーの署名の受け付けをやめ、そのシークレットを破棄します。Asana の検証は、--clear-verify のあとに再度 --verify asana を指定した場合にのみ新しいハンドシェイクを受け付けます。 |
--handshake VENDOR | string | いいえ | なし | この URL が応答するハンドシェイクを設定します: microsoft_graph、monday、trello、azure_event_grid のいずれか。--clear-handshake とは併用できません。 |
--clear-handshake | boolean | いいえ | オフ | ベンダーのハンドシェイクへの応答をやめます。 |
変更を少なくとも 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_ID | string | はい | なし | crd_ のカードID。 |
--limit N | number | いいえ | 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 があります。本文、ヘッダー、認証情報は保存されず、誤ったアドレスへの送信は行を残しません。