Posted by & filed under diary, programming.


前々回のときに書いた,uptime から時間の取得が失敗する問題は,ログを出力するようにプログラムに変更を加えて走らせ,ログの内容を解析して修正した結果,解決した.

起動時間が1時間未満の時は, “xx:xx” 形式でなくて, “xx min” と表示されるようだ.

全部で4種もパターンがあるわけか… 統一すれば良いのになぜにわざわざばらばらに…?

完成品はこんな感じ.他に定期的に呟くようなステータスなんてあったかな?

#!/usr/bin/env python
# -*- coding=utf-8 -*-
import twitter
import time
import sys
import re
from subprocess import Popen, PIPE
'''
サーバーの状態をお知らせするBOT
'''

# ログイン
api = twitter.Api(username='twitter user', password='twitter pass')

# uptime を取得
p = Popen(["uptime"], shell=True, stdin=None, stdout=PIPE, close_fds=True)
uptime = p.stdout.readline()

# 日数を取得
update = ""
updays = re.search('up (d+) days', uptime)
if updays is not None:
    update = updays.group(1) + "日と"

# 時間を取得
uphm = re.search('(d{1,2}):(d{1,2}), +d+ user', uptime)
if uphm is None:
    uphm = re.search('(d{1,2}) min,', uptime)
    tmp = "0時間" + uphm.group(1) + "分"
else:
    tmp = uphm.group(1) + "時間" + uphm.group(2) + "分"
update = update + tmp

update = update + "正常に連続稼動しています."
load = re.search('(load average: d+.d{2}, d+.d{2}, d+.d{2})', uptime)

strnow = time.strftime("(%a, %d %b %Y %H:%M:%S %Z)")

# ツイートを投稿
api.PostUpdates(update.decode("utf-8")+'- '+load.group(0)+' '+strnow)