前提・実現したいこと
AWS初心者でもわかる! ブラウザ上で完結! AWS+Slack Event APIを使ったSlackボット超入門を参考にして作成したslackbotの無限投稿を防ぎたい。
発生している問題・エラーメッセージ
以下の図のように、作成したslackbotが無限投稿をしてしまう。
該当のソースコード
python
1# -*- coding: utf-8 -*- 2import os 3import json 4import logging 5import urllib.request 6 7# ログ設定 8logger = logging.getLogger() 9logger.setLevel(logging.INFO) 10 11def handle_slack_event(slack_event: dict, context) -> str: 12 13 # 受け取ったイベント情報をCloud Watchログに出力 14 logging.info(json.dumps(slack_event)) 15 16 # Event APIの認証 17 if "challenge" in slack_event: 18 return slack_event.get("challenge") 19 # ボットによるイベントまたはメッセージ投稿イベント以外の場合 20 21 22 # 反応させないためにそのままリターンする 23 # Slackには何かしらのレスポンスを返す必要があるのでOKと返す 24 # (返さない場合、失敗とみなされて同じリクエストが何度か送られてくる) 25 if is_bot(slack_event) or not is_message_event(slack_event): 26 return "OK" 27 28 if slack_event.get("event").get("type") != "message": 29 return "OK" 30 31 if slack_event.get("event").get("subtype") == "bot_message": 32 return "OK" 33 34 # Slackにメッセージを投稿する 35 post_message_to_slack_channel("Hello, Slack Bot!", slack_event.get("event").get("channel")) 36 37 # メッセージの投稿とは別に、Event APIによるリクエストの結果として 38 # Slackに何かしらのレスポンスを返す必要があるのでOKと返す 39 # (返さない場合、失敗とみなされて同じリクエストが何度か送られてくる) 40 return "OK" 41 42def is_bot(slack_event: dict) -> bool: 43 return slack_event.get("event").get("subtype") == "bot_message" 44 45def is_message_event(slack_event: dict) -> bool: 46 return slack_event.get("event").get("type") == "message" 47 48def post_message_to_slack_channel(message: str, channel: str): 49 # Slackのchat.postMessage APIを利用して投稿する 50 # ヘッダーにはコンテンツタイプとボット認証トークンを付与する 51 url = "https://slack.com/api/chat.postMessage" 52 headers = { 53 "Content-Type": "application/json; charset=UTF-8", 54 "Authorization": "Bearer {0}".format(os.environ["SLACK_BOT_USER_ACCESS_TOKEN"]) 55 } 56 data = { 57 "token": os.environ["SLACK_APP_AUTH_TOKEN"], 58 "channel": channel, 59 "text": message, 60 "username": "Bot-Sample" 61 } 62 req = urllib.request.Request(url, data=json.dumps(data).encode("utf-8"), method="POST", headers=headers) 63 urllib.request.urlopen(req) 64 return 65
試したこと
以下のようにbotの無限投稿を防げるであろう関数を取り入れた。
def is_bot(slack_event: dict) -> bool: return slack_event.get("event").get("subtype") == "bot_message" def is_message_event(slack_event: dict) -> bool: return slack_event.get("event").get("type") == "message"
###補足
バックエンドの知識が乏しく右も左も理解しておりません…知識のある方のお力を借りたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/02 02:34
2020/08/02 03:02 編集
2020/08/02 03:22
2020/08/02 11:18