slackにテキストや画像を投稿するbotの作り方

Webアプリの入力フォームに入力された情報をまとめてSlackに通知したいと思って色々検索したところ、Slackへの認証方法にTokenを用いている記事は見つけたのですが、公式的に現在は推奨されない方法のようだったので、公式が推奨しているSlackAppを使った投稿方法についてまとめました。
ちなみに、以下の解説ではRubyを使った例のみ記載しています。

ものすごく短くまとめると、「Ruby on Railsで作ったwebアプリからSlackAppを使って、Slackへテキストや画像を投稿する方法」について解説します。


#####++++アジェンダ++++
・SlackAppとは？
・SlackAppを登録する
・Slackに投稿する

#（１）SlackAppとは？
Slack Appとは、他のwebアプリからSlackに情報を転送する機能やチャンネル内で自動返信を行う機能をまとめて行うことができるパッケージのようなものです。

ちなみに、現在公式が推奨していない方式のTokenとは、SlackなどのWebアプリに送信することが可能になるパスワードのようなものです。詳しく知りたい方は[こちら](http://www.seojapan.co.jp/itpedia/programming/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3)を参照。

#（２）SlackAppを登録する
　まずは、Slackにログインした状態でhttps://api.slack.com/apps にアクセスします。![3.png](https://qiita-image-store.s3.amazonaws.com/0/287853/a6f8d7d4-9f88-4a84-e291-0bc37a5299de.png)![4.png](https://qiita-image-store.s3.amazonaws.com/0/287853/db67d3c6-e61c-64a3-a403-51fd7aa726ed.png)
「Create New App」をクリックします。Appの名前を入力しワークスペースを選択すると、Appの設定画面が表示されます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/287853/19b4fa4a-eb57-4ba7-8569-ef28ca393c4e.png)

　ここに３つの項目があるので、それぞれ解説します。

* Add features and functionality　：　作成するbotの機能を追加したり削除したり出来ます。自動返信機能や他Webアプリからのメッセージ転送はここで設定します。
* Install your app to your workspace　：　今作っているAppを自分のワークスペースで認証することができます。
* Manage distribution　：　他のワークスペースでもそのAppを使いたい場合にここから設定します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/287853/802ca7e5-c0f8-45c1-2622-2cede4d6ed4f.png)
　最初に、投稿する要素が存在するシステムから情報を引っ張ってくる設定をしたいので、「Add features and functionality」の中にある「Incoming Webhooks」をクリック。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/287853/4b9f49df-3389-b316-6ad8-dad01acbba22.png)
「Activate Incoming Webhooks」をONにし、一番下にある「Add New Webhook to Workspace」をクリック。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/287853/550c55dc-209a-b5a0-2b77-8bc1afa39985.png)

　認証画面を進むと、ワークスペースにAppがインストールされます。これで３つの項目のうち２つが完了しました。（Manage distributionは本旨から外れるので説明を省きます。）
![9.png](https://qiita-image-store.s3.amazonaws.com/0/287853/2a0a05ca-7e93-8722-fbf6-4a313359bdeb.png)
　画面左のSettingバーから「Basic information」をクリックして元の画面に戻ります。ここで再び「Add features and functionality」を開き「Bots」をクリックします。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/287853/4dcaba99-994e-5100-6193-81534aebcb3e.png)
　「Add a Bot User」をクリックするとBotのアカウント名と表示名が入力できます。(表示名に日本語は使えないので注意。)「Always Show My Bot as Online」というのは、そのBotを常にオンラインに設定するか否かという意味です。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/287853/690e6bb9-4bc1-f0c8-9b10-6d652f7617b3.png)
「Add Bot User」をクリックすると、認証を再度設定する必要があるので、画面上部のバーの「click here」をクリックして再度認証します。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/287853/3778da1b-ab7a-0369-9e0c-5bcc1fec5fea.png)
![13.png](https://qiita-image-store.s3.amazonaws.com/0/287853/101a1a12-a727-5362-c6c0-109a70165c79.png)

再度「Basic information」に戻り、「Add features and functionality」の「permissions」をクリック。


【重要】　<b>このページにある「Bot User OAuth Access Token」は後に用いるので、メモしておいてください。 </b>

　これでBotの作成はひとまず終わりです。

#（３）Slackに投稿する

上記で作成したSlackAppを使って、Slackにフォームの内容をWebアプリから投稿する際のサーバ側のコードは以下のような感じ。
ここでは、slack-apiというgemを利用しています。

```
require 'slack-api'

def post_to_slack
  # Slackに投稿するのに必要な設定
  Slack.configure do |config|
    config.token = "先ほどのTokenをここに入力"
  end
  # Slackに投稿するメッセージを作成
  msg = <<~EOC
       （例）連絡を受け取りました。
       （例）お名前：#{params[:user_name]}
       （例）メールアドレス：#{params[:user_email]}
       （例）詳細：#{params[:detail]}
       EOC
  # Slackに投稿する
  Slack.chat_postMessage(text: msg, username: 'slackのユーザーネームを入力', channel: "#投稿したいチャンネル名")
end
```

Slack.chat_postMessageのusernameは投稿者としてslackに表示される名前なので、適当な文字列で大丈夫です。
channelはSlackのチャンネル名が「posttest」ならば「#posttest」のように頭に「#」をつけないと投稿できないので注意してください。

次に、Slackに画像ファイルを投稿するコードは以下のような感じです。

```
require 'faraday'
require 'slack-api'

def post_to_slack
   Slack.files_upload(
           file: Faraday::UploadIO.new(params[:picture].tempfile, 'image/png'),
           channels: '#投稿したいチャンネル名',
           initial_comment: "画像と共につけるコメントを入力"
         )
end
```

ここでは画像のアップロードにFaradayというgemを使用しています。

これでテキスト同様、画像ファイルの投稿ができるようになりました。

>
参考URL：
[・IT用語「トークン」を解説！](http://www.seojapan.co.jp/itpedia/programming/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3/)
[・Ruby の HTTP クライアントライブラリ Faraday が便利そう](https://gist.github.com/mitukiii/2775321)