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

# 背景
仕事で頻繁にデータの取得や加工、分析の実行をサーバーのLinux環境で処理させることがある。
処理が終わったかどうかはターミナル上で`ps`で確認するが、いちいち確認するのが手間。
処理がこけている場合の対処を迅速に行いたい。
よくある方法として、メールやSNSなどでメッセージをPOSTすることで検知する。
私の職場ではSlackでのコミュニケーションが主流となっている。

# 目的
SlackでメッセージをPOSTすることで処理が終わったかどうか判断する。

# 前提
Slackアカウントは既に作成済みを前提とする。

# 環境
- ubuntu 14.04
- Python 3.5.2

# SlackにメッセージをPOSTするApps & Integrations
Slackには様々な[Apps & Integrations](https://slack.com/apps)があるよう。
今回はその中でもよくネットと見かける以下2つの方法でメッセージをPOSTする方法をまとめる。
個人的には、「Incoming WebHooks」の方が必須項目が少なくコードも短くなることから好き。

| 名称 | 簡単特徴 |
|:-----------|:-----------|
| [Slack Web API](https://api.slack.com/web) | いろいろできる |
| [Incoming WebHooks](https://api.slack.com/incoming-webhooks) | チャンネル投稿が簡単にできる |

# トークンの取得方法
とても簡単。
WEBのslackにログインし以下の手順を実施。

| 名称 | 取得方法 |
|:--------|:--------|
| Slack Web API | ・[Create token](https://api.slack.com/docs/oauth-test-tokens ) を押す。 <br> ・パスワード入力後、押したところにトークンが表示される。 |
| Incoming WebHooks | ・[Post to Channelを選択し Add Incoming WebHooks Integration](https://slack.com/services/new/incoming-webhook ) を押す。 <br> ・Webhook URLの横にトークンが表示される。 |

# メッセージをPOSTしてみる
`Shell`と`Python`でメッセージをPOSTしてみる

## Slack Web API
APIのメソッド一覧は[こちら](https://api.slack.com/methods)。
今回はメッセージをPOSTしたいので、「chat.postMessage」メソッドを使う。

### パラメータ一覧
パラメータ一覧は[こちら](https://api.slack.com/methods/chat.postMessage)。
必須項目は以下。

| パラメータ名 | 説明 |
|:--------|:--------|
| token | トークン |
| text  | 投稿するテキスト |
| channel | Channel名 <br> ダイレクトメッセージの場合はencoded ID |

今回は「token」「text」「channel」「username」「link_names」を使ったサンプルを作成する。

***※ 注意***
channelにメッセージをPOSTする場合は、「#<チャネル名>」で問題ないが、ダイレクトメッセージでPOSTしたい場合に「@<ユーザ名>」としてしまうとslackbotにPOSTされてしまう。
解決方法としては、「encoded ID」を指定する必要がある。
自分のslackのダイレクトメッセージの一覧の「encode ID」は[こちら](https://api.slack.com/methods/users.list/test)の「Test Method」を押すと一覧が表示される。
レスポンスの「id」が「encoded ID」に該当する。

#### Shell
```bash
# 設定
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
```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](https://api.slack.com/docs/message-attachments)の書式で記入 |

#### Shell

```bash
# 設定
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
```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))
```

# その他
- 絵文字の一覧が記載されているのは[こちら](http://qiita.com/koukun/items/ae673f2bae8f1525b6af)


# 参考
- http://qiita.com/m-nakada/items/643909ca14f306a74999
- http://qiita.com/vmmhypervisor/items/18c99624a84df8b31008
- http://qiita.com/mizuki_takahashi/items/3f77c2e5b6142563ce66