PythonでSlackにサーバの状態を送信してみた
はじめに
はてなブログのTOPページを見ていたらたまたま見つけたブログ
このサイトを見るまでSlackを知らなかった
Slackについて、失礼ながら以下のサイトから転記
Slackとは、チャットができるコミュニケーションツールです。シンプルなUIデザインで、ショートカットキーも豊富、プログラミングコードを綺麗に投稿できるスニペットが用意されていて、高性能な検索機能など、情報共有のしやすさ情報の蓄積として使いやすいコミュニケーションサービスです。機能は他にもまだまだあります。Web版、スマホアプリ版、タブレット版があり、いつでもどこでも情報共有ができます。「ショートカット」が豊富なのと、「プログラムコード投稿オプション」がついているので、特にエンジニアがコミュニケーションとるのに便利です。
社内のチャットツールとして結構使われているらしい
いくつか料金プランがあり、無料でも使える
↓料金プランについてはコチラのサイトがわかりやすい
すごく個人的な問題点
実は1年前から気象庁XMLを受信しているけど、全然活用できていない・・・
XMLが3~4GBたまっているんですけど
どこかのAPIを利用したいと思いつつも、万が一間違った情報が人の目に付くところに出るのも困る
でも何かに利用したいと考えていたところ、Slackで一人チャットなら問題ないでしょ!
というわけで、SlackのAPIを利用してみた
Slackのユーザ登録はおいていて、個人的にハマったアプリの登録から手順をφ(..)メモメモ
アプリの登録・OAuthの認証
アプリの登録・OAuthの認証方法は以下のサイトと同じ手順でやった
一応、公式サイトと同じ手順ではある
アプリの登録は、Slack APIのサイトの右上の方にの「Your Apps」から登録した
あとアプリのOAuth認証は、ブラウザを使った手動で行った。(本当は、OAuthの認証まで内部処理を作らないとイケないでしょうが・・・)
また、OAuthをする前に「Redirect URL(s)」の設定をしないと「Step1」でうまく行かなかった
Step1(認証)
以下のようなURLにアクセスする
https://slack.com/oauth/authorize?client_id=xxx&scope=channels:read chat:write:bot&
client_idとscopeは必須
- client_id - アプリと登録されたときに発行されたID
- scope - アプリの権限。ココでアプリが出来ること(やること)を設定する
scopeの詳細は以下のサイトを見るべし!
アクセスすると「なんかアプリが許可求めているけどどうする?」的な画面が表示されるのでOKする。
すると「Redirect URL(s)」で設定したページへGETクエリ付きでリダイレクトする。
GETクエリに「code=???」と付いているけど、次のstepで使用する
Step2(アクセストークンの取得)
次にアクセストークンを取得する
https://slack.com/api/oauth.access?client_id=xxx&client_secret=yyy&code=zzz
client_idとclient_secretとcodeは必須
- client_id - アプリと登録されたときに発行されたID
- client_secret - アプリと登録されたときに発行されたモノ
- code - Step1のリダイレクトで送られた(取得した)コード
アクセスするとjsonが帰ってくる
{ "access_token": "xxx", "ok": true, "scope": "xxx", "team_id": "xxx", "team_name": "xxx", "user_id": "xxx" }
Pythonでサーバの状態を通知する
取り敢えず動作確認なので、Pythonのスクリプトでtopコマンドを実行した結果を1時間の間隔で通知することにした。
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess import requests def res_cmd_lfeed(cmd): return subprocess.Popen( cmd, stdout=subprocess.PIPE, shell=True).stdout.readlines() def res_cmd_no_lfeed(cmd): return [x.decode('utf-8').rstrip("\n") for x in res_cmd_lfeed(cmd)] def main(): cmd = ("top -b -n 1 | sed -n '1,5p'") cmd_res = res_cmd_no_lfeed(cmd) msg = '\n'.join(cmd_res) post_message(msg) def post_message(msg): postUrl = 'https://slack.com/api/chat.postMessage' token = 'xxxxxx' channel = 'xxxxxx' username = 'xxxxxx' pyload = { 'token': token, 'channel': channel, 'username': username, 'text': msg } res = requests.post(postUrl, data=pyload) if __name__ == '__main__': main()
参考にしたサイト
作ったPythonのスクリプトを「/usr/local/bin/cron/chat_top.py」に保存し、cronで1時間おきに実行するようにした。
以下の様なテキストファイルを「crontab.conf」に保存
0 */1 * * * export PATH="/usr/local/lib/anaconda3/bin:$PATH"; python /usr/local/bin/cron/chat_top.py
以下のコマンドでcronを設定
crontab crontab.conf
一時間おきにサーバからチャットが送られるようになった
サーバからSlackへチャットを送ることが出来るようになった。