Google Apps ScriptによるWebhook処理

==== *サードパーティツール:*
==== HabiticaアカウントのWebhookを設定するサードパーティツールがあります。

* Habitica Webhook Editor（未翻訳）
* Habitica Api-Helper Tool（未翻訳）

* クエストが終わった
 タスクアクティビティ
* タスクが更新された
* タスクが削除された
* タスクがチェックされた
 ユーザーアクティビティ
* 乗騎が育った
 グループチャットが届いた

クエスト招待:

```
{"type":"questInvited","group":{"id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","name":"My Habitica Party"},"quest":{"key":"dilatoryDistress2"},"webhookType":"questActivity","user":{"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}}

```

クエスト完了:

```
{"type":"questFinished","group":{"id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","name":"My Habitica Party"},"quest":{"key":"butterfly"},"webhookType":"questActivity","user":{"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}}

```

タスクが作成された:

```
{"type":"created","task":{"challenge":{},"group":{"approval":{"required":false,"approved":false,"requested":false},"assignedUsers":[],"sharedCompletion":"singleCompletion"},"completed":false,"collapseChecklist":false,"type":"todo","notes":"","tags":[],"value":0,"priority":1,"attribute":"str","byHabitica":false,"text":"Add To Do","_id":"0ec3a680-3c8b-4e61-88f1-2848782226e9","reminders":[],"checklist":[],"createdAt":"2020-03-30T10:23:10.956Z","updatedAt":"2020-03-30T10:23:10.956Z","userId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","id":"0ec3a680-3c8b-4e61-88f1-2848782226e9"},"webhookType":"taskActivity","user":{"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}}

```

タスクがスコア付けされた:

```
{"type":"scored","direction":"up","delta":1,"task":{"challenge":{},"group":{"approval":{"required":false,"approved":false,"requested":false},"assignedUsers":[],"sharedCompletion":"singleCompletion"},"completed":true,"collapseChecklist":false,"type":"todo","notes":"","tags":[],"value":1,"priority":1,"attribute":"str","byHabitica":false,"checklist":[],"reminders":[],"createdAt":"2020-03-30T10:23:10.956Z","updatedAt":"2020-03-30T10:27:28.236Z","_id":"0ec3a680-3c8b-4e61-88f1-2848782226e9","text":"Add To Do","userId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","dateCompleted":"2020-03-30T10:27:28.204Z","id":"0ec3a680-3c8b-4e61-88f1-2848782226e9"},"user":{"_tmp":{"quest":{"progressDelta":1.475,"collection":1},"drop":{"target":"Desert","canDrop":true,"value":1,"key":"Potatoe","type":"Food","dialog":"You've found a Potato!"}},"stats":{"buffs":{"str":0,"int":0,"per":0,"con":0,"stealth":0,"streaks":false,"snowball":false,"spookySparkles":false,"shinySeed":false,"seafoam":false},"training":{"int":0,"per":0,"str":0,"con":0},"hp":46.35717357116706,"mp":136.94362288135568,"exp":199218.27891340942,"gp":3319.1888075206516,"lvl":931,"class":"wizard","points":0,"str":0,"con":0,"int":100,"per":0,"toNextLevel":226140,"maxHealth":50,"maxMP":527},"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"},"webhookType":"taskActivity"}

```

「タスクを削除する」でWebアプリに投稿された完全なデータ：

（e.postData.contentsにバックスラッシュが含まれていることがわかります。vardataContents = JSON.parse（e.postData.contents）を使用してサブストリングを解析してください

```
{"parameter":{},"contextPath":"","contentLength":672,"queryString":"","parameters":{},"postData":{"type":"application/json","length":672,"contents":"{\"type\":\"deleted\",\"task\":{\"challenge\":{},\"group\":{\"approval\":{\"required\":false,\"approved\":false,\"requested\":false},\"assignedUsers\":[],\"sharedCompletion\":\"singleCompletion\"},\"completed\":false,\"collapseChecklist\":false,\"type\":\"todo\",\"notes\":\"\",\"tags\":[],\"value\":-33.71057310093657,\"priority\":1,\"attribute\":\"str\",\"byHabitica\":false,\"checklist\":[],\"reminders\":[],\"createdAt\":\"2020-02-09T10:46:46.723Z\",\"updatedAt\":\"2020-03-30T10:22:43.497Z\",\"_id\":\"dc5d0acd-e889-4c42-850f-9110aef8be33\",\"text\":\"test\",\"userId\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\"id\":\"dc5d0acd-e889-4c42-850f-9110aef8be33\"},\"webhookType\":\"taskActivity\",\"user\":{\"_id\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"}}","name":"postData"}}

```

Webhookが処理されるための要件は、Webhookを監視するサーバーです。したがって、Habitica-webhookをセットアップする前に、サーバー側をセットアップしてください。

## サーバーサイド（バックエンド）

#### Google Apps Server Script (Web-App)

特定の事前定義されたwebhookアクションの1つが実行されると、Habiticaはリクエストをサーバーに送信し、サーバーがリクエストを処理します。このサーバーにはURL経由でアクセスできます。サーバーは、HabiticaからのPOSTリクエストを監視します。たとえば、Google AppsスクリプトでdoPost(e)は、次の例のような関数を使用してください。

**Google Apps** を使用して、**サーバースクリプトをWebアプリとして展開する**ことにより、このようなサーバーを設定できます。

https://developers.google.com/apps-script/guides/web

#### 自動承認スクリプトの例

以下は、クエストへの招待を即座に自動承諾するサーバースクリプトの例です。

```
function doPost(e) {
  var habiticaUserId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; // your Habitica UserId
  var habiticaApiToken = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; // your Habitica API-Token (don't share, = password!)

  try {
    var dataContents = JSON.parse(e.postData.contents);
    var type = dataContents.type;
  } catch (err) {}

  if (type == 'questInvited') {
    var params = {
      "method": "post",
      "headers" : {
        "x-client": habiticaUserId + "-Webhook Script questInvited",
        "x-api-user": habiticaUserId,
        "x-api-key": habiticaApiToken
      }
    }

    var url = "https://habitica.com/api/v3/groups/party/quests/accept";
    UrlFetchApp.fetch(url, params);
  }

  return HtmlService.createHtmlOutput();
}

```

その他の例：（Googleシートにデータを表示する可能性を含む）

https://github.com/PitiTheGrey/google-script-Webhook-Server-for-Habitica

#### サーバースクリプトの処理

バージョンの保存、管理、およびサーバースクリプトのWebアプリとしての展開：

 「Webアプリ」としてデプロイ
 「ウェブアプリ」の設定
-「スクリプトを 'Yourself'として実行します。」（グーグルスクリプト上の「私」）
 WebアプリのURL

## 質問、トラブルシューティング

一般的な質問は、HabiticaのAspiring Comrades Guild（英語）で行うことができます。

Api-Helper-Toolまたは「PitiTheGrey」サンプルサーバースクリプトに関する特定の質問については、Habitican Wardrobes Guild（英語）で質問してください。

Piti! 2020年3月30日

英語版のWebhook\_processing\_with\_Google\_Apps\_Scriptの情報を正確に反映していることを保証しません。翻訳に時間を要するため、最新の情報ではない場合があります。このページは、未実装、未翻訳、すでにゲームには存在しないコンテンツにリンクしている可能性があります。翻訳に参加したい場合は、Habitica日本語訳ギルド へお越しください。