XMPPボット-2chリーダーの作成2

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

[ 前のページ : XMPPボット-2chリーダーの作成1 | ]

作成した2ch更新チェックモジュールを、XMPPのボットに組み込みます。

XMPPボット-2chリーダーの作成1で作成した、nichanChecker.py を同一ディレクトリに配置しておきます。

こちらからスレッドのURLを送信すると、チェックを開始します。

もし、更新チェック中に他のユーザーからスレッドのURLが送信された場合、チェック対象をそちらに変更します。通知先も変更されます。

stop で停止します。

保存内容はメモリのみに格納します。ディスクへの書き込みは行いません。

デフォルトで25秒間隔でチェックします。

time [秒数] と送信すると、チェック間隔の変更を行います。

2ch-checker02.png

xmpp-2ch-checker-bot.py

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

import xmpp
import config as CONFIG
import nichanChecker
import thread
import time

datUrl = ""
reportUser = ""

def timerWork(conn):
	
	global datUrl,reportUser
	
	#print "datUrl=",datUrl
	#print "reportUser=",reportUser
	
	if datUrl and reportUser:
		
		#2chチェッカーで更新をチェック
		if nichanChecker.checkLastModified(datUrl):
			reply = nichanChecker.getNewRes(datUrl)
			conn.send(xmpp.Message(reportUser,reply))
		else:
			#reply = u"監視しています…"
			#conn.send(xmpp.Message(reportUser,reply))
			#print "watching..."
			pass
		
		if nichanChecker.readedLine >= 1000:
			datUrl = ""
			reply = u"1000を超えたのでチェックを停止します。"
			conn.send(xmpp.Message(reportUser,reply))

	

def parseMessage(conn,mess):
	
	global datUrl,reportUser,bot
	
	text=mess.getBody()
	
	if text is None: return
	
	if text.find(' ')+1: command,args=text.split(' ',1)
	else: command,args=text,''
	
	if text.startswith("http"):
		if text.endswith("dat"):
			datUrl = text.encode('utf-8','ignore')
		else :
			datUrl = nichanChecker.convertToDatUrl(text)
		
		if datUrl :
			reply = u"監視を開始します。\n"+datUrl
			
			reportUser = getSender(mess)
			
			nichanChecker.readedLine = 0
			nichanChecker.headerLastModifiedOld = ""
			bot.sleepLoop = 0 #即時再取得
		else :
			reply = u"URLがパースできません。"
			
	elif command == "stop":
		reply = u"監視を停止します。"
		datUrl = ""
		reportUser = ""
		
	elif command == "stat":
		if datUrl and reportUser:
			reply  = u"DATのURL : "+datUrl+"\n"
			reply += u"対象アカウント : "+reportUser+"\n"
			reply += u"チェック間隔 : "+unicode(bot.sleepTime)+u"(秒)\n"
		else:
			reply  = u"現在監視はしていません。"
		
	elif command == "time" or command == "sleep" :
		if args.isdigit():
			sleepTime = int(args)
		else :
			sleepTime = 25
		bot.sleepTime = sleepTime
		bot.sleepLoop = 0
		reply  = u"チェック間隔を "+unicode(sleepTime)+u" 秒に設定しました。"
	else:
		reply  = u"監視を開始するには、スレッドのURLかdatファイルのURLを送信してください。\n"
		reply += u"stop : 監視停止\n"
		reply += u"stat : 状態表示\n"
		reply += u"time [更新する秒] : 更新間隔を設定\n"
	conn.send(xmpp.Message(mess.getFrom(),reply))

#
# メッセージオブジェクトから送信者アカウントを取得
#
def getSender(mess) :
	senderFull = unicode(mess.getFrom())
	if senderFull.find('/')+1: sender,resource=senderFull.split('/',1)
	else: sender,resource=senderFull,''
	return sender

class ConnectionError: pass
class AuthorizationError: pass

class Bot:
	
	sleepTime = 25
	sleepLoop = 0
	
	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
	
	def timerThread(self):
		#print "Timer start"
		#oldMin = -1
		while True :
			timerWork(self.connection)
			self.sleepLoop = self.sleepTime
			while self.sleepLoop > 0 :
				time.sleep(1)
				self.sleepLoop -= 1
		print "Timer Broken!"

bot = Bot(**CONFIG.account)
thread.start_new_thread(bot.timerThread,())
bot.loop()

config.py

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

account = {
	'JID'     : '2ch-reader@example.com',
	'Password': 'PASSWORD',
	'Server'  : '127.0.0.1',
	'Port'    : 5222,
}

実行結果

2ch-checker01.png

使ってみて、なかなか便利だと思いました。勢いのあるスレッドの場合は見ていて楽しいです。

こちらの送信内容が自動的に書き込みされる機能を搭載すれば、もうグループチャットと変わらないものになります。私は書き込み自体あまり行わないので、実装はしないと思いますが。

stat コマンドで、書き込みフォームのURLを表示するだけでも便利かもしれない。


[ ]