見出し画像

【10】アプリ開発:Slackに通知を送る

 今回のテーマはSlack通知。特定の動作をしたりアクセスすると、そのログがSlackに飛んでくるというものです。

 今回は、今まで作成してきた問題演習アプリで、10問テストを解き終わるたびにSlackに
「累計○○問解きました! 今の運勢は○○です」
と送られるようにします。即レスなうえにおみくじのおまけつきという中々憎めない設定。以下の画像が、完成イメージです。

 それではさっそく実装していきましょう!

1、Slack APIにアクセス

 例のごとく、私が0から完成までに目を通した記事と流れを書いていきます。

 下記のサイトがとても分かりやすかったです!! 実はほとんどこの記事のみで完成までいけたほど。ありがとうございます…!

「画像も送りたい!」という場合は、追加の処理が必要です。以下の記事を参考にさせていただきました!

 なお、SlackのAPIは途中で大きく仕様変更したらしく、記事によって操作画面が変わっている箇所もあるので、記事を探すときはその点を留意しながら適宜読み替えてみてください。

 上記のサイトでも「画像送信にはchannelIDが必要だよ、ブラウザなどから確認できるよ」という旨が書かれていますが、実際はアプリの方でも表示されるチャンネルの名前そのままでも問題なかったりしました。


 ただし、画像送信で送信者をBot(アプリ)ではなく特定のユーザーにしたい場合、1つ目の記事における

「OAuth & Permissions」を選択し、「Scopes」で権限を追加。

「2. slackアプリの準備」(3)より。

の部分で「Bot Token Scopes」ではなく「User Token Scopes」を選択する必要があります。テキストのみであれば「Bot Token Scopes」にしても「users:write」権限を付与すればユーザーから送信できるはずです。

 ネット上に「as_user」という単語が飛び交っていますが、画像送信では上手くできず… もしBotを選んでもユーザー送信にできるよ!という方法を知っている方がいらっしゃれば教えてください!

2、Pythonに送信処理を追加

 実は数行でできます! 以下は、実際に実装した例です。

① テキストのみを送信する場合

data  = { # slack
    'channel': request.user.slack_channelID,
    'text': 'テストなのにゃ!'
}
#r = requests.post(url, headers=headers, data=data)

送信された!(コード部分はテスト用に一番シンプルにしたものです)

② 画像も一緒に送信する場合

filename = 'testapp/static/images/card1.jpg'
files = {'file': open(filename, 'rb')}
param = {
    'token':TOKEN, 
    'channels':request.user.slack_channelID, # チャンネルID
    'filename':filename,
    'initial_comment': "initial_\ncomment", # テキスト
    'title': "title"
}
#r=requests.post(url="https://slack.com/api/files.upload",data=param, files=files)

送信された!!

ちなみに、処理全体はこんな感じです。Djangoを使っていない方だと「?」ってなってしまうかもしれませんが悪しからず……m(__)m

@login_required
def index(request):
    today = str(timezone.now().strftime('%Y/%m/%d'))
    isClear = False # 「今日の課題」終了済みか判定
    if today == request.session.get('todaytask', 'noselect'):
        isClear = True

    ### テキストを送信する場合
    data  = { # slack
        'channel': request.user.slack_channelID,
        'text': 'テストなのにゃ!'
    }
    #r = requests.post(url, headers=headers, data=data)
    #print("return ", r.json())

  ### テキスト + 画像を送信する場合
    filename = 'testapp/static/images/card1.jpg'
    files = {'file': open(filename, 'rb')}
    param = {
        'token':TOKEN, 
        'channels':request.user.slack_channelID, # チャンネルID
        'filename':filename,
        'initial_comment': "initial_\ncomment", # テキスト
        'title': "title"
    }
    #r=requests.post(url="https://slack.com/api/files.upload",data=param, files=files)
    
    contents = {
        'user':request.user,
        'isClear':isClear,
    }
    return render(request, 'testapp/index.html', contents)

3、おまけ:よく使うリンクまとめ

通常ログイン

アプリ作成画面

テキスト送信のテスト画面

画像アップロードの各要素について

おわりに

 いかがでじたでしょうか? Slackへの通知は今までも聞いたことはありますが、実際に使ってみるとそのインパクトは予想以上です。「あんなこともこんなこともできるんじゃないか…!?」なんて想像が広がったりします。

 何を作ろうか迷っている方は、取り敢えず動的なもの(天気だったり占いだったり、その時によって変わるもの)を作ってみると面白いかもしれません。

 今回もおつかれさまでした!


いいなと思ったら応援しよう!