116
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-17

こちらはフロムスクラッチ Advent Calendar 2017の7日目の記事です。

35歳になってエンジニアに挑戦中の元PMです。
自分もエンジニアになって見たいと思っている方は、こちらもどうぞ。

slackの投稿を一括削除したい!!

そんな時って、ないでしょうか(笑)

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

確かに、slackから直接削除することもできるのですが、大量にある場合には一つ一つ消すのはなかなか面倒臭い。
Franz.png

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

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

投稿一覧を表示して選択削除

こんなメッセージを・・・
Franz1.png

一覧に表示して選択削除できるようにする
Untitled2.png

slack-ruby-client API

使ったAPIはslack-ruby-client。bundle installする。

Gemfile
gem 'slack-ruby-client'

初期化用の設定をする。
APIの取得方法等はこちらの、Railsでスタンプを勝手に押してくれるSlackのbotを作ってみたをご参考。

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

環境変数を設定する

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

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

rails generate scaffold home

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

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

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も修正

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

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

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>

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

Franz1.png

これが、無事消えることが確認できます。
Franz_と_Untitled2.png

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

githubに置いておきます。

116
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
116
7