本記事は アプレッソ 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 は以下の手順で発行することができます。
- https://[slackサービス名].slack.com/apps にアクセスします。
- [Bots] を検索して、[Bots] のページを開き、[Install] ボタンをクリックします。
- Bot名を入力して、Botを追加します。
- 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は以下の手順で発行することができます。
- https://api.slack.com/applications にアクセスします。
- [Create New App] ボタンをクリックします。
- API の App Name を入力し、連携するWorkspaceを選択します。
- 左パネルメニューから [OAuth & Permissions] を選択します。
- Scopes にて [files:read] を選択して、[Save Changes] ボタンをクリックします。
- OAuth Access Token (xoxp- から始まる文字列) が生成されるので、コピーします。
Slackにはレガシートークン(古いトークン)がありますが、レガシートークンは何でもできる権限を持つため、現在は非推奨です。そのため、上記手順のように、必要に応じて限定された権限を持つトークンを発行する必要があります。
やってみて困ったこと
-
Windows環境でのRuby開発環境構築
最近までMacしか触っていなかったので、久々にWindowsでRubyの開発環境の構築を試みました。Ruby自体のインストールは簡単ですが、使用したいgemがWindowsに未対応であり断念。結局 Docker で Linux の仮想マシンを使って構築しました。 -
SlackのTokenがわかりにくい
レガシートークンを使った事例がまだまだ多かったり、Slackのページを見ても最初にレガシートークンの発行があったりしたため、レガシートークンを使えということか...と戸惑ってしまいました。よくよく調べた結果、レガシートークンはセキュアではないため、非推奨ということがわかりました。
さいごに
今回作ったBotでダウンロードした画像ファイルは、DataSpider のファイルトリガーを使って、自動で共有サーバへ保管しています。
スクリプトは非常にシンプルです。
DataSpider の基本的な使い方ですが、ファイルの監視、ファイルの移動が簡単に設定できました!
みなさんも、BotやDataSpiderで、業務や雑務を自動化してみてはいかがでしょうか。
##参考記事