Python で Skype の応答メッセージを変更する

久しぶりの更新がこれなのはアレですが、世の中にサンプルがなさそうなので……

Skype4Py を使用して、Skype の応答メッセージ (voicemail greeting) として、PC上のwaveファイルをアップロードします。wave ファイルには、16KHz, 16bit, モノラルという制限があります。

プライベートなメソッドを使いまくっているので、Skype4Py の内部構造が変わったら動かなくなるかもしれません。(その前に Skype4Py が SEARCH GREETING や VOICEMAIL ALTER SET_INPUT に対応してくれるはず)

参考: http://forum.skype.com/topic/213301-uploading-a-voicemail-greeting-using-the-api/

コードは続きに。

import Skype4Py
import time
import wave

def get_greeting(skype):
    try:
        res = skype._DoCommand('SEARCH GREETING')
        greeting_id = int((res.split())[1])
        return skype.Voicemail(greeting_id)
    except:
        return None

def upload_greeting(skype, file):
    w = wave.open(file)
    if w.getframerate() != 16000 or w.getnchannels() != 1 or w.getsampwidth() != 2:
        raise RuntimeError, "Wave file have to be 16KHz, 16bit, mono format"
    wave_length = float(w.getnframes())/w.getframerate()
    wave_length += 1.0 # add a little margin time

    greeting = get_greeting(skype)
    if not greeting:
        raise RuntimeError, "Cannot get the greeting voicemail"
    greeting._Alter('SET_INPUT', 'FILE="%s"' % file)
    greeting.StartRecording()
    time.sleep(wave_length)
    greeting.StopRecording()
    greeting._Alter('SET_INPUT', 'SOUNDCARD="default"')

if __name__ == "__main__":
    skype = Skype4Py.Skype()
    skype.Attach()

    upload_greeting(skype, '/path/to/16k_16bit_mono.wav')