とりあえず動くように

思いついたことをやってみる。基本的に覚書。

Slackでアップした画像をDropboxに自動で残す

前提と課題

1.プライベートでslack(少人数)を使っている。

2.Dropboxでも画像を共有している。

3.slackでコミュニケーションしてるのに画像はDropboxを開き直して投稿し直さないといけないのは面倒。でも画像残したい。

 

やりたいこと

slackにアップしたら自動でDropboxに保存されるようにしたい。

定番のIFTTTとかzapierだとDropboxに保存したらslackに投稿する、とかはできそうだけど、逆はできない(気がする)。

slackに課金するとある程度解決する気はするが、slackをストレージとして使うのもなんか違う感あるしな。

 

ということで

簡単にPythonで書いて作りました。

slackもDropboxAPIあるし、使い慣れてるAWSのLambdaで定期実行するくらいなら無料やろってことで。

 

ざっくり手順

1.slackのtokenを取る。

qiita.com

2.Dropboxのtokenを取る。

qiita.com

3.AWSでLambdaの設定をする。

(pipでDropboxを入れる必要がある。今だとCloud9でやるとテスト含めて楽)

techblog.timers-inc.com

 

4.コード書く

(割愛)(趣味コードもちゃんとgithubで管理しよう)

…なんとなく処理の雰囲気を書くと、

1)slackのchannel一覧を取得。

channels.list method | Slack

2)dropboxにある1のチャンネル名のフォルダにある画像一覧を取得。

tatata.hatenablog.jp

3)slackのファイル名を取得。(コード側でmimetypeがimageのみに絞る)

files.list method | Slack

4)2で取得した画像 一覧と3を比較してアップ済みかを判定。

5)画像を該当のチャンネル名のフォルダにアップロード

※private_urlのままで画像のダウンロードはできるが、ヘッダにtokenは必要

6)アップしたらslackの元画像にリアクションをつける

みたいなことをしている。

あれ?画像に6のリアクションがついてたらDropboxにアップしてるかどうかの判断できる。2と4は不要なのでは。6は後で追加で作ったので今気づいた。どうするかな。

脱線するけど、画像をアイコン化するのめんどいわーと思ってたところにこれを見つけて最高だった。

www.lifehacker.jp

 

5.あとは4のコードをCloudwatch eventsで5分に一回動かす。

 

完成。

 

補足

ファイル名が同一だったときのことを考えてタイムスタンプをファイル名の頭につけるとか、dropboxで画像名一覧取得するのが重くならないように該当月ごとにディレクトリを分けてそこだけをチェックするようにした。

具体的にはDropboxには

/slackのチャンネル名/YYYY年/MM月/YYYY-MM-DD-hh_ファイル名.jpg

のように配置される。

あとで見たときにもある程度日付毎で別れていると綺麗ではあるし。

 

slackでチャンネル作ったらそれを元に自動でアルバムができる感じになるので、コミュニケーションと保存を別に考えなくていいのは便利になった、気がする。

注意点としては1年後の無料利用枠が無くなった後にAWSのLambda自体の料金じゃなくてデータ転送料金が$0.13/GB(10GBだと150円/月位?)発生するはずだけど、家に帰って旅行写真とかの高精細画像をガンガン上げたいときはdropboxに直接保存するので問題なし。間違いなくslackに課金するよりは安い。

 

dropboxにもコメント機能があるから、slackで写真にコメントついてたらそれを反映したい(初期だけでも)けど、APIをざっと眺めた感じよくわからず。できないの?

まあ一旦はいいかな。