3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS LambdaとPythonでスラッシュコマンドで入力した文字をそのまま返すSlackBotを作成する

Last updated at Posted at 2021-05-11

はじめに

SlackBotを作る記事はいくつかあったのですが、記事が少し古かったり、複雑な記事が多かったため、シンプルに/hogeで入力した内容をそのまま返すSlackBotを作成します。Slackで匿名質問などをしたいときにも使えます。

Slackの設定

Botの設定

SlackAPIのサイトからCreate New Appで新しいBotを作ります。
その後、OAuth&PermissionsのScopesでBot Token Scopesというところがあるので、chat:writechat:write.publiccommandsをscopeに追加します。

次にBotの設定をします。
Basic Information > BotsをクリックしてApp DisplayNameの設定とShow tabsのMessages TabをONにするのとAllow users to send Slash commands and messages from the messages tabにチェックをしてください。

その後install to Workspaceを選んでWorkspaceにBotをインストールしてください。
インストールした後に出てくるTokenが大事なので保管しておきましょう。見つからない場合は、OAuth & Permissionsのタブをクリックして確認しましょう。
スクリーンショット 2021-05-11 23.09.18.png

Botの設定の確認

Botの設定がうまく行っているかテストするにはこちらのサイトtokenchanneltextを埋めてSendしてみてください。うまくいけば指定したチャンネルに入力したテキストが出力されるはずです。

channelはchannel IDを入れる必要があるのですが、こちらはWeb版のSlackチャンネルで出てくるURLに書いてあるので確認してみてください。

AWS側の設定

AWS Lambdaの設定

AWSを開いてAuthor from scratchのBasic infomationを埋めてください。
今回はPython3.6を使いました。
スクリーンショット 2021-05-11 22.54.33.png

API Gatewayの設定

Lambdaの画面が出てきたら、+Add triggerを選択します。
スクリーンショット 2021-05-11 22.57.00.png

Trigger configurationの画面のトリガー選択からAPI Gatewayを選択してください。
その後次のように埋めます。
スクリーンショット 2021-05-11 21.33.36.png

できたあとは、こちらの画面のAPIエンドポイントにクリックしてアクセスしてみてください。"Hello from Lambda!"と出てきたら、API Gatewayの設定はうまくいってます。
スクリーンショット 2021-05-11 22.59.47.png

AWS Lambdaのコード

次にAWS Lambdaのコードを修正しましょう。

lambda_function.py
import urllib
import urllib.request
import base64

def send_text_response(event, response_text):
    SLACK_URL = "https://slack.com/api/chat.postMessage"
    channel_id = "<チャンネルIDを入力>"
    data = urllib.parse.urlencode(
        (
            ("token", "xoxb-...<Bot User OAuth Tokenを入力>"),
            ("channel", channel_id),
            ("text", response_text)
        )
    )
    data = data.encode("ascii")
    
    request = urllib.request.Request(SLACK_URL, data=data, method="POST")
    request.add_header( "Content-Type", "application/x-www-form-urlencoded" )
    
    urllib.request.urlopen(request).read()
    
def lambda_handler(event, context):
    print(f"Received event:\n{event}\nWith context:\n{context}")
    # Bodyのbase64をデコードしてstr型にする
    body = base64.b64decode(event.get("body").encode()).decode()
    # BodyをDict型にparseする 
    qs_d = urllib.parse.parse_qs(body)

    # parse_qsのdict型のvalueは配列で持っているため0番目を選択する
    response_text = qs_d["text"][0]
    send_text_response(event, response_text)
    
    # レスポンスをSlackbotが返す(なんでも良い)
    return "200 OK"

多分Pythonの書き方はもっといい書き方があると思うのですが、こちらでとりあえず動きます。

リクエストのログや出力などは[CloudWatchコンソール]
(https://console.aws.amazon.com/cloudwatch/)の`Logs > log groups`で見ることができます。
デバッグするときに使ってみてください。

スラッシュコマンドの設定とAWSとの接続

スラッシュコマンドでBotが動くようにするためには、slack apiの左タブのSlash Commandsを選択します。
Commandには実行時に使いたいコマンド、RequestURLにはAPI Gatewayで設定したAPI endpointのURLを入力してください。
スクリーンショット 2021-05-11 23.13.22.png

以上で完成です。
Slackで/hoge "Botに話させたい文字列"を入力してあげればBotが返してくれます。

参考

こちらをかなり参考にしました。(英語)
https://medium.com/glasswall-engineering/how-to-create-a-slack-bot-using-aws-lambda-in-1-hour-1dbc1b6f021c
Node.jsで同様のものを作成しています。Requireの設定がうまく行かなかったため断念しました。
https://www.cview.co.jp/osakatech/2020.02.06.eSBhZVxH

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?