見出し画像

PythonからSlackに繋いでみた。

 私は、この2つの記事のとおり、Pythonを始めて1ヶ月もしないPython初心者です。しかも、Slackについては会社員時代ユーザとして使用していたものの、Botなどを作ったこともないSlack API超初心者です。

 PythonでWebスクレイピングのプログラムを作り、スクレイピングした結果をSQLite3のデータベースに蓄えるというところまで作成しました。その後、データベースを元に何とかPDFを作成しましたが、作成されたPDFをどうやって手元に持ってこようかと思っていたところ、ふと、Slackを使えないかと思った次第です。

 Slackとアプリを繋ぐのであれば、Slack APIと言うことで、昨日の朝、確か8時ぐらい前からWebでSlack APIを使用したBotの作り方が書かれているサイトをいくつか見て、なんとか実装しました。11時頃には動くものが出来ました。半日作業程度のプログラム内容なので、あまり期待しないでください(そもそも、Python歴1ヶ月未満、Slack API歴半日未満なので期待されていないと思いますが)。

1.Slackに新しいBotアプリを作成します。

 Slackへログインした状態で、上記サイトを表示します。この中のCreate New Appボタンをクリックし、新しいBotアプリを作成します。アプリケーションの名前と、開発に使用するワークスペースを指定します。

01_SlackAPIで新しいAppを作成

2.Botアプリに許可する権限を付与します。

 Botアプリに許可する動作の権限を付与します。サイドメニューからOAuth & Permissionsを選択し、Bot Token ScopesAdd an OAuth Scopeボタンをクリックします。

画像2

 今回追加する権限は、チャットを書き込むchat:writeとファイルをアップロードすることができるfiles.writeです。

03_Permissionの追加

3.Botアプリをワークスペースへインストールします。

 同じページの上にOAuth Tokens for Your Workspaceと言う項目がありますので、その中のInstall to Workspaceボタンをクリックします。

画像4

 Slackから該当ワークスペースにBotアプリがアクセスする権限をリクエストしてきたけど許可するのか、と聞かれますので許可するボタンをクリックして許可します。

05_Appがワークスペースへ接続する許可を求める画面

 Botアプリのワークスペースへのインストールが完了すると、OAuthトークンというものが発行されます。これが、Botアプリがワークスペースへアクセスする時の鍵(ユーザ名とパスワードの代わり)となります。

画像6

4.ワークスペースのチャンネルにBotアプリを追加します。

 Botアプリがチャットを投稿したり、ファイルをアップロードするワークスペースのチャンネルにBotアプリを追加します。今回は、ワークスペースを作成するとデフォルトで作られるgeneralチャンネルに追加します。

07_チャネル側でアプリオ追加

5.チャットができるかをテストページでテストしてみましょう。

 SlackのAPI一覧が載っているページからchatで始まるAPIを探します。

画像8

 chat.postMessageというメソッドのリンクをクリックし、テストを行うためのタブTesterを開きます。
 以下の赤枠tokenのところに、3.で取得したOAuthトークンをペーストします。channelのところにチャットを投稿するワークスペースのチャンネル名かチャンネルIDかのどちらかを入れます。わかり易いのはチャンネル名ですので、今回はgeneralと入れます(以下の例では#をつけてしまいましたが必要ありません)。
 画像には出ていないのですが、ページの下の方にtextというところがありますので、チャンネルに投稿したいチャット内容を書き込み、Test Methodと言うボタンを押します。

09_chatテスト

 テストした結果は、以下のように表示されます。okのところがtrueと表示されているので、問題なくメソッドが実行できたようですので、チャットが投稿されているかどうかをワークスペースで確認してみてください。

10_テスト結果

 同様にファイルをアップロードするfiles.uploadというメソッドを表示してテストしてみましょう。チャットの時と同じようにtokenchannelsというところに、OAuthトークンチャンネル名を入れます。fileのところに、アップロードしたいファイルを選択し、一番下にあるTest Methodボタンを押します。

11_fileアップロードテスト

 なぜか私のところでは何度実行してもokのところがfalseとなり、errorのところにnot_authedと表示されているので、もしかするとOAuth関係で問題が出ているかもしれません(なぜこうなるのかご存知の方教えてください)。しかし、この後に紹介するPythonプログラムで実行すると正しくファイルがアップロードできますので、ご安心ください。

12_テスト結果

6.Pythonプログラムはこちらです。

 さて、肝心のPythonプログラムです。昨日作成したプログラムは以下のとおりです。

# -*- coding: utf-8 -*-

import logging
import os
import sys
import requests

if __name__ == '__main__':

   # パラメータの受け取り処理
   import argparse
   argparser = argparse.ArgumentParser()
   argparser.add_argument('-token', default='', help='SlackのOAuthトークン')
   argparser.add_argument('-channel', default='', help='SlackのチャネルID')
   argparser.add_argument('-title', default='', help='Slackへのファイルアップロード時のタイトル')
   argparser.add_argument('-comment', default='', help='Slackへのファイルアップロード時のコメント')
   argparser.add_argument('-chat', action='store_true', help='Slackへチャットとしてテキストファイルの中身を投稿')
   argparser.add_argument('file', help='Slackへアップロードするファイル')
   args = argparser.parse_args()

   # Slackへアップロードするファイルの存在確認
   if os.path.isfile(args.file):
       # ファイル名と拡張子に分解
       name_ext = os.path.splitext(args.file)
       if args.chat and (name_ext[1].lower() == '.txt' or name_ext[1].lower() == '.log'):
           # テキストファイルやログファイルの場合、そのままSlackで読めるように、テキストファイルの中身をメッセージとして送信する
           f = open(args.file, 'r', encoding='utf-8')
           text_data = f.read()
           f.close()

           url = 'https://slack.com/api/chat.postMessage'
           data = {
               'token': args.token,
               'channel': args.channel,
               'text': text_data
           }
           response = requests.post(url, data=data)
           logging.info(response)

       else:
           # テキストファイルやログファイル以外の場合、バイナリファイルとしてSlackに送信する
           url = 'https://slack.com/api/files.upload'
           data = {
               'token': args.token,
               'channels': args.channel,
               'title': args.title,
               'initial_comment': args.comment
           }
           files = {'file': open(args.file, 'rb')}
           response = requests.post(url, data=data, files=files)
           logging.info(response)

   else:
       logging.error('Slackへアップロードするファイルが存在しません。')

   sys.exit(0)

 上のプログラムをslack_fileupload.pyというファイル名で保存した状態で、実行する方法をお伝えすると、

テキストファイルの場合:

 ​python slack_fileupload.py -token OAuthトークン文字列  -channel general -chat hogehoge.txt

PDFなどバイナリファイルの場合:

python slack_fileupload.py -token OAuthトークン文字列  -channel general hogehoge.pdf

 さて、実際に投稿されたかを確認してみましょう。
 TestAppというアプリがgeneralチャンネルにPDFファイルを投稿できることを確認できました(何度か実行したため、以下2つ表示されてしまっています)。

14_送信結果

 Pythonのプログラムはとりあえずはよしとして、Slack APIがいまいちわからないところがあります。特に途中でテストして正しく処理できなかったのにかかわらず、プログラムからは正しく送信できるという謎の動作もあり、もう少しSlack APIというかSlackのBotアプリの作成方法を勉強したいと思います。

この記事が気に入ったらサポートをしてみませんか?