背景
仕事で頻繁にデータの取得や加工、分析の実行をサーバーのLinux環境で処理させることがある。
処理が終わったかどうかはターミナル上でps
で確認するが、いちいち確認するのが手間。
処理がこけている場合の対処を迅速に行いたい。
よくある方法として、メールやSNSなどでメッセージをPOSTすることで検知する。
私の職場ではSlackでのコミュニケーションが主流となっている。
目的
SlackでメッセージをPOSTすることで処理が終わったかどうか判断する。
前提
Slackアカウントは既に作成済みを前提とする。
環境
- ubuntu 14.04
- Python 3.5.2
SlackにメッセージをPOSTするApps & Integrations
Slackには様々なApps & Integrationsがあるよう。
今回はその中でもよくネットと見かける以下2つの方法でメッセージをPOSTする方法をまとめる。
個人的には、「Incoming WebHooks」の方が必須項目が少なくコードも短くなることから好き。
名称 | 簡単特徴 |
---|---|
Slack Web API | いろいろできる |
Incoming WebHooks | チャンネル投稿が簡単にできる |
トークンの取得方法
とても簡単。
WEBのslackにログインし以下の手順を実施。
名称 | 取得方法 |
---|---|
Slack Web API | ・Create token を押す。 ・パスワード入力後、押したところにトークンが表示される。 |
Incoming WebHooks | ・Post to Channelを選択し Add Incoming WebHooks Integration を押す。 ・Webhook URLの横にトークンが表示される。 |
メッセージをPOSTしてみる
Shell
とPython
でメッセージをPOSTしてみる
Slack Web API
APIのメソッド一覧はこちら。
今回はメッセージをPOSTしたいので、「chat.postMessage」メソッドを使う。
パラメータ一覧
パラメータ一覧はこちら。
必須項目は以下。
パラメータ名 | 説明 |
---|---|
token | トークン |
text | 投稿するテキスト |
channel | Channel名 ダイレクトメッセージの場合はencoded ID |
今回は「token」「text」「channel」「username」「link_names」を使ったサンプルを作成する。
※ 注意
channelにメッセージをPOSTする場合は、「#<チャネル名>」で問題ないが、ダイレクトメッセージでPOSTしたい場合に「@<ユーザ名>」としてしまうとslackbotにPOSTされてしまう。
解決方法としては、「encoded ID」を指定する必要がある。
自分のslackのダイレクトメッセージの一覧の「encode ID」はこちらの「Test Method」を押すと一覧が表示される。
レスポンスの「id」が「encoded ID」に該当する。
Shell
# 設定
TOKEN='<取得したトークン>'
CHANNEL='<チャネル名>'
USERNAME='test_username'
LINK_NAMES='1'
URL='https://slack.com/api/chat.postMessage'
# post
curl="curl -XPOST -d \"token=${TOKEN}\" \
-d \"text=${TEXT}\" \
-d \"channel=${CHANNEL}\" \
-d \"username=${USERNAME}\" \
-d \"link_names=${LINK_NAMES}\" \
${URL}"
eval ${curl}
Python
# ライブラリインポート
import requests
# 設定
TOKEN='<取得したトークン>'
CHANNEL='<チャネル名>'
TEXT='test'
USERNAME='test_username'
URL='https://slack.com/api/chat.postMessage'
# post
post_json = {
'token': TOKEN,
'text': TEXT,
'channel': CHANNEL,
'username': USERNAME,
'link_names': 1
}
requests.post(URL, data = post_json)
Incoming WebHooks
Slack Web APIのときと若干POSTの仕方が異なるのに注意。
パラメータ一覧
パラメータは以下のようなものがある。
今回は「text」「username」「link_names」を使ったサンプルを作成する。
パラメータ名 | 必須項目 | 説明 |
---|---|---|
text | 〇 | 投稿するテキスト |
username | 投稿のユーザー名 | |
icon_url | 投稿のプロフィール画像にURL | |
icon_emoji | 投稿のプロフィール画像に入れる絵文字 | |
link_names | メンション | |
channel | Channel名 | |
attachments | Attachmentsの書式で記入 |
Shell
# 設定
URL='<取得したトークン>'
TEXT='test_text'
USERNAME='test_username'
LINK_NAMES='1'
# post
curl="curl -X POST --data '{ \
\"text\": \"${TEXT}\" \
,\"username\": \"${USERNAME}\" \
,\"link_names\" : ${LINK_NAMES}}' \
${URL}"
eval ${curl}
Python
# ライブラリインポート
import requests
import json
# 設定
URL='<取得したトークン>'
TEXT='test'
USERNAME='test_username'
# post
post_json = {
'text': TEXT,
'username': USERNAME,
'link_names': 1
}
requests.post(URL, data = json.dumps(post_json))
その他
- 絵文字の一覧が記載されているのはこちら