Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

本記事は アプレッソ 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で、業務や雑務を自動化してみてはいかがでしょうか。

参考記事

nomuson
Ruby, Java Agile, Scrum
appresso
自由自在なデータ連携を実現する、高いユーザビリティをもった手触りの良いソフトウェア「DataSpider」を開発する企業です。
https://www.appresso.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした