> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dify.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Slack Bot

> Dify アプリを Slack に接続する Slack Bot プラグインを、プロジェクトのセットアップからデバッグ、パッケージ化まで構築します

> このドキュメントは AI によって自動翻訳されています。不正確な部分がある場合は、[英語版](/en/develop-plugin/dev-guides-and-walkthroughs/develop-a-slack-bot-plugin) を参照してください。

このガイドでは、Slack 内でユーザーの質問に直接回答する、AI を活用した Slack Bot を構築します。プラグインを開発したことがない場合は、まず [プラグイン開発クイックスタートガイド](/ja/develop-plugin/dev-guides-and-walkthroughs/tool-plugin) を読んでください。

## プロジェクトの背景

Slack Bot プラグインを使うと、チームは Slack 内で LLM と直接チャットでき、会話がすでに行われている場所に AI を組み込めます。

Slack は堅牢な API を備えたオープンなリアルタイムコミュニケーションプラットフォームで、開発が容易な webhook ベースのイベントシステムも提供しています。このガイドでは、そのシステムを利用して以下の図のような Slack Bot プラグインを作成します。

<Frame>
  ![Slack Bot の図](https://assets-docs.dify.ai/2025/01/a0865d18f1ca4051601ca53fa6f92db2.png)
</Frame>

<Note>
  このガイドでは、よく似た 2 つの用語が登場します。

  * **Slack Bot**：Slack プラットフォーム上のチャットボットで、リアルタイムにやり取りできる仮想ユーザーです。
  * **Slack Bot プラグイン**：Dify アプリケーションと Slack を接続する、Dify マーケットプレイス内のプラグインです。このガイドでは、その構築方法を説明します。
</Note>

### 動作の仕組み

1. **ユーザーが Slack Bot にメッセージを送信する**

   Slack 内のユーザーが Bot にメッセージを送信すると、Slack Bot は即座に Dify プラットフォームへ webhook リクエストを発行します。

2. **Slack がメッセージを Slack Bot プラグインに転送する**

   Dify プラットフォームが Slack Bot プラグインをトリガーし、プラグインがメッセージを Dify アプリケーションに中継します。これは、メールシステムが受信者のアドレスに配信するのと似ています。この接続は、Slack の API を通じて Slack の webhook アドレスを設定し、プラグインに入力することで確立します。プラグインは Slack リクエストを処理して Dify アプリケーションに転送し、そこで LLM が入力を分析して応答を生成します。

3. **プラグインが応答を Slack に返す**

   プラグインは Dify アプリケーションから応答を受け取ると、LLM の回答を同じルートで Slack Bot に送り返します。これにより、ユーザーはチャットしている場所でそのまま応答を受け取れます。

## 前提条件

* **Dify プラグイン開発ツール**：[開発ツールの初期化](/ja/develop-plugin/getting-started/cli) を参照してください。
* **Python 環境（バージョン 3.12）**：[Python 公式ダウンロードページ](https://www.python.org/downloads/) を参照してください。
* **OAuth トークンを持つ Slack App**：以下の手順を参照してください。

Slack App を作成するには、[Slack API プラットフォーム](https://api.slack.com/apps) にアクセスし、アプリをゼロから作成して、デプロイ先のワークスペースを選択します。

<Frame>
  ![Slack App を作成する](https://assets-docs.dify.ai/2025/01/c1fd0ac1467faf5a3ebf3818bb234aa8.png)
</Frame>

1. **Webhooks を有効にする**：

<Frame>
  ![Webhooks を有効にする](https://assets-docs.dify.ai/2025/01/7112e0710300f1db16827e17f3deac00.png)
</Frame>

2. **Slack ワークスペースにアプリをインストールする**：

<Frame>
  ![Slack ワークスペースにアプリをインストールする](https://assets-docs.dify.ai/2025/01/88c360ff4f7b04fea52174ce330522fa.png)
</Frame>

3. プラグイン開発のために **OAuth トークンを取得する**：

<Frame>
  ![プラグイン開発のために OAuth トークンを取得する](https://assets-docs.dify.ai/2025/01/dcd8ec947253f2ef9ae121ed77ec9f26.png)
</Frame>

## 1. プラグインの開発

コーディングを始める前に、[クイックスタート：拡張プラグインの開発](/ja/develop-plugin/dev-guides-and-walkthroughs/endpoint) を読んでいるか、または Dify プラグインを構築した経験があることを確認してください。

### 1.1 プロジェクトの初期化

以下のコマンドを実行して、プラグイン開発環境をセットアップします。

```bash theme={null}
dify plugin init
```

プロンプトに従って基本的なプロジェクト情報を入力します。`extension` テンプレートを選択し、`Apps` と `Endpoints` の両方の権限を付与します。

プラグイン内で Dify サービスを逆呼び出しする方法の詳細は、[逆呼び出し：App](/ja/develop-plugin/features-and-specs/advanced-development/reverse-invocation-app) を参照してください。

<Frame>
  ![プラグイン権限](https://assets-docs.dify.ai/2024/12/d89a6282c5584fc43a9cadeddf09c0de.png)
</Frame>

### 1.2 設定フォームの編集

このプラグインには 2 つの情報が必要です。どの Dify アプリが応答を処理するか、そして Bot の応答を認証する Slack App トークンです。この両方のフィールドをプラグインのフォームに追加します。

`group` ディレクトリ内の YAML ファイル（例：`group/slack.yaml`）を修正します。フォームのファイル名はプラグイン作成時に入力した情報によって決まるため、パスは適宜調整してください。

**サンプルコード**：

`slack.yaml`

```yaml theme={null}
settings:
  - name: bot_token
    type: secret-input
    required: true
    label:
      en_US: Bot Token
      zh_Hans: Bot Token
      pt_BR: Token do Bot
      ja_JP: Bot Token
    placeholder:
      en_US: Please input your Bot Token
      zh_Hans: 请输入你的 Bot Token
      pt_BR: Por favor, insira seu Token do Bot
      ja_JP: ボットトークンを入力してください
  - name: allow_retry
    type: boolean
    required: false
    label:
      en_US: Allow Retry
      zh_Hans: 允许重试
      pt_BR: Permitir Retentativas
      ja_JP: 再試行を許可
    default: false
  - name: app
    type: app-selector
    required: true
    label:
      en_US: App
      zh_Hans: 应用
      pt_BR: App
      ja_JP: アプリ
    placeholder:
      en_US: the app you want to use to answer Slack messages
      zh_Hans: 你想要用来回答 Slack 消息的应用
      pt_BR: o app que você deseja usar para responder mensagens do Slack
      ja_JP: あなたが Slack メッセージに回答するために使用するアプリ
endpoints:
  - endpoints/slack.yaml
```

特に注目すべき設定フィールドが 2 つあります。

```yaml theme={null}
  - name: app
    type: app-selector
    scope: chat
```

* **`type`**：`app-selector` に設定すると、ユーザーはこのプラグインの使用時にメッセージを特定の Dify アプリへ転送できます。
* **`scope`**：`chat` に設定すると、プラグインは Agent、チャットボット、チャットフローなどのアプリタイプとのみやり取りできます。

最後に、`endpoints/slack.yaml` ファイルで、受信する Slack メッセージを処理できるようリクエストメソッドを `POST` に変更します。

**サンプルコード**：

`endpoints/slack.yaml`

```yaml theme={null}
path: "/"
method: "POST"
extra:
  python:
    source: "endpoints/slack.py"
```

## 2. 関数コードの編集

`endpoints/slack.py` ファイルを修正し、以下のコードを追加します。

```python theme={null}
import json
import traceback
from typing import Mapping
from werkzeug import Request, Response
from dify_plugin import Endpoint
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError


class SlackEndpoint(Endpoint):
    def _invoke(self, r: Request, values: Mapping, settings: Mapping) -> Response:
        """
        Invokes the endpoint with the given request.
        """
        retry_num = r.headers.get("X-Slack-Retry-Num")
        if (not settings.get("allow_retry") and (r.headers.get("X-Slack-Retry-Reason") == "http_timeout" or ((retry_num is not None and int(retry_num) > 0)))):
            return Response(status=200, response="ok")
        data = r.get_json()

        # Handle Slack URL verification challenge
        if data.get("type") == "url_verification":
            return Response(
                response=json.dumps({"challenge": data.get("challenge")}),
                status=200,
                content_type="application/json"
            )

        if (data.get("type") == "event_callback"):
            event = data.get("event")
            if (event.get("type") == "app_mention"):
                message = event.get("text", "")
                if message.startswith("<@"):
                    message = message.split("> ", 1)[1] if "> " in message else message
                    channel = event.get("channel", "")
                    blocks = event.get("blocks", [])
                    blocks[0]["elements"][0]["elements"] = blocks[0].get("elements")[0].get("elements")[1:]
                    token = settings.get("bot_token")
                    client = WebClient(token=token)
                    try:
                        response = self.session.app.chat.invoke(
                            app_id=settings["app"]["app_id"],
                            query=message,
                            inputs={},
                            response_mode="blocking",
                        )
                        try:
                            blocks[0]["elements"][0]["elements"][0]["text"] = response.get("answer")
                            result = client.chat_postMessage(
                                channel=channel,
                                text=response.get("answer"),
                                blocks=blocks
                            )
                            return Response(
                                status=200,
                                response=json.dumps(result),
                                content_type="application/json"
                            )
                        except SlackApiError as e:
                            raise e
                    except Exception as e:
                        err = traceback.format_exc()
                        return Response(
                            status=200,
                            response="Sorry, I'm having trouble processing your request. Please try again later." + str(err),
                            content_type="text/plain",
                        )
                else:
                    return Response(status=200, response="ok")
            else:
                return Response(status=200, response="ok")
        else:
            return Response(status=200, response="ok")
```

## 3. プラグインのデバッグ

Dify プラットフォームに移動し、プラグインのリモートデバッグアドレスとキーを取得します。

<Frame>
  ![リモートデバッグアドレスとキーを取得する](https://assets-docs.dify.ai/2025/01/8d24006f0cabf5bf61640a9023c45db8.png)
</Frame>

プラグインプロジェクトに戻り、`.env.example` ファイルをコピーして `.env` にリネームし、デバッグ情報を入力します。

```bash theme={null}
INSTALL_METHOD=remote
REMOTE_INSTALL_URL=debug.dify.ai:5003
REMOTE_INSTALL_KEY=********-****-****-****-************
```

プラグインを起動します。

```bash theme={null}
python -m main
```

これで、Dify のプラグイン管理ページのワークスペースにプラグインがインストールされ、他のチームメンバーもアクセスできるようになります。

### プラグインエンドポイントの設定

Dify のプラグイン管理ページで、新しくインストールしたテストプラグインを見つけ、新しいエンドポイントを作成します。名前と **Bot Token** を入力し、接続するアプリを選択します。

<Frame>
  ![プラグインをテストする](https://assets-docs.dify.ai/2025/01/07f87e8a2786d6f5f05195961c5630c3.png)
</Frame>

保存すると、**POST** リクエスト URL が生成されます。

<Frame>
  ![生成された POST リクエスト URL](https://assets-docs.dify.ai/2025/01/e6952a5798a7ae793b3fe7df6f76ea73.png)
</Frame>

次に、Slack App のセットアップを完了します。

1. **Event Subscriptions を有効にする**

   <Frame>
     ![Event Subscriptions を有効にする](https://assets-docs.dify.ai/2025/01/1d33bb9cde78a1b5656ad6a0b8350195.png)
   </Frame>

   上記で生成した POST リクエスト URL を貼り付けます。

   <Frame>
     ![上記で生成した POST リクエスト URL を貼り付ける](https://assets-docs.dify.ai/2025/01/65aa41f37c3800af49e944f9ff28e121.png)
   </Frame>

2. **必要な権限を付与する**

   <Frame>
     ![必要な権限を付与する](https://assets-docs.dify.ai/2025/01/25c38a2cf10ec6c55ae54970d790f37e.png)
   </Frame>

***

## 4. プラグインの検証

プラグインは `self.session.app.chat.invoke` を通じて Dify アプリケーションを呼び出し、`app_id` や `query` などのパラメータを渡して、応答を Slack Bot に返します。`python -m main` を再度実行してプラグインを再起動し、Slack に Dify アプリの回答が表示されることを確認します。

<Frame>
  ![Slack に Dify アプリの回答が表示される](https://assets-docs.dify.ai/2025/01/6fc872d1343ce8503d63c5222f7f26f9.png)
</Frame>

***

## 5. プラグインのパッケージ化（オプション）

プラグインが正しく動作することを確認したら、以下のコマンドでパッケージ化します。このコマンドは、現在のディレクトリに `slack_bot.difypkg` ファイル、つまり最終的なプラグインパッケージを生成します。詳細なパッケージ化手順は、[ローカルファイルとしてパッケージ化して共有](/ja/develop-plugin/publishing/marketplace-listing/release-by-file) を参照してください。

```bash theme={null}
# ./slack_bot を実際のプラグインプロジェクトパスに置き換えてください。

dify plugin package ./slack_bot
```

おめでとうございます。プラグインの開発、テスト、パッケージ化が完了しました。

***

## 6. プラグインの公開（オプション）

これで、[Dify マーケットプレイスリポジトリ](https://github.com/langgenius/dify-plugins) にアップロードして一般公開できます。公開前に、プラグインが [Dify マーケットプレイス公開ガイドライン](/ja/develop-plugin/publishing/marketplace-listing/release-to-dify-marketplace) を満たしていることを確認してください。承認されると、コードはメインブランチにマージされ、プラグインは [Dify マーケットプレイス](https://marketplace.dify.ai/) で公開されます。

***

## 関連リソース

* [プラグイン開発の基礎](/ja/develop-plugin/getting-started/getting-started-dify-plugin)：Dify プラグイン開発の包括的な概要
* [プラグイン開発クイックスタートガイド](/ja/develop-plugin/dev-guides-and-walkthroughs/tool-plugin)：ゼロからプラグイン開発を始める
* [拡張プラグインの開発](/ja/develop-plugin/dev-guides-and-walkthroughs/endpoint)：拡張プラグインの開発
* [Dify サービスの逆呼び出し](/ja/develop-plugin/features-and-specs/advanced-development/reverse-invocation)：Dify プラットフォームの機能を呼び出す方法
* [逆呼び出し：App](/ja/develop-plugin/features-and-specs/advanced-development/reverse-invocation-app)：プラットフォーム内でアプリを呼び出す方法
* [プラグインの公開](/ja/develop-plugin/publishing/marketplace-listing/release-overview)：公開プロセス
* [Dify マーケットプレイスへの公開](/ja/develop-plugin/publishing/marketplace-listing/release-to-dify-marketplace)：マーケットプレイス公開ガイド
* [エンドポイントの詳細定義](/ja/develop-plugin/dev-guides-and-walkthroughs/endpoint)：エンドポイントのリファレンス

## さらに読む

完全な Dify プラグインプロジェクトの例については、[GitHub リポジトリ](https://github.com/langgenius/dify-plugins) をご覧ください。完全なソースコードと実装の詳細を含む追加のプラグインも見つかります。

プラグイン開発についてさらに学ぶには、以下を参照してください。

**クイックスタート**：

* [拡張プラグインの開発](/ja/develop-plugin/dev-guides-and-walkthroughs/endpoint)
* [モデルプラグインの開発](/ja/develop-plugin/dev-guides-and-walkthroughs/creating-new-model-provider)
* [バンドルプラグイン：複数のプラグインのパッケージ化](/ja/develop-plugin/features-and-specs/advanced-development/bundle)

**プラグインインターフェースドキュメント**：

* [Manifest ファイルによるプラグイン情報の定義](/ja/develop-plugin/features-and-specs/plugin-types/plugin-info-by-manifest)：Manifest 構造
* [エンドポイント](/ja/develop-plugin/dev-guides-and-walkthroughs/endpoint)：エンドポイントのリファレンス
* [逆呼び出し](/ja/develop-plugin/features-and-specs/advanced-development/reverse-invocation)：プラグインから Dify 機能を呼び出す
* [一般仕様](/ja/develop-plugin/features-and-specs/plugin-types/general-specifications)：ツール仕様
* [モデルスキーマ](/ja/develop-plugin/features-and-specs/plugin-types/model-schema)：モデルスキーマのリファレンス
