XMPPボット-ステータス返答ボットの作成

Last-modified: 2014-08-16 (土) 12:41:50 (2014d)

[ 前のページ : XMPPボット-ボット雛形の作成 | ]

ボットのひな型に機能を追加して、OSコマンドを発行し、結果を返答するボットを作成します。

今回のプログラムはOS依存のコマンドを多く扱うため、Windowsでは動作しません。

PythonでOSのコマンドを実行し、標準出力結果を文字列として取得するには、

import os
reply += os.popen('date').read()

とします。

また、Pythonには switch〜case文はありませんので、if〜elif〜else で代用します。

xmpp-statbot.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import xmpp
import os
import config as CONFIG

def parseMessage(conn,mess):
	
	text=mess.getBody()
	
	if text is None: return
	
	if text.find(' ')+1: command,args=text.split(' ',1)
	else: command,args=text,''
	command=command.lower()
	
	#print "##### text =",text.encode('utf-8','ignore')
	#print "##### command =",command.encode('utf-8','ignore')
	
	if command == "help" or command == "?" or command == " " or command == "":
		reply = "[help]\n"
		reply += "date | sensors | vmstat | df | free | uptime | ipaddr | bots"
		
	elif command == "date" :
		reply = "[date]\n"
		reply += os.popen('date').read()
	elif command == "sensors" :
		reply = "[sensors]\n"
		reply += os.popen('sensors').read()
	elif command == "vmstat" :
		reply = "[vmstat]\n"
		reply += os.popen('vmstat 1 3').read()
	elif command == "df" :
		reply = "[df]\n"
		reply += os.popen('df -h').read()
	elif command == "free" :
		reply = "[free]\n"
		reply += os.popen('free -m').read()
	elif command == "uptime" :
		reply = "[uptime]\n"
		reply += os.popen('uptime').read()
	elif command == "ipaddr" :
		reply = "[ipaddr]\n"
		reply += os.popen('curl http://info.ddo.jp/remote_addr.php').read().strip()
	elif command == "bot" or command == "bots" :
		reply = "[bots]\n"
		reply += os.popen('ps -ef |grep python').read().strip()
	else :
		reply=u'コマンドが理解できません。ヘルプを表示するには、「help」と入力。'
	
	#print "##### reply = ",reply.encode('utf-8','ignore')
	
	conn.send(xmpp.Message(mess.getFrom(),reply))
	
class ConnectionError: pass
class AuthorizationError: pass

class Bot:
	def __init__(self, JID, Password,Server,Port):
		jid = xmpp.JID(JID)
		self.connection = xmpp.Client(jid.getDomain(), debug=[])
		
		result = self.connection.connect(server=(Server,Port))
		if result is None: raise ConnectionError
		result = self.connection.auth(jid.getNode(), Password)
		if result is None: raise AuthorizationError
		
		self.connection.RegisterHandler('message',parseMessage)
		self.connection.sendInitPresence()
		
	def loop(self):
		try:
			while self.connection.Process(1):
				pass
		except KeyboardInterrupt:
			pass

bot = Bot(**CONFIG.account)
bot.loop()

設定ファイルを外部化し、同一ディレクトリに設置します。

config.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

account = {
	'JID'     : 'status-bot@example.com',
	'Password': 'PASSWORD',
	'Server'  : '127.0.0.1',
	'Port'    : 5222,
}

実行結果

statusbot.png