質問編集履歴

1 誤りを訂正

ninba

ninba score 1

2020/08/14 05:20  投稿

SlackBot 二回eventが送られてしまう
【Slack】Botについて、二回eventが送られてしまう
#やりたいこと
 以下の画像のように、発言をオウム返しにするbotが二回発言してしまうのを防ぎたい。
![](c2ae68a868a3b28dd43c1c17f256ea0b.png)
#コード
```
# -*- coding: utf-8 -*-
import os
import json
import logging
import urllib.request
# ログ設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def handle_slack_event(slack_event: dict, context) -> str:
# 受け取ったイベント情報をCloud Watchログに出力
logging.info(json.dumps(slack_event))
# Event APIの認証
if "challenge" in slack_event:
return slack_event.get("challenge")
if slack_event['event']['type'] != "message":
return "OK"
if slack_event['event'].get("subtype") == "channel_topic":
return "OK"
if slack_event['event'].get("subtype") == "channel_join":
return "OK"
if slack_event['event'].get("subtype") == "bot_message":
return "OK"
ary = catch_user_info(slack_event['event']['user'])
# Slackにメッセージを投稿する
post_message_to_slack_channel(slack_event['event']['text'], "important_timeline", slack_event['event']['channel'], ary[0], ary[1])
return "OK"
def post_message_to_slack_channel(message: str, channel: str, channelId: str, user: str, image: str):
# Slackのchat.postMessage APIを利用して投稿する
# ヘッダーにはコンテンツタイプとボット認証トークンを付与する
url = "https://slack.com/api/chat.postMessage"
headers = {
"Content-Type": "application/json; charset=UTF-8",
"Authorization": "Bearer {0}".format(os.environ["SLACK_BOT_USER_ACCESS_TOKEN"])
}
data = {
"token": os.environ["SLACK_APP_AUTH_TOKEN"],
"channel": channel,
"text": message,
"username": user,
"icon_url": image,
"attachments": [
{
"fallback": "Plain-text summary of the attachment.",
"color": "#2eb886",
"footer": "Bot | リプライはリンクをクリック→ " + "<#" + channelId + "|" + channel + ">",
"footer_icon": "https://www.pakutaso.com/shared/img/thumb/HIRAorenobasyoosu_TP_V.jpg"
}
]
}
req = urllib.request.Request(url, data=json.dumps(data).encode("utf-8"), method="POST", headers=headers)
urllib.request.urlopen(req)
return "OK"
def catch_user_info(user: str):
url = "https://slack.com/api/users.info?token=" + os.environ["SLACK_BOT_USER_ACCESS_TOKEN"] + "&user=" + user + "&pretty=1"
req = urllib.request.Request(url)
res = urllib.request.urlopen(req)
body = res.read()
decode = json.loads(body)
name = decode["user"]["real_name"]
image = decode["user"]["profile"]["image_512"]
return name, image
```
#試したこと
 Slackのイベントが再送されてしまう条件は理解したが、防ぎ方が分からない。
  • Python

    30384 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Slack

    397 questions

    Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る