メインコンテンツまでスキップ

Async(asyncio)の使用

非同期バージョンの Bolt を使用する場合は、App の代わりに AsyncApp インスタンスをインポートして初期化します。AsyncApp では AIOHTTP を使って API リクエストを行うため、aiohttp をインストールする必要があります(requirements.txt に追記するか、pip install aiohttp を実行します)。

非同期バージョンのプロジェクトのサンプルは、リポジトリの examples フォルダにあります。

# aiohttp のインストールが必要です
from slack_bolt.async_app import AsyncApp
app = AsyncApp()

@app.event("app_mention")
async def handle_mentions(event, client, say): # 非同期関数
api_response = await client.reactions_add(
channel=event["channel"],
timestamp=event["ts"],
name="eyes",
)
await say("What's up?")

if __name__ == "__main__":
app.start(3000)

他のフレームワークを使用する

AsyncApp#start() では内部的に AIOHTTP のWebサーバーが実装されています。必要に応じて、受信リクエストの処理に AIOHTTP 以外のフレームワークを使用することができます。

この例では Sanic を使用しています。すべてのアダプターのリストについては、adapter フォルダ を参照してください。

以下のコマンドを実行すると、必要なパッケージをインストールして、Sanic サーバーをポート 3000 で起動します。

# 必要なパッケージをインストールします
pip install slack_bolt sanic uvicorn
# ソースファイルを async_app.py として保存します
uvicorn async_app:api --reload --port 3000 --log-level debug
from slack_bolt.async_app import AsyncApp
app = AsyncApp()

# ここには Sanic に固有の記述はありません
# AsyncApp はフレームワークやランタイムに依存しません
@app.event("app_mention")
async def handle_app_mentions(say):
await say("What's up?")

import os
from sanic import Sanic
from sanic.request import Request
from slack_bolt.adapter.sanic import AsyncSlackRequestHandler

# App のインスタンスから Sanic 用のアダプターを作成します
app_handler = AsyncSlackRequestHandler(app)
# Sanic アプリを作成します
api = Sanic(name="awesome-slack-app")

@api.post("/slack/events")
async def endpoint(req: Request):
# app_handler では内部的にアプリのディスパッチメソッドが実行されます
return await app_handler.handle(req)

if __name__ == "__main__":
api.run(host="0.0.0.0", port=int(os.environ.get("PORT", 3000)))