Python で Skype にロギングする

id:moriyoshi さんが "Linux上で動くSkype用のbotを作る方法" というブログを書かれていたので便乗します。会社で Python から Skype へログを出力するためのハンドラーを試験的に使っていました。便利ですが、利用はお勧めしません。理由は最後に書きます。

コードはこんな感じになります。

# -*- coding: utf-8 -*-
# skype_handler.py

from logging import Handler

try:
    import Skype4Py
    skype = Skype4Py.Skype()
except:
    skype = None

if skype and not skype.Client.IsRunning:
    # Skype が起動してなかったら起動する
    skype.Client.Start()

class SkypeHandler(Handler):
    u"""Skype 用ハンドラ

    Args:
        group_name - Skype group name
        encoding - encoding (Default: 'utf-8')

    この例では、ブックマークしたグループに対してログを出力します。
    `get_chat` を変えたら個人に送信できたりします。
    """

    @staticmethod
    def get_chat(group_name):
        u"""指定したグループ名のチャットをブックマークから取得"""

        if skype is None:
            return None

        for chat in skype.BookmarkedChats:
            if chat.FriendlyName == group_name:
                return chat
        return None

    def __init__(self, group_name, encoding='utf-8'):
        u"""Create SkypeHandler Instanse"""

        Handler.__init__(self)
        self.chat = SkypeHandler.get_chat(group_name)
        self.encoding = encoding

    def send(self, record):
        if self.chat is None:
            return

        message = self.format(record)
        if type(message) is not unicode:
            message = unicode(message, self.encoding)
        self.chat.SendMessage(message)

    def emit(self, record):
        try:
            self.send(record)
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)

使い方はこんな感じ。

# -*- coding: utf-8 -*-
# test.py

import logging
import skype_handler

# Skype チャット名 (ブックマークしたやつ)
CHAT_NAME = 'Test'

# ロガー (`my_logger`) を作成
my_logger = logging.getLogger('my_logger')
my_logger.setLevel(logging.DEBUG)

# Skype ハンドラーを作成
handler = skype_handler.SkypeHandler(CHAT_NAME)

# ロガーに Skype ハンドラーを追加
my_logger.addHandler(handler)

my_logger.debug(u"ほげ")

Skype にログがはかれます。時間はリアルタイムだし、ある程度負荷をかけてもちゃんと出力してくれるし、サーバ毎に skype ユーザ変えるとログ管理も簡単だし、、、。

ですが!使わないほうがいいです。最初はさくさく動いてくれてて問題なかったのですが、しばらく使っていると子ノードがいっぱいになったのか、ブラジルとかコートジボアールとかからもっすごい量のパケットを受信し始めちゃいました orz でっネットワークに負荷がかかり "やめろ" とお叱りが・・・。自宅で使ってる分にはなんの問題もでてないですが、会社でやっちゃうとネットワーク管理者に怒られるかも。

是非使ってみてくださいw

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

Disqus のスケール - Django 編

Django と Python 3 - #python_adv