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 にユーザーハンドルだけつっこんでるけど,将来的にはそれなりのコマンドオブジェクト等をつっこむようにしたほうがいいですね。