社内chatworkにVIPチャンネルを作った話


がいよう

社内slackにVIPチャンネルを作った話

上記エントリが面白かったのでchatwork版を作りました。

やりたいこと

  • 匿名チャンネルと、発言するbotアカウントを用意する。
  • botアカウントでChatwork Webhookを使う。
  • WebhookをAWS API Gatewayで受け取り、Lambdaを発火する。
  • LambdaからChatwork APIを使いbotアカウントで匿名チャンネルへ発言する。

やっていきましょう

Chatworkをやる

匿名チャンネルと、発言するbotアカウントを作ります。
匿名チャンネルには一緒に遊びたいユーザーを全員追加しておきます。
botアカウントを作成したら、ChatWork画面右上のアカウント名 > API設定から

作成したbotアカウントでAPIが利用出来るよう設定しておきます。
※chatworkはAPIを利用する際管理者の許可が必要な場合があります。

APIが使えるようになったらまずAPI Tokenを作成します。(後で使います)
また、新規Webhookを作成しておきます。

URLは後から変えられるのでここでは適当で大丈夫です。
イベントがアカウントイベントになっていればOK。
名前は適当につけてください。

AWSをやる

ChatWorkのWebhookから送信されるリクエストをLambdaで検証してみた
まずこれを読みます。読みました。雰囲気を掴むことができます。

AWS Lambdaに新規関数を作成します。
今回はPythonを使いますので、ランタイムはPython3.7等にしておいてください。

作成したら、トリガーの追加から

API Gatewayを登録します。

こんな感じに設定します。
手っ取り早く動かすためにセキュリティの設定を全て無視していますが、必要に応じて設定してください。

ラムダの設定画面に戻ると

画像下部のように、少し下にAPIのエンドポイントが出てると思います。
これをchatworkのWebhook URLへ設定しておきましょう。

ところで、脳がrequests以外からPOSTを送出したがらなかったため、ソースコード側の準備として
[検証]LambdaのLayer機能を早速試してみた #reinvent
上記エントリを参考にrequestsモジュールを持つLayerを追加します。
勿論、urllibの使い方を思い出す手段もあります。コストが安いと感じる方を選択してください。

関数の作成

import json
import os
import requests

def lambda_handler(event, context):
    url = f'https://api.chatwork.com/v2/rooms/{os.environ['ROOM_ID']}/messages'
    headers = {'X-ChatWorkToken': os.environ['CW_KEY']}
    content = json.loads(event['body'])  # eventのbodyは文字列で来るようです
    content = content['webhook_event']['body']  # アカウントイベントにした場合、ここにメッセージ本文があります
    content = content.replace('[To:bot_account_id] botアカウント名さん\n', '')  # Toで発言された時入ってくる文言を除去
    params = {'body': f'{content}'}
    res = requests.post(url, data=params, headers=headers)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

最低限動作太郎です。これをLambdaのエディタ部分に書きます。
本当はWebhookに乗ってくるTOKENを使った認証を入れたり、処理の結果に応じてreturnする内容を変えたりした方がいいです。
これを書いた人はとにかく動かしたかったのでそういうのを端折りました。すみません

エディタ部分のすぐ下に環境変数の入力欄があると思いますので、匿名チャンネルのIDと匿名アカウントのAPI Tokenを設定してください。
チャンネルのIDは、ブラウザでそのチャンネルを開いた時URLに入っている数字を使っています。

動かしてみる

動きます。良かったですね。

おわりに

残業の息抜きに作ったので、内容に自信がありません。
もしマサカリを投げたくなったらどんどん投げてください。
あとなんかダメなのあったら指摘して下さい。消しますので。

ありがとうございました。