Ruby
Slack
slackbot
DataSpider

Slackにアップした画像をダウンロードするBotを作ってみた

本記事は アプレッソ Advent Calendar 2017 19日目の記事です。

みなさん、Slackに写真をアップしますよね?

  • ミーティングで書いたホワイトボードを記録するために
  • ランチで食べた美味しい料理を共有するために
  • 日々の思い出を残すために

さまざまなシーンで写真を撮って、SlackでShareすると思います!
でも、Slackのタイムラインは流れて写真は忘れ去られてしまいます。
そこで、アップされた写真をダウンロードして保存しておけば、いつでも見返すことができますね!

Slackbotで画像ファイルをダウンロード

Slackbotの作り方は色々ありますが、私は Ruby が好きなので、Ruby で作ります。

画像ファイルがアップされるのを待つ

Botのコードを書く

まず、slackbot用の便利なgem slack-ruby-client を使って、メッセージを監視するコードを書いてみます。

slack-ruby-client の使い方は、Bot Token をセットして、RealTime Client のインスタンスを生成するだけです。

require 'slack-ruby-client'

Slack.configure do |config|
  config.token = 'xoxb-xxxxxxxxxx'
end

client = Slack::RealTime::Client.new

client.on :hello do |data|
  puts "=== Successfully connected! ==="
end

client.on :message do |data|
  if data.subtype == 'file_share'
    # subtypeが'file_share'の場合、ファイルがアップされたとき
    # ここにファイルを処理するコードを書く
  end
end

client.on :close do |data|
  puts "=== Close ==="
end

:message イベントが、Slackの投稿を受け取るイベントです。
メッセージデータの subtype がメッセージの種類を表しており、'file_share' がファイルをアップロードしたときの値になります。

Bot Token を発行する

Bot Token は以下の手順で発行することができます。
1. https://[slackサービス名].slack.com/apps にアクセスします。
2. [Bots] を検索して、[Bots] のページを開き、[Install] ボタンをクリックします。
3. Bot名を入力して、Botを追加します。
4. Bot Token (xoxb- から始まる文字列)が生成されているので、コピーします。

このBot Tokenが使える機能は、こちらのリストにあるRealTime Message APIのみです。
Botを作成したら、監視したいチャンネルにInviteしておきましょう。

次に、アップロードされたファイルが画像か確認して、ダウンロードします。

画像ファイルをダウンロードする

ダウンロードするコード

ファイルのダウンロードURLにアクセスして、ファイルをダウンロードします。
今回はダウンロード対象を "jpg" に限定しています。
Slackにリクエストを投げる際に、Bearer認証が必要となります。ここで使用するトークンは、User Tokenです。

require 'rest-client'

def fetch_and_save_image(file, channel)
  if file.filetype == "jpg"
    File.open(file.name, 'wb') do |f|
      res = RestClient.get(file.url_private, { "Authorization" => "Bearer xoxp-xxxxxxxxxx" })
      if res.code == 200
        f << res.body
      end
    end
  end
end

# 中略

client.on :message do |data|
  if data.subtype == 'file_share'
    fetch_and_save_image(data.file)
  end
end

User Token を発行する

User Tokenは以下の手順で発行することができます。
1. https://api.slack.com/applications にアクセスします。
2. [Create New App] ボタンをクリックします。
3. API の App Name を入力し、連携するWorkspaceを選択します。
4. 左パネルメニューから [OAuth & Permissions] を選択します。
5. Scopes にて [files:read] を選択して、[Save Changes] ボタンをクリックします。
6. OAuth Access Token (xoxp- から始まる文字列) が生成されるので、コピーします。

Slackにはレガシートークン(古いトークン)がありますが、レガシートークンは何でもできる権限を持つため、現在は非推奨です。そのため、上記手順のように、必要に応じて限定された権限を持つトークンを発行する必要があります。

やってみて困ったこと

  • Windows環境でのRuby開発環境構築
    最近までMacしか触っていなかったので、久々にWindowsでRubyの開発環境の構築を試みました。Ruby自体のインストールは簡単ですが、使用したいgemがWindowsに未対応であり断念。結局 Docker で Linux の仮想マシンを使って構築しました。

  • SlackのTokenがわかりにくい
    レガシートークンを使った事例がまだまだ多かったり、Slackのページを見ても最初にレガシートークンの発行があったりしたため、レガシートークンを使えということか...と戸惑ってしまいました。よくよく調べた結果、レガシートークンはセキュアではないため、非推奨ということがわかりました。

さいごに

今回作ったBotでダウンロードした画像ファイルは、DataSpider のファイルトリガーを使って、自動で共有サーバへ保管しています。
スクリプトは非常にシンプルです。

スクリプト.PNG

DataSpider の基本的な使い方ですが、ファイルの監視、ファイルの移動が簡単に設定できました!

みなさんも、BotやDataSpiderで、業務や雑務を自動化してみてはいかがでしょうか。

参考記事