以前、LINE Messaging APIを利用してLINEにアプリの実行結果を通知していましたが、 無料プランだと月5,000件と制限があるのでSlack APIに乗り換えることにしました。
前提条件
- Mac M1(AppleSilicon)
- Python3.12
- Slackアカウントは開設済
全体の流れ
- アプリ作成
- 権限設定
- 疎通確認
- pythonに公式SDKインストール
- pythonでのサンプルコード
1.SlackAPIアプリ作成
Slackのアカウント開設済みの前提です。 Slack APIのドキュメントを参考に進めていきます。
下記からアプリを作成します。 アプリ作成から「Create New App」をクリックして新規アプリ作成。 「From scratch」を選択し、「App Name」に任意アプリ名、「Pick a workspace to develop your app in:」に通知を送るワークスペースを選択します。
2.権限設定
作成したアプリの「アプリ名」をクリックしてアプリの設定画面に遷移します。
左ナビの「OAuth & Permissions」に遷移して権限を設定します。
画面下部の「Scopes」から「Add an OAuth Scope」をクリックし、
「chat:write」「channels:read」を追加します。
左ナビから「Incoming Webhooks」ページに遷移し、「Activate Incoming Webhooks」を「ON」にします。
「Add New Webhook to Workspace」を選択して、該当するアプリを選択し、「Allow」を選択します。
3.疎通確認
左ナビから「Incoming Webhooks」ページに遷移し、ページ下部に「Webhook URLs for Your Workspace」欄が表示され、 下記のようなWebhookURLが生成され、テキストをJSON形式でWebhookURLにPOSTするサンプルコードが表示されます。 コピペして、ターミナルで実行するとSlackワークスペースに通知できれば設定完了です。
1POST https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX2Content-type: application/json3{4 "text": "Gotta get the bread and milk!"5}
4.pythonに公式SDKインストール
PtyhonでSlackワークスペースに通知したい場合は、Slack公式SDKをインストールします。
1pip3 install slack-sdk
参考: Python で Slack API や Webhook を扱うなら公式 SDK(slack-sdk/slack-bolt)を使おう
4.pythonに公式SDKインストール
SLACK_WEBHOOK_URLに先ほど疎通確認したWebhookURLを代入し、引数にMessageを渡すとSlackワークスペースに通知してくれます。 「@whois」にメンションを追記するとネイティブアプリで自分宛てに通知をすることも出来ます。
1from slack_sdk.webhook import WebhookClient2from slack_sdk.errors import SlackApiError3
4def main(msg):5 webhook = WebhookClient(SLACK_WEBHOOK_URL)6 try:7 response = webhook.send(text=f"@whois {msg}")8 if response.status_code != 200:9 raise Exception(f"Slack webhook returned status {response.status_code}: {response.body}")10 except SlackApiError as err:11 error_msg = f"Slack APIエラーが発生しました「{str(err)}」:{msg}"12 print(error_msg)13 except Exception as err:14 error_msg = f"Slack送信エラーが発生しました「{str(err)}」:{msg}"15 print(error_msg)4 collapsed lines
16
17if __name__ == "__main__":18 msg = sys.argv[1] if len(sys.argv) > 1 and sys.argv[1] else "Hello World!"19 main(msg)