#人生戦略実行マニュアル

悔いない人生への終活戦略立案と終活戦術実行

Python で slack 通知実装

slack通知の実装方法

slack通知を行うには主に2つの方法がある。

  1. slackwebライブラリを使用する
  2. Slack API を requests で呼び出す

slackwebはWebhookUrlを設定するだけで通知ができるので、実装が簡単だがFileアップロードなどのslackが提供するAPIを柔軟に使うことができない。

slackの様々なAPIを使いたいのであれば2.で実装することをオススメする。


1. slackwebライブラリを使用する

まずWebhookUrlの取得を行う。

  • Incoming Webhook へアクセスする
  • 右上で通知したいslackアカウントを選択する
  • プルダウンから通知したいチャンネルを選択する
  • Add Incoming WebHooks integration をクリックするとWebhookUrlが生成される

f:id:tkoyama1988:20210918202646p:plain
slack incoming webhook

Pythonコード実装を行う。

import slackweb
slack = slackweb.Slack(url="WebhookUrlを入力")
slack.notify(
    text="送りたいメッセージを記述",
    username="通知するユーザ名を記述",
    mrkdwn=True # markdown形式にしたい場合はTrueにする
)

2. Slack API を requests で呼び出す

アプリを作成する

  • API画面にアクセスする
  • Create New App でアプリを作成する
  • 私は色々手を入れたいので From scratch を選択する
  • アプリ名を入れる(全角や記号を入れるとその先バグることがあるので、半角とアンダーバーあたりを使っておくのが無難)

f:id:tkoyama1988:20210918203342p:plain
slack new app

アプリの権限設定

  • サイドバーの OAuth & Permissions を選択

f:id:tkoyama1988:20210918203702p:plain:w300
slack app sidebar

f:id:tkoyama1988:20210918203839p:plain
slack app scopes

  • 画面の上にスクロールして、 Install to Workspace ボタンから通知したいアカウント選択してアプリをインストールする
  • インストールするとトークンが発行されるのでメモしておく

チャンネルIDを取得する。

  • チャンネルを右クリックして、 Copy link をクリックするとクリップボードにURLが保存される

f:id:tkoyama1988:20210918204634p:plain:w300
slack copy link

  • URL末尾の CXXXXXXXXXX の部分がチャンネルID
https://xxxxxxxxxx.slack.com/archives/CXXXXXXXXXX

アプリを通知したいチャンネルに登録する。

  • アプリをインストールすると、SlackサイドバーのAppsに作成したアプリが表示される
  • アプリを右クリックして、 Open app details をクリックする

f:id:tkoyama1988:20210918205120p:plain:w300
slack details

  • Add this app to a channel をクリックして、プルダウンから通知したいチャンネルを選択して Add する。

f:id:tkoyama1988:20210918205341p:plain:w450
slack details dialog

  • この対応をしないと通知プログラムを実行しても not_in_channel のエラーになってしまう。

Pythonコード実装を行う。

import requests

# テキストメッセージの場合
data = {
    "token":"トークンを記述する",
    "channel": "チャンネルIDを記述する",
    "text": "送りたいメッセージを記述"
}
response = requests.post(
    "https://slack.com/api/chat.postMessage",
    data=data
)

# ファイル添付の場合
tmp_slack_file = "作成したテキストファイルのパスを指定する"
data = {
    "token":"トークンを記述する",
    "channels": "チャンネルIDを記述する",
    "title": "タイトルを記述する",
    "initial_comment": "イニシャルコメントを記述する"
}
files = {'file': open(tmp_slack_file, 'rb')}
response = requests.post(
    "https://slack.com/api/files.upload",
    data=data,
    files=files
)