LoginSignup
40
36

More than 5 years have passed since last update.

処理が終わったらSlackで通知してくれるようにShellとPythonでスクリプトを書く

Last updated at Posted at 2017-02-12

背景

仕事で頻繁にデータの取得や加工、分析の実行をサーバーの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してみる

ShellPythonでメッセージを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))

その他

  • 絵文字の一覧が記載されているのはこちら

参考

40
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
36