<目次>
(1) Slackでボットを開発する手順をご紹介(Python)
(1-0) やりたいこと
(1-1) STEP1:Slackアプリの作成と疎通
(1-2) STEP2:Slackアプリのイベント受信/応答をソケットモード(Webソケット通信)で疎通
(1-3) STEP3:Slackアプリのイベント受信/応答をURL経由(https通信)で疎通
(1-4) STEP4:Webアプリをクラウド上にデプロイ(Azure App Service)して疎通
(1-5) STEP5:Slackアプリのサーバ側処理(Pythonプログラム)の作成
(1-6) STEP6:Slackアプリのエンドポイントを本番用に修正
(1-7) STEP7:疎通テスト
(1) Slackでボットを開発する手順をご紹介(Python)
(1-0) やりたいこと
Slackボットを開発する上でキーとなる考え方
前提知識①:画面の開発(Bolt)
(1-1) STEP1:Slackアプリの作成と疎通
(1-2) STEP2:Slackアプリのイベント受信/応答をソケットモード(Webソケット通信)で疎通

(1-3) STEP3:Slackアプリのイベント受信/応答をURL経由(https通信)で疎通

(1-4) STEP4:Webアプリをクラウド上にデプロイ(Azure App Service)して疎通
(1-5) STEP5:Slackアプリのサーバ側処理(Pythonプログラム)の作成
from slack_bolt import App
from slack_sdk import WebClient
#Flask
from flask import Flask, request
from slack_bolt.adapter.flask import SlackRequestHandler
#ソケットモード用
from slack_bolt.adapter.socket_mode import SocketModeHandler
# モードに応じて書き換え
BOT_USER_ID = "Uxxxxxxx"
# Botトークン(Flask)
WEBAPPS_SLACK_TOKEN = "xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
WEBAPPS_SIGNING_SECRET = "[ご自身のSigning Secret]"
# Botトークン(ソケットモード)
SOCK_SLACK_BOT_TOKEN = "xoxb- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx""
SOCK_SLACK_APP_TOKEN = "xapp-1-xxxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# モード入れ替え(WebAPサーバ実行=Flask/ローカル実行=ソケットモード)
def app_mode_change(i_name):
if i_name == "__main__":
return App(token=SOCK_SLACK_BOT_TOKEN)
else:
return App(token=WEBAPPS_SLACK_TOKEN, signing_secret=WEBAPPS_SIGNING_SECRET)
# グローバルオブジェクト
s_app = app_mode_change(__name__)
# Flaskクラスのインスタンス生成
app = Flask(__name__)
#app.config['JSON_AS_ASCII'] = False
handler_flask, handler_socket = None,None
#ソケットーモードの場合のハンドラ設定
if __name__ == "__main__":
handler_socket = SocketModeHandler(app=s_app, app_token=SOCK_SLACK_APP_TOKEN, trace_enabled=True)
#Flaskでのハンドラー設定
else:
handler_flask = SlackRequestHandler(s_app)
# Flask httpエンドポイント
# 疎通確認用1
@app.route('/', methods=['GET', 'POST'])
def home():
return "Hello World Rainbow 2!!"
# 疎通確認用2
@app.route("/test", methods=['GET', 'POST'])
def hello_test():
return "Hello, This is test.2!!"
#イベント登録されたリクエストを受け付けるエンドポイント
@app.route("/slack/events", methods=["POST"])
def slack_events():
return handler_flask.handle(request)
@s_app.event("message")
def respondToRequestMsg(body, client:WebClient):
event = body.get('event', {})
# 投稿のチャンネルID、ユーザーID、投稿内容を取得
channel_id = event.get('channel')
user_id = event.get('user')
text = event.get('text')
# # もしボット以外の人からの投稿だった場合
if BOT_USER_ID != user_id:
# オウム返しを実行
client.chat_postMessage(channel=channel_id, text=text)
# __name__はPythonにおいて特別な意味を持つ変数です。
# 具体的にはスクリプトの名前を値として保持します。
# この記述により、Flaskがmainモジュールとして実行された時のみ起動する事を保証します。
# (それ以外の、例えば他モジュールから呼ばれた時などは起動しない)
if __name__ == '__main__':
EXEC_MODE = "SLACK_SOCKET_MODE"
# Slack ソケットモード実行
if EXEC_MODE == "SLACK_SOCKET_MODE":
handler_socket.start()
# Flask Web/APサーバ 実行
elif EXEC_MODE == "FLASK_WEB_API":
# Flaskアプリの起動
# →Webサーバが起動して、所定のURLからアクセス可能になります。
# →hostはFlaskが起動するサーバを指定しています(今回はローカル端末)
# →portは起動するポートを指定しています(デフォルト5000)
app.run(port=8000, debug=True)

(1-6) STEP6:Slackアプリのエンドポイントを本番用に修正


(1-7) STEP7:疎通テスト
↓
疎通②:https://rainbow-sample-app1.azurewebsites.net/test
(図141③)
(図141④)

↓
・テスト:投稿するとBOTがオウム返しされる
(図142)
(動画142)