Skip to content
SEO Optimizer is live, Audit on page SEO and AI-search readiness. Try it free
Slack, Teams & Webhooks

ガイド

Slack・Teams・Webhookへのアラート

ScanverraのアラートをSlackチャンネル、Microsoft Teamsチャンネル、または独自のHTTPSエンドポイントに送信できます。スコアの低下やリスクのある変更を、チームが普段使っている場所で知ることができます。

TeamプランとEnterpriseプランで利用できます。チームのオーナーと管理者が「チーム」の「連携」から設定します。1つのチームにつき最大10件の連携を追加できます。

仕組み

  1. 1チームを開き、連携からSlack、Microsoft Teams、またはWebhookを追加します。
  2. 2受け取るアラートを選び、テスト送信をクリックしてメッセージが届くか確認します。
  3. 3予約スキャンや監視で何かが見つかると、実行が終わった時点でScanverraがアラートを送信します。

手動で実行したスキャンではアラートは送信されません。監視したいサイトやリポジトリは「予約スキャン」ページで予約してください。

送信できるアラート

各連携には、選択したアラートだけが届きます。Webhookでは、イベント名がX-Scanverra-Eventヘッダーとeventフィールドに入ります。

scan.score_dropped予約スキャンのスコアが前回の実行より10ポイントを超えて下がったとき。新たに見つかった内容が一覧で届きます。
scan.completed予約スキャンが結果付きで完了したとき。
scan.policy_failedEnterprise予約スキャンがチームポリシー(最低スコア、または重大な問題なし)を満たさなかったとき。理由が一覧で届きます。
payment_page.scripts_changedEnterprise監視中の決済ページが新しいスクリプトや変更されたスクリプトを読み込んだとき、またはContent-Security-Policyが変わったとき。
attack_surface.changedEnterprise監視中のドメインに新しいホストが見つかったとき、またはホストが乗っ取りのリスクを抱えたとき。
test誰かが「テスト送信」をクリックしたとき。

Slackを接続する

  1. 1Slackでアプリを開き、Incoming Webhooksを探して、アラートを受け取るチャンネルに追加します。
  2. 2WebhookのURLをコピーします。https://hooks.slack.com/で始まります。
  3. 3Scanverraで連携を追加し、Slackを選んでURLを貼り付け、アラートを選びます。

各アラートには見出し、最大5件の新しい問題、「Open report」ボタンが表示されます。

Microsoft Teamsを接続する

  1. 1Teamsのチャンネルでワークフローを開き、Webhook要求を受信したらチャネルに投稿するを選びます。
  2. 2ワークフローの設定を終え、表示されたURLをコピーします。
  3. 3Scanverraで連携を追加し、Microsoft Teamsを選んでURLを貼り付け、アラートを選びます。

各アラートは、見出し、新しい問題、「Open report」ボタンを含むカードとして届きます。

Webhook

Webhookを使えば、チケットの作成、当番担当者への通知、記録の保存など、どこにでもアラートを送れます。Scanverraはアラートごとに、JSON本文付きのHTTPS POSTを1回送信します。

リクエストヘッダー

Content-Type常にapplication/jsonです。
User-Agent送信元がScanverraであることを示します。Scanverra-Alerts/1.0
X-Scanverra-Eventイベント名です。本文のeventフィールドと同じ値です。scan.score_dropped
X-Scanverra-Timestampリクエストに署名した時刻(Unix秒)です。1762594212
X-Scanverra-Signaturesha256=の後に、タイムスタンプ、ドット、加工前の本文をつないだ文字列のHMAC-SHA256が続きます。鍵は署名シークレットです。sha256=9f2c…

リクエスト本文

スコア低下の例:

{
  "event": "scan.score_dropped",
  "sentAt": "2026-11-08T09:30:12.418Z",
  "summary": "Security Scan score dropped from 81 to 62 for shop.example.com",
  "data": {
    "target": "https://shop.example.com",
    "scanType": "security",
    "score": 62,
    "prevScore": 81,
    "reportUrl": "https://www.scanverra.com/security-scan/cm9x2k1",
    "newIssues": [
      "Missing Content-Security-Policy header",
      "jQuery 3.4.1 has known vulnerabilities"
    ]
  }
}

フィールド

eventイベント名。
sentAtアラートを送信した時刻(ISO 8601)。
summaryそのまま表示できる1行の説明。
data.targetスキャンしたURL、ドメイン、またはリポジトリの場合はowner/repo。
data.scanTypeaudit、seo、security、browser、repo、またはcrawl(複数ページのSEOクロール)。
data.score0〜100の新しいスコア。スコアのないアラート(監視とテスト)ではnull。
data.prevScore前回の実行のスコア、またはnull。
data.reportUrlレポートまたは監視ページへのリンク。
data.newIssues変更内容を説明する短い行の一覧。空の場合や含まれない場合もあります。

署名を検証する

Webhookを追加すると、Scanverraは署名シークレット(whsec_...)を一度だけ表示します。サーバーに保存し、すべてのリクエストを信頼する前に検証してください:

  1. 1JSONとして解析する前に、届いたままの加工前のリクエスト本文を読み取ります。
  2. 2タイムスタンプヘッダー、ドット、加工前の本文をつないだ文字列のHMAC-SHA256を、シークレットを鍵として計算します。
  3. 3署名ヘッダーと定数時間で比較し、タイムスタンプが5分より古いリクエストは拒否します。
import crypto from "node:crypto";
import express from "express";

const SECRET = process.env.SCANVERRA_WEBHOOK_SECRET; // whsec_...
const app = express();

// express.raw keeps the exact bytes Scanverra signed.
app.post("/scanverra", express.raw({ type: "application/json" }), (req, res) => {
  const timestamp = req.get("X-Scanverra-Timestamp") ?? "";
  const signature = req.get("X-Scanverra-Signature") ?? "";
  const expected = "sha256=" + crypto
    .createHmac("sha256", SECRET)
    .update(`${timestamp}.${req.body}`)
    .digest("hex");

  const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) <= 300;
  const valid = signature.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
  if (!fresh || !valid) return res.sendStatus(401);

  const alert = JSON.parse(req.body);
  console.log(alert.event, alert.summary);
  res.sendStatus(204); // answer fast, do slow work afterwards
});

app.listen(3000);

タイムスタンプも本文と一緒に署名されるため、傍受されたリクエストを後から再送することはできません。

配信のルール

  • 5秒以内に2xxのステータスで応答してください。時間のかかる処理は応答の後に行ってください。
  • 各アラートは1回だけ送信され、再試行されません。最後の配信が成功したかどうかは「連携」パネルで確認できます。
  • リダイレクトはたどらないため、最終的なURLを指定してください。
  • 公開されているHTTPSアドレスのみ使用できます。SlackのURLはhooks.slack.com、TeamsのURLはwebhook.office.comまたはPower Automate上のものに限ります。
  • TeamプランまたはEnterpriseプランが失効すると、チーム全体のアラートが止まります。
WebhookのURLと署名シークレットはパスワードと同じように扱ってください。SlackやTeamsのURLを知っている人は、そのチャンネルに投稿できます。Scanverraでは、保存済みのURLは一部を伏せて表示されます。シークレットを変更するには、連携を削除してから追加し直してください。

接続の準備はできましたか?

チームのオーナーと管理者なら、1分で連携を追加できます。最初の本番アラートの前にテストを送信しましょう。

連携を開く