Webhook のテスト: hkob の雑記録 (87)

はじめに

hkob の雑記録の第87回目は、昨日公表された Webhook の状況を確認してみます。

インテグレーションの設定

テストのため、新しい webhook_test というインテグレーションを作成しました。今までの「設定」「基本情報」のほかに「Webhook」という欄が登場しています。早速サブスクリプションを作成してみます。

Webhook タブ

ボタンを押すと以下のような画面になりました。デフォルトのままだとコメントに権限をつかないので、警告が出ていますね。

コメント権限の警告

設定に戻り、コメントの読み取りに権限をつけます。

コメントの読み取り権限を付加

再度、サブスクリプションを作成に戻ると警告はなくなっていました。

警告が消えた画面

イベントは全部で17件あるようです。スクリーンショットで入りきらないので、テキストに起こします。

  1. ページ (8件)
    1. ページコンテンツを更新 (page.content_updated)
    2. ページを作成 (page.created)
    3. ページを削除 (page.deleted)
    4. ページをロック (page.locked)
    5. ページを移動 (page.moved)
    6. ページのプロパティを更新 (page.properties_updated)
    7. ページを復元 (page.undeleted)
    8. ページをロック解除 (page.unlocked)
  2. データベース (6件)
    1. 更新されたデータベースコンテンツ (database.content_updated)
    2. 作成されたデータベース (database.created)
    3. 削除されたデータベース (database.deleted)
    4. 移動されたデータベース (database.moved)
    5. データベーススキーマを更新 (database.schema_updated)
    6. データベースを復元 (database.undeleted)
  3. コメント (3件)
    1. 作成されたコメント (comment.created)
    2. 削除されたコメント (comment.deleted)
    3. 更新されたコメント (comment.updated)

とりあえず、受け側の URL がないと話にならないので、どんなデータが渡されるかを確認するエンドポイントを作成してみましょう。

Google Spreadsheet の作成

まず、GAS の受け口となる Spreadsheet を作ります。Webhook test としてみました。

作成した Spreadsheet

しばらく使わないうちに Google Spreadsheet もアップデートされていてびっくりしました。とりあえず Apps Script を起動します。

App Script

まず、受け取ったものをシートに保存する関数を作ります。

writeSheet

中身はこんな感じです。writeSheet は data を最終行の一行下に追加するだけのものです。test 関数で test という文字列を書いてみます。

function writeSheet(data) {
  const sheet = SpreadsheetApp.getActiveSheet()
  const line = sheet.getLastRow()
  const range = sheet.getRange('A' + (line + 1));
  range.setValue(data)
}

function test() {
  writeSheet('test')
}

最初に実行するとスプレッドシートの書き込みに関する権限確認があります。ここはスクリーンショットを撮り忘れましたが、特に問題はないでしょう。実行すると test という文字列が記入されました。

テキストが追加された Spreadsheet

サブスクリプションの確認

最初に Webhook のサブスクリプションを作成すると、Notion は Webhook URL に 1 回限りの POST リクエストを送信するそうです。この時送られるのが verification_token です。説明書きによると、このような形のトークンが作られるそうです。

{
  "verification_token": "secret_tMrlL1qK5vuQAh1b6cZGhFChZTSYJlce98V0pYn7yBl"
}

POST で送られたデータをそのまま Spreadsheet に書き込んでみましょう。

function doPost(e) {
  writeSheet(e.postData.getDataAsString())
  return ContentService.createTextOutput(JSON.stringify({status: 'success'}))
      .setMimeType(ContentService.MimeType.JSON)
}

そのまま新しいデプロイをしてみます。

新しいデプロイ

デプロイが作成されました。この URL を使って、Webhook を作成してみます。すでに2回間違ってしまったので、バージョン3なのはご了承ください。最初、アクセスできるユーザを全員に直すのを忘れてしまったためです。

作成した Webhook

Webhook を作成すると「認証の必要があります」と出てきています。

URL を登録

「認証する」としたら、トークンを送信したそうです。Spreadsheet を確認してみます。

認証するをクリック後

Spreadsheet に verification_token が記録されていました。これを上のダイアログに登録します。

記録された verification_token

無事に認証されました。

認証成功

インテグレーションの接続

作成したインテグレーションを接続してみます。

インテグレーションを接続

これで編集するたびに GAS にイベントが送られるはずなのですが、実行数を見ても何も来ていないようです。時間切れのため、残りは明日確認します。

と思ったのですが、朝起きてみたら以下のように動作しておりました。

取得した JSON たち

実行ログを見ると深夜に一気に実行されていました。これくらいの遅延を意識した方がいいようですね。

実行ログ

おわりに

とりあえず座談会の前までにテストができてよかったです。今日の Notion 座談会で解説するので、是非見てください。

hkob.notion.site