PowerShell から Hangouts Chat の Webhook に POST する方法

# やりたいこと

PowerShellで（つまり Windows の環境から）、Hangouts Chat のチャットルームに POST する。

# 前提環境

| Skill | Version |
|:---|:---|
| `Windows PowerShell` | `5.1+` |
| `Hangouts Chat` | ※2018/07/20 時点 |

# 経緯

会社全体で [G Suite](https://gsuite.google.co.jp/intl/ja/) の導入するためのトライアルを行っており、Hangouts Chat の Webhook や bot の作成を試していたので、実際に動かした結果を残しておきます。

## そもそも [Hangouts Chat](https://gsuite.google.co.jp/intl/ja/products/chat/) って何？

- G Suite を導入すると無料で使うことができるチャットシステムです。
- UI は [Slack](https://slack.com/intl/ja-jp) や [LINE](https://line.me/ja/) を使ったことがある方なら直感的に使うことができるようになっています。
- Google の『ハングアウト』は複数存在します。（ **ややこしくてはじめに理解するのに苦労しました** :sweat: ）

## ハングアウトの種類

`ハングアウト`、`Hangouts Chat`、`Hangouts Meet` の3つほど存在し、それぞれ Android, iOS のアプリが提供されています。

| # | App | Browser | Android | iOS | 誰向け |
|:--|:--|:--|:--|:--|:--|
| 1 | ハングアウト | [ハングアウト - Browser](https://hangouts.google.com/?hl=ja) | [ハングアウト - Google Play](https://play.google.com/store/apps/details?id=com.google.android.talk&hl=ja) | [ハングアウト - Apple Store](https://itunes.apple.com/jp/app/%E3%83%8F%E3%83%B3%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88/id643496868?mt=8) | 誰でも使える一般向け |
| 2 | Hangouts Chat | [Hangouts Chat - Browser](https://chat.google.com/) | [Hangouts Chat - Google Play](https://play.google.com/store/apps/details?id=com.google.android.apps.dynamite&hl=ja) | [Hangouts Chat - Apple Store](https://itunes.apple.com/jp/app/hangouts-chat/id1163852619?mt=8) | G Suite 契約ユーザー向け |
| 3 | Hangouts Meet | [Hangouts Meet - Browser](https://meet.google.com/) | [Hangouts Meet - Google Play](https://play.google.com/store/apps/details?id=com.google.android.apps.meetings&hl=ja) | [Hangouts Meet - Apple Store](https://itunes.apple.com/jp/app/hangouts-meet/id1013231476?mt=8)| G Suite 契約ユーザー向け |

### 1. ハングアウト <img src="https://lh3.ggpht.com/5puZavg4x2pThSTJgos1sARWoARea7tzr_B8AWEwn2lV05RoXo9M8BM2XwcvwG6nIGc=s180-rw" width="50px" height="50px" />

- [Chrome の拡張機能](https://chrome.google.com/webstore/detail/google-hangouts/nckgahadagoaajjgafhacjanaoiihapd?hl=ja) をインストールすると、タスクアイコンに常駐して専用のウィンドウで管理できます。  
- メンションなどの機能はなし
- **G Suite を契約してチャットシステムを利用するときは後述の Hangouts Chat を使います。**

### 2. Hangouts Chat <img src="https://lh3.googleusercontent.com/vfrhg7RiAagkYgQh3-8FE6bcxjss5SdGc1tFmuwgGFrDzK_zxNXA3qWtWvC8Bpi_Gw=s180-rw" width="50px" height="50px" />

2018/03/01 に掲載された Tech Crunch の記事を拝読しました。（このときはまだ G Suite のトライアルはスタートしていませんでした。） 

#### [Google、Hangouts Chat、G Suite向け正式版公開――Slackのライバルを狙う - jp.techcrunch.com/2018/03/01](https://jp.techcrunch.com/2018/03/01/2018-02-28-hangout-chat-googles-slack-competitor-comes-out-of-beta/)

> Googleのビジネス向けリアルタイム・コミュニケーション、Hangouts Chatが正式版として一般公開された。今後G Suiteのコアの一部を構成することとなるこのサービスはCloud Next 2017でHangouts Meetと同時に発表された。Meetは即時に一般公開されたが、Chatは「招待オンリー」のベータ版だった。今回やっとGoogleはG Suiteユーザー全員に向けてChatを公開することとなった（公開は1週間程度かけて順次行われる予定）。

一般公開されたのって割と最近なんですね。既に G Suite を導入されている企業は存在を知っていたかも？

- Chrome の拡張機能ではありませんが、[デスクトップアプリ](https://get.google.com/chat/) も提供されています。（Electron製かな？）
- **当記事の内容はこの Hangouts Chat を使います。**

### 3. Hangouts Meet <img src="https://lh3.googleusercontent.com/dNVT9ozasUGWx5L62LYd9qPUkx0PbrjbPZW7nrNbzV96l5n6eJnw_ygT8Mp91PWUEWlB=s180-rw" width="50px" height="50px" />

- **ビデオ会議専用アプリです。** 
- Hangouts Chat でビデオ会議をしようとすると起動するイメージです。


## 実施手順

話を元に戻し、本題の PowerShell で Hangouts Chat の Webhook に POST してみます。
基本的には公式のドキュメント [Setting up an incoming webhook](https://developers.google.com/hangouts/chat/how-tos/webhooks) の通り進めていけばできます。

### 1. Webhook に POST するためのフォーマットを確認

[Setting up an incoming webhook](https://developers.google.com/hangouts/chat/how-tos/webhooks) にアクセスし、`Send messages to the chat room` という項目に記載されているフォーマットを確認します。

```js
http_obj.request(
  uri=THE_SAVED_URL,
  method='POST',
  headers=message_headers,
  body=dumps(bot_message),
)
```

### 2. 検証用に POST 先のチャットルームを作成する

`チャットルームを作成` を選択。

<img src="https://docs.google.com/drawings/d/e/2PACX-1vQmaL2A2kiKOa7Rs5kh4-7xrsmDFjE45XVN2OR_8HDRVy1eEb5qxCvkPeu8QHqrsOulDyNLuEhhdvAe/pub?w=453&amp;h=477">

チャットルームの名前を適当に設定して `作成` を選択。

<img src="https://docs.google.com/drawings/d/e/2PACX-1vSADugvw0UBI1Xl0133yApEtJ4FCB7_jwzjpSw9LmBG3B40MkHOy4nFc3vPPWw0A2i8xnJ0Aa-uYmf4/pub?w=1387&amp;h=207">

### 3. Webhook を作成する

作成したチャットルームに入って、`Webhook を設定` を選択。

<img src="https://docs.google.com/drawings/d/e/2PACX-1vSWIaoZoS8fX04Xwyemr1PbQRVxQ9q10CkthYqfuQYPPRa3w39v0yPXWRfbyD4tuwHRdXC5d_IbhykW/pub?w=494&amp;h=598">

<img src="https://docs.google.com/drawings/d/e/2PACX-1vQYkiNM76CW5FrLoo-7HSS8Z4kAALtZzrek_pRTiNAmaWjjCZOFkvOw15_bt1xq8v4YxJepAo3Prv0U/pub?w=1043&amp;h=527">

コピーボタンでクリップボードにコピー。 **このURIは後で使います。**

<img src="https://docs.google.com/drawings/d/e/2PACX-1vQjnEY5olYoq9JshFRUybT4_UsStYO0bNVg2-pUjBQ5hgfa03exkheUWbXMHa7QvkMAKZPOTTU62pCU/pub?w=1034&amp;h=407">

### 4. PowerShell から Webhook を叩くコード

```powershell:PsToGhc.ps1
# さっきコピーした Webhook URI
$url = 'https://chat.googleapis.com/v1/spaces/xxxxxxxxxx/messages?key=xxxxxxxxxx&token=xxxxxxxxxx'

# Message
$botMessage = @{
  text = 'Hello World'
}

# POST
Invoke-RestMethod -Uri $url -Method POST -ContentType 'application/json; charset=UTF-8' `
  -Body (ConvertTo-Json $botMessage)
```

PowerShell コンソールで実行した結果、正常に処理が完了すると下記のように表示されます。

```text:実行結果
name         : spaces/xxxxxxxxxx/messages/xxxxxxxxxx.xxxxxxxxxx
sender       : @{name=users/xxxxxxxxxx; displayName=PowerShellからpost; avatarUrl=; email=; type=BOT}
text         : Hello World
cards        : {}
previewText  :
annotations  : {}
thread       : @{name=spaces/xxxxxxxxxx/threads/xxxxxxxxxx}
space        : @{name=spaces/xxxxxxxxxx; type=ROOM; displayName=bot test room}
fallbackText :
argumentText : Hello World
createTime   : 2018-07-21T08:27:54.238959Z
```

チャットルームに POST された結果。

<img src="https://docs.google.com/drawings/d/e/2PACX-1vTDeS5pTG-YW35_03OKz5Rn7BJ-RBEsGpU-sMt0Bsfd8oQlh9-q9zoC4q3GIv_-ISTAPRTy9QP9fwEY/pub?w=1387&amp;h=198">

## 実施してみた感想

- 簡単の一言でした。（ちなみに Node.js でも試したところさくっと動きました。）
- [Slack](https://slack.com/intl/ja-jp) を導入しているような会社やチームだと当たり前のように運用されていると思いますが、如何せんチャットのカルチャーが無いところからはじめるので、 **どれだけ便利なのか？** を広めていきたいところです。
- チャットボットの作成も割と簡単でしたので、別の記事に書こうと考えております。