[Rails]slackの投稿を一括削除する方法

こちらは[フロムスクラッチ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fromscratch)の7日目の記事です。

35歳になってエンジニアに挑戦中の元PMです。
自分もエンジニアになって見たいと思っている方は、[こちら](https://blog.codecamp.jp/codecampgate_ohara)もどうぞ。
# slackの投稿を一括削除したい！！

そんな時って、ないでしょうか（笑）

いや、普通ないと思うんですけど、間違えてbotが大量に吐いちゃったり、黒歴史的な会話をまとめて消して見たい時があったりと、ある時急に欲しくなるのが一括削除。

確かに、slackから直接削除することもできるのですが、大量にある場合には一つ一つ消すのはなかなか面倒臭い。
![Franz.png](https://qiita-image-store.s3.amazonaws.com/0/104424/885eb94e-e4e9-d4ef-0f04-b996219a20cb.png)

以前はslack上から選択して削除することもできたようですが、現在はAPIを使わないと一括削除はできないようです。

ということで、簡単ながらrails版のslackの一覧から選択削除するアプリを作って見ました。

# 投稿一覧を表示して選択削除
こんなメッセージを・・・
![Franz１.png](https://qiita-image-store.s3.amazonaws.com/0/104424/d99687ce-1d61-2473-74e6-ff233efee25b.png)

一覧に表示して選択削除できるようにする
![Untitled2.png](https://qiita-image-store.s3.amazonaws.com/0/104424/95c83405-ce7f-ca85-7d1e-1af63185d9f4.png)

## slack-ruby-client API
使ったAPIは[slack-ruby-client](https://github.com/slack-ruby/slack-ruby-client)。bundle installする。

``` ruby:Gemfile
gem 'slack-ruby-client'
```

初期化用の設定をする。
APIの取得方法等はこちらの、[Railsでスタンプを勝手に押してくれるSlackのbotを作ってみた](https://qiita.com/_miki/items/d79ebae12227106a148c)をご参考。

``` ruby:slack_api.rb
require 'slack'

Slack.configure do |config|
  config.token = ENV['SLACK_API_TOKEN']
end

Slack::Web::Client.config do |config|
  config.user_agent = 'Slack Ruby Client/1.0'
end

Slack::RealTime::Client.config do |config|
  config.start_method = :rtm_start
end

```

環境変数を設定する

``` cmd
export SLACK_API_TOKEN='あなたのslack api token'
```


controllerとviewを作るために、generateする。

``` cmd
rails generate scaffold home
```

controllerを修正する。
今回は、#generalチャンネルの１週間分を引っ張ってきています。
期間やチャンネルを指定したい場合は、適宜変数にする等してください。

channels_historyでチャンネルの投稿の履歴を取得して、chat_deleteで消すだけです。

``` ruby:homes_controller.rb
  def index
    @channel_history = web_client.channels_history(
      channel: '#general',
      oldest: (Time.now - (60 * 60 * 24 * 7)).to_i,
      count: 1000
    )
  end

  def delete_chats
    params['history'].each do |ts|
      web_client.chat_delete(
        channel: '#general',
        ts: ts
      )
    end
    redirect_to action: 'index'
  end

  private

  def web_client
    @web_client ||= Slack::Web::Client.new
  end
```

routesも修正

``` ruby:routes.rb
Rails.application.routes.draw do
  resources :homes
  post '/delete_chats', controller: 'homes', action: 'delete_chats'
end
```

viewの修正。tsはslackへの投稿時間をUNIXTIMEに変更したものとなります。

``` html+erb:index.html.erb
<table>
  <thead>
    <tr>
      <th></th>
      <th>ts</th>
      <th>text</th>
      <th>user</th>
    </tr>
  </thead>

  <tbody>
  <%= form_tag('/delete_chats', :method => :post) do %>
    <%= submit_tag '選択削除' %>
    <% @channel_history.messages.each do |history| %>
      <tr>
        <td><%= check_box 'history', history.ts, {}, true, false %></td>
        <td><%= history.ts %></td>
        <td><%= history.text %></td>
        <td><%= history.user %></td>
      </tr>
    <% end %>
  <% end %>
  </tbody>
</table>
```

実際に動かしてみると・・・。

![Franz１.png](https://qiita-image-store.s3.amazonaws.com/0/104424/8aa2311e-46b2-d40f-9dd3-bcf5dc248a3f.png)

これが、無事消えることが確認できます。
![Franz_と_Untitled2.png](https://qiita-image-store.s3.amazonaws.com/0/104424/c20eb857-eb59-d93a-2036-c610fa195a75.png)

１０個ぐらいなら手で消した方が早そうですが、１００個のメッセージを消したりすることになる場合は、ぜひ使って見てください。

[github](https://github.com/hideno0110/slack)に置いておきます。