AWS LambdaからGoogle Hangouts Chatに投稿してみた

先日、Google のビジネス向けメッセージングプラットフォーム「ハングアウト・チャット」が G Suite の1サービスとして正式公開されました

Bot 開発用の API が提供されているため、Slack のようにタスクの自動化やイベント通知を簡単に組み込むことができます。

今回は cURL/Python/AWS Lambda から Webhook を使って Hangouts Chat にメッセージ投稿する方法を紹介します。

前提

  • G Suite の利用アカウントがある
  • AWS の利用アカウントがある

流れ

以下の流れで作業します。

  1. チャットルームの作成
  2. Webhook の設定
  3. メッセージ投稿
    1.  cURL
    2.  Python
    3. AWS Lambda

1. チャットルームの作成

Google Hangouts Chat のサービスページに移動します。

https://chat.google.com/

画面左上のメニューからチャットルームを作成します。

今回は「テスト」という名前で作成します。

2. Webhook の設定

チャットルームのメニューから「Webhookを設定」を選択します。

「Webhook を追加」ボタンをクリックします。

ポップアップダイアログで「名前」を設定し、「保存」をクリックします。

ここで設定した名前は、Webhook 経由で投稿されたメッセージの投稿者の名前に利用されます。

Webhook の URL が生成されるため、控えます。

3. メッセージの投稿

  • cURL
  • Python
  • AWS Lambda

から Webhook 経由で投稿してみます。

Webhook API では Webhook URL に対して以下のような POST 投稿をします。

  • リクエストヘッダー
    • Content-type : application/json; charset=UTF-8
  • リクエストボディー : JSON オブジェクトを渡します
    • text : 投稿メッセージ

※ 図の引用元 https://developers.google.com/hangouts/chat/how-tos/webhooks

3-1. cURL

コマンドラインから cURL で Webhook URL に対して POST します。

$ curl -X POST https://WEBHOOK-URL \
--header "Content-Type: application/json; charset=UTF-8" \
--data '{"text":"hello from cURL"}'
{
  "name": "spaces/DUMMY/messages/DUMMY",
  "sender": {
    "name": "users/XXX",
    "displayName": "AWS",
    "avatarUrl": "",
    "email": "",
    "type": "BOT"
  },
  "text": "hello from cURL",
  "cards": [],
  "previewText": "",
  "annotations": [],
  "thread": {
    "name": "spaces/DUMMY/threads/DUMMY"
  },
  "space": {
    "name": "spaces/DUMMY",
    "type": "ROOM",
    "displayName": "テスト"
  },
  "fallbackText": "",
  "createTime": "2018-03-07T14:57:05.806431Z"
}

Hangouts Chat でメッセージを確認します。

3-2. Python

ローカルの Python 3 スクリプトから Webhook URL に対して POST します。

AWS Lambda に転用することを前提にlambda_handlerハンドラーを用意してコードを書きます。

事前に requests モジュールをインストールしておいて下さい。

from json import dumps, loads
import logging
import os
import requests

URL = os.environ['HANGOUT_WEBHOOK_URL']

def lambda_handler(event, context):
    body = event['body']
    bot_message = {
        'text' : body}

    message_headers = { 'Content-Type': 'application/json; charset=UTF-8'}

    response = requests.post(
        URL,
        headers=message_headers,
        data=dumps(bot_message),
    )

    return loads(response.text)

def test():
    print(lambda_handler({'body' : 'Hello from Python script!'}, None))

if __name__ == '__main__':
    test()

Webhook URL を環境変数に設定して、このスクリプトを実行します。

$ export HANGOUT_WEBHOOK_URL=https://chat.googleapis.com/v1/...
$ python hangout.py
{'thread': {'name': 'spaces/DUMMY/threads/DUMMY'}, 'annotations': [], 'fallbackText': '', 'cards': [], 'createTime': '2018-03-07T15:30:48.746047Z', 'sender': {'type': 'BOT', 'avatarUrl': '', 'email': '', 'name': 'users/DUMMY', 'displayName': 'AWS'}, 'space': {'type': 'ROOM', 'name': 'spaces/DUMMY', 'displayName': 'テスト'}, 'text': 'Hello from Python script!', 'name': 'spaces/DUMMY/messages/DUMMY', 'previewText': ''}

Hangouts Chat でメッセージを確認します。

AWS Lambda を前提としない Python スクリプトは、オフィシャルドキュメントを参照ください。

 

3-3. AWS Lambda

先程作った Python スクリプトを AWS Lambda に移植します。

Runtime に Python 3.6 を指定し、以下のコードで Lambda 関数を作成します。

Python コードは先程とほぼ同じものを利用しますが、 requests モジュールはインストール済みのものを利用するため、4行目のライブラリーimportの箇所だけを書き換えます。

from json import dumps, loads
import logging
import os
from botocore.vendored import requests # XXX Changed

URL = os.environ['HANGOUT_WEBHOOK_URL']

def lambda_handler(event, context):
    body = event['body']
    bot_message = {
        'text' : body}

    message_headers = { 'Content-Type': 'application/json; charset=UTF-8'}

    response = requests.post(
        URL,
        headers=message_headers,
        data=dumps(bot_message),
    )

    return loads(response.text)

def test():
    print(lambda_handler({'body' : 'Hello from Python script!'}, None))

if __name__ == '__main__':
    test()

Lambda 関数設定画面の「Environment variables」で HANGOUT_WEBHOOK_URL を設定します。

AWS Lambda のテストイベントを設定します。

{
  "body": "こんにちは、世界!"
}

AWS Lambda をテスト実行し Hangouts Chat でメッセージを確認します。

あとは SNS や CloudWatch Events などから Lambda 関数を呼び出せば、AWS 連携の完了です。

まとめ

今回は Google Hangouts Chat に Webhook 経由でメッセージ投稿する方法を紹介しました。

シンプルな POST リクエストを作成するだけでメッセージ投稿できるため、cURL や AWS Lambda など様々なクライアントからサクッとメッセージ投稿できます。

Webhook の性質上、一方的なメッセージ投稿しか行なえませんが、対話的な Bot を作成することも出来ます。通知に限定されない、より凝った利用をしたい場合は、そちらもご検討下さい。

参考