Slack APIを使ってRailサーバー側からSlackのチャネルへメッセージを送る

# 目的
最近はネットで先人の方々の知恵にしみじみと感謝しています。

今回、薬剤師の私がどうしてこちらを作成したいのかといいますと...
Slackで薬局内の在庫を見える化したいから！

今回はSlackAPI連携まで行って
また時間があるときに続きを記事にします。
では早速まとめていきます。

## やりたいこと
**特定のslackチャネルへメッセージを送るRailsアプリを作成したい**

ざっくりこんな感じの手順でやります
- Slackアプリを作成
- アプリのスコープ設定
- Slack botの設定とトークンを発行
- Slackの特定のチャネルへbotを招待
- Railsアプリの作成
- Slack Bot クラスを作成
- Railsコンソールからテキストを送信

## Slackアプリを作成
- **まずはこちらからアクセスしてアプリの作成**
[Slack API: Applications | Slack](https://api.slack.com/apps)
- **Create New App**
From amanifestとFrom scratchが選択できます
今回はFrom scratchを選択してゼロから作成
- **App Nameと自分自身のSlackワークスペースを設定**
Nameはなんでも大丈夫です。
Slackのワークスペースを選択してCreate Appをクリックします。
![スクリーンショット 2024-11-30 21.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/060db2ce-ab02-88b2-00fc-691ac344a0d6.png)


## Slackアプリのスコープ設定
- **Slackアプリのスコープ設定**
※SlackのスコープではアプリがSlackワークスペース内で実行できる操作やアクセスできる情報を制御する権限の集合を指します。
簡単に説明するとアプリが「何ができるか」を決めるルールのことです。
- **左メニューのOAuth & Permissionsを選択する**
![スクリーンショット 2024-11-30 22.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/3e7d8d9b-ceeb-f772-2652-b73aa1ec39e1.png)
- **```chat:write```というスコープを設定**
ここで```chat:write```を選択すると、Railsアプリが任意のチャンネルやユーザーに対してメッセージを送信できるようになります。
![スクリーンショット 2024-11-30 22.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/29cd04d7-ef87-d0bf-9649-5529b7c2ff98.png)
## Slack botの設定とトークン発行
- **左メニューのApp Homeを選択してApp Display Nameを編集**
DisplayNameとDefault usernameは適当で大丈夫です
![スクリーンショット 2024-11-30 22.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/630bf788-eaff-9c6f-389f-a7dd0d7393b8.png)
- **左のInstall Appからアプリをインストール**
インストールを行なって【許可する】を選択
![スクリーンショット 2024-11-30 22.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/3af26ba2-8851-7fff-02d0-ebb9c53116a1.png)

- インストールの過程を終えるとトークンが発行されます
こちらのトークンはSlack API連携を行う際に必須となります。
また、こちらは機密情報です。ワークスペースの不正操作などを行われてしまうため、情報漏洩しないように気をつけましょう。
![スクリーンショット 2024-11-30 22.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/127803e4-70e4-d408-13ac-2b1824aff938.png)


## Slackの特定のチャネルへbotを招待
特定のチャネルにアプリを招待してslack側の操作は終了です。
※Slackのメッセージ画面で下記入力。your_bot_nameには今回設定したnameを記載。
```
/invite @your_bot_name
```

## Railsアプリの作成してアクセストークを保管
- **rails newでアプリケーションを作成**
```
$ rails new アプリケーション名 [オプション]
```
- **[slack-ruby-client](https://github.com/slack-ruby/slack-ruby-client)のgemをインストール**
こちら下記をGemfileに追加
```
gem 'slack-ruby-client'
```
- **アクセストークンの設定**
Slack側で発行したアクセストークンを```credentials.yml.enc ```内に保管します。
rails5.2以降では基本的にcredential.yml.encに保管するようです。
こちらの[記事](https://zenn.dev/kame0707/articles/ef2453f31fe236)が参考になります
```
EDITOR="vim" bin/rails credentials:edit
```
ファイル内に下記を記載
```
slack_api_token: 'your-slack-bot-token'  # 実際のトークンを設定
```

## Slack Bot クラスを作成
- **Slack API を利用して簡単にメッセージを投稿する機能を作成**
 ```app/services/slack_notify_service.rb
 class SlackNotifyService
  def initialize
    @client = Slack::Web::Client.new
  end

  def post_message(message, channel:)
    @client.chat_postMessage(channel: channel, text: message)
  end
end
```
```Slack::Web::Client.new```を使用して、Slack API にアクセスするためのクライアントインスタンスを作成します。このクライアントは ```@client```変数に保持されます。

次のメソッドでは```chat.postMessage```エンドポイントを呼び出して、特定のチャンネルにメッセージを投稿します。

- **Slack API の認証設定を一元管理**
```config/initializers/slack.rb
Slack.configure do |config|
  config.token = Rails.application.credentials.slack_api_token
end
```
```Slack::Web::Client```がAPIを利用する際、認証に必要なアクセストークン```(config.token)```を設定します。
こちらではcredential.yml.encで保持したトークンを呼び出します。

## Railsコンソールからテキストを送信
- **Railsコンソールで起動**
```
rails console
```
- **コンソールからテキストを送信**
```
client = Slack::Web::Client.new
client.chat_postMessage(
  channel: '#在庫管理bot',
  text: 'こんにちは'
)
```
Slackチャネルでこのようにメッセージが来ていたら成功です。
![スクリーンショット 2024-11-30 23.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/0d556a0c-f867-1671-8468-e6c041602e50.png)

## 参考サイト
https://api.slack.com/apis
https://github.com/slack-ruby/slack-ruby-client
https://zenn.dev/kame0707/articles/ef2453f31fe236