技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

slackbotでbotに投げられた画像をダウンロードする

slackbotでシステムを作ろうとした時に、botに投げた画像をいったん保存する方法がわからなかったので、記録しておく。

slackbot自体の始め方

slackbot自体の使い方は他のブログなどで詳しく紹介されているのでそちらを参考にしてほしい。
インストールはこれだけ

pip install slackbot

自分がslackbotを作る際参考にさせていただいたブログはこちら。
凄く丁寧でわかりやすかった。ありがとうございました。
http://blog.bitmeister.jp/?p=3892

画像の保存

botに画像を投げて色々やらせたかったのだが、どうも保存がうまくいかず手間取ってしまった。
普通に画像をURLからダウンロードする方法ではうまくいかなかった。

import urllib
url = message.body['file']['url_private'] # messageにはファイル付きのメッセージが入っている
urllib.urlretrieve(url)

この方法では数十KBの画像ファイルができるだけで、何も保存できていなかった。

色々調べた結果、GETメソッドを使う時ヘッダーを付けなければいけないらしいとわかった。
(slack公式サイト:file type | Slack)
正直この辺はよくわかっていないんだけど、requestsを使えば何とかなるらしい。

ということでサンプルがこちら。
プラグインのファイルの中にtokenをオリジナルのものにしてこれを書く。

import requests

@listen_to("(.*)")
def img(message, params):
    if 'file' in message.body:
        url = message.body['file']['url_private']
        flag = message.body['file']['filetype']
        tmpfile = "./tmp." + flag

        token = 'YOUR_TOKEN'
        rst = requests.get(url, headers={'Authorization': 'Bearer %s' % token}, stream=True)

        fo = open(tmpfile, "wb")
        shutil.copyfileobj(rst.raw, fo)
        fo.close()


今回はpythonのslackbotを紹介したけれど、この問題だけなら他のライブラリや言語でもこれを応用して解決できるかもしれない。