もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

PythonでSlackにサーバの状態を送信してみた

はじめに

はてなブログのTOPページを見ていたらたまたま見つけたブログ

blog.8arrow.org

このサイトを見るまでSlackを知らなかった

Slackについて、失礼ながら以下のサイトから転記

mayonez.jp

Slackとは、チャットができるコミュニケーションツールです。シンプルなUIデザインで、ショートカットキーも豊富、プログラミングコードを綺麗に投稿できるスニペットが用意されていて、高性能な検索機能など、情報共有のしやすさ情報の蓄積として使いやすいコミュニケーションサービスです。機能は他にもまだまだあります。Web版、スマホアプリ版、タブレット版があり、いつでもどこでも情報共有ができます。「ショートカット」が豊富なのと、「プログラムコード投稿オプション」がついているので、特にエンジニアがコミュニケーションとるのに便利です。

社内のチャットツールとして結構使われているらしい

いくつか料金プランがあり、無料でも使える

↓料金プランについてはコチラのサイトがわかりやすい

iteach.jp

すごく個人的な問題点

実は1年前から気象庁XMLを受信しているけど、全然活用できていない・・・

XMLが3~4GBたまっているんですけど

どこかのAPIを利用したいと思いつつも、万が一間違った情報が人の目に付くところに出るのも困る

でも何かに利用したいと考えていたところ、Slackで一人チャットなら問題ないでしょ!

というわけで、SlackのAPIを利用してみた

Slackのユーザ登録はおいていて、個人的にハマったアプリの登録から手順をφ(..)メモメモ

アプリの登録・OAuthの認証

アプリの登録・OAuthの認証方法は以下のサイトと同じ手順でやった

qiita.com

一応、公式サイトと同じ手順ではある

api.slack.com

アプリの登録は、Slack APIのサイトの右上の方にの「Your Apps」から登録した

f:id:monakaice88:20170124224656p:plain

あとアプリのOAuth認証は、ブラウザを使った手動で行った。(本当は、OAuthの認証まで内部処理を作らないとイケないでしょうが・・・)

また、OAuthをする前に「Redirect URL(s)」の設定をしないと「Step1」でうまく行かなかった

f:id:monakaice88:20170124232612p:plain

Step1(認証)

以下のようなURLにアクセスする

https://slack.com/oauth/authorize?client_id=xxx&scope=channels:read chat:write:bot&

client_idscopeは必須

  • client_id - アプリと登録されたときに発行されたID
  • scope - アプリの権限。ココでアプリが出来ること(やること)を設定する

scopeの詳細は以下のサイトを見るべし!

api.slack.com

アクセスすると「なんかアプリが許可求めているけどどうする?」的な画面が表示されるのでOKする。

すると「Redirect URL(s)」で設定したページへGETクエリ付きでリダイレクトする。

GETクエリに「code=???」と付いているけど、次のstepで使用する

Step2(アクセストークンの取得)

次にアクセストークンを取得する

https://slack.com/api/oauth.access?client_id=xxx&client_secret=yyy&code=zzz

client_idclient_secretcodeは必須

  • 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()

参考にしたサイト

qiita.com

作った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

一時間おきにサーバからチャットが送られるようになった

f:id:monakaice88:20170124224649p:plain

サーバからSlackへチャットを送ることが出来るようになった。

次はPythonでデーモンを作って、電車の運行情報や気象庁XML情報をチャットに送ることをやってみようと思う