Help us understand the problem. What is going on with this article?

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

がいよう

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

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

やりたいこと

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

やっていきましょう

Chatworkをやる

匿名チャンネルと、発言するbotアカウントを作ります。
匿名チャンネルには一緒に遊びたいユーザーを全員追加しておきます。
botアカウントを作成したら、ChatWork画面右上のアカウント名 > API設定から
image.png
作成したbotアカウントでAPIが利用出来るよう設定しておきます。
※chatworkはAPIを利用する際管理者の許可が必要な場合があります。

APIが使えるようになったらまずAPI Tokenを作成します。(後で使います)
また、新規Webhookを作成しておきます。
image.png
URLは後から変えられるのでここでは適当で大丈夫です。
イベントがアカウントイベントになっていればOK。
名前は適当につけてください。

AWSをやる

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

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

作成したら、トリガーの追加から
image.png
API Gatewayを登録します。
image.png
こんな感じに設定します。
手っ取り早く動かすためにセキュリティの設定を全て無視していますが、必要に応じて設定してください。

ラムダの設定画面に戻ると
image.png
画像下部のように、少し下に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に入っている数字を使っています。

動かしてみる

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

おわりに

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした