本記事はSlackbotでSlack上のファイルをダウンロードする方法について紹介するものです。
・Slackにファイルがアップロードされた時にダウンロードする方法
・Slackにアップロード済みのファイルをダウンロードさせる方法
の2つについて説明します。
通常サーバーからファイルをダウンロードするためにはサーバーに接続してFTPソフトなどを使用してダウンロードする必要があります。
この方法は毎回サーバーに接続する必要があるためやや手間です。
Slackbotにファイルをダウンロードする機能を実装しておけばSlackにファイルをアップロードするだけでサーバーにファイルを転送することができるようになります。
PythonでのSlackbot実装の基本については「SlackbotをPythonで作成しよう」をお読みください。
目次
Slackからファイルをダウンロードする方法
SlackからのファイルダウンロードはWebサイトからのダウンロードと同様に「requests」ライブラリを使用できます。
SlackからダウンロードするためにはAPIトークンを「headers」の「Authorization」に指定する必要があります。
1 2 3 4 5 6 7 | requests.get( # URLを指定 'https://xxxxxxxx/', allow_redirects=True, # headersにAPIトークンを指定する headers={'Authorization': 'Bearer API_TOKEN'}, stream=True ) |
◆ファイルを保存する方法
codecsなどファイル制御ライブラリを使用して書き込めば保存できます。
openのオプションは「wb(バイナリーで書き込み)」を指定します。
codecsの記述例です。
1 2 3 | target_file = codecs.open('保存するファイルパス', 'wb') target_file.write(content) target_file.close() |
ダウンロードクラスの実装例は以下の通りです。
◆ダウンロードクラスの実装例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import requests import codecs import slackbot_settings from slacker import Slacker slacker = Slacker(slackbot_settings.API_TOKEN) class DownloadFile: def __init__(self, file_types, save_directly): # 引数が省略された場合は、デフォルトのタイプを指定 self.file_types = file_types self.save_directly = save_directly def exe_download(self, file_info): file_name = file_info['name'] url_private = file_info['url_private_download'] # 保存対象のファイルかチェックする if file_info['filetype'] in self.file_types: # ファイルをダウンロード self.file_download(url_private, self.save_directly + file_name) return 'ok' else: # 保存対象外ファイル return 'file type is not applicable.' def file_download(self, download_url, save_path): content = requests.get( download_url, allow_redirects=True, headers={'Authorization': 'Bearer %s' % slackbot_settings.API_TOKEN}, stream=True ).content # 保存する target_file = codecs.open(save_path, 'wb') target_file.write(content) target_file.close() |
Slackにファイルがアップロードされた時にダウンロードする方法
ファイルをSlackにアップロードしたタイミングで自動的にSlackbotにファイルをダウンロードする方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import requests import codecs from slackbot.bot import respond_to import slackbot_settings @respond_to('^ファイルダウンロード$') def file_download(message): # ダウンロードするファイルタイプを指定する file_types = ['png', 'gif', 'jpg'] # ファイルの保存ディレクトリ save_path = '/Users/xxxxxx/xxxxxxx/' download_file = DownloadFile(file_types, save_path) result = download_file.exe_download(message._body['files'][0]) if result == 'ok': message.send('ファイルをダウンロードしました') elif result == 'file type is not applicable.': message.send('ファイルのタイプがダウンロード対象外です') else: message.send('ファイルのダウンロードに失敗しました') |
Slackにアップロード済みのファイルをダウンロードさせる方法
アップロード済みのファイルをダウンロードするためにはファイルIDが必要です。
ファイルIDの取得手順
実装手順
アップロード済みのファイルをダウンロードする方法は以下の通りです。
引数には先ほど調べたファイルIDを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @respond_to('^ファイルs(.*)$') def show_file_info(message, text): file_info = slacker.files.info(file_=text, count=1).body['file'] file_types = ['png', 'gif', 'jpg'] save_path = '/Users/xxxxxx/xxxxxxx/' download_file = DownloadFile(file_types, save_path) result = download_file.exe_download(file_info) if result == 'ok': message.send('ファイルをダウンロードしました') elif result == 'file type is not applicable.': message.send('ファイルのタイプがダウンロード対象外です') else: message.send('ファイルのダウンロードに失敗しました') |
以上、Slackからファイルをダウンロードする方法でした。
Slackbot+PythonまとめTOP>>Slackbotの作り方マニュアル〜Python編〜