Skype4Py で bot を作る
コンタクトリストのユーザーがオンラインになったら「おかえり」というストーキング bot。
ちなみに Ubuntu 12.04 (Precise) で Skype4Py (パッケージ名 python-skype
) をインストールするにはレポジトリに ppa:skype-wrapper/ppa
を追加する必要がある (パッケージ skype-wrapper.deb
自体はインストールする必要はない)。
# -*- coding: utf-8 -*- import Skype4Py import Queue import logging # Skype4Py のログを出力する (DEBUG だと大量なので注意; 便利だけど) logging.basicConfig(level=logging.DEBUG) # ALTER CHAT の expected response が変わったので修正 def my_Chat__Alter(self, AlterName, Args=None): return self._Owner._Alter('CHAT', self.Name, AlterName, Args, 'ALTER CHAT %s' % AlterName) Skype4Py.chat.Chat._Alter = my_Chat__Alter q = Queue.Queue() def on_online_status(user, status): print '%s (%s): %s' % (user.Handle, user.FullName, status) if status == 'ONLINE': q.put(user.Handle) def main(): skype = Skype4Py.Skype() skype.OnOnlineStatus = on_online_status skype.Attach() while True: try: item = q.get(True, 86400) # 0 にすると KeyboardInterrupt が効かない chat = skype.CreateChatWith(item) chat.SendMessage('おかえり') chat.Leave() except Queue.Empty: pass main()
skype
をグローバル変数にぶっこんで,on_online_status()
から CreateChatWith()
してもいいんだけど,やり取り等は別スレッドで動いているらしく,ちょいと気持ち悪かったので Queue
でスレッド間通信することにした。おかげで while True: time.sleep(1)
みたいなことをしなくてもよくなった (実質 Queue.get()
してるので同じだけど)。
上のサンプルでは Queue
にユーザーハンドルだけつっこんでるけど,将来的にはそれなりのコマンドオブジェクト等をつっこむようにしたほうがいいですね。