Skype4PyでRecentMessagesが取得できない
MacOSX 10.6 , Skype4Py 1.0.32.0, Python2.6.5 において、Skype4Pyを利用してチャットの最近のメッセージを取得しようとすると失敗します。
例えば、
import Skype4Py skype = Skype4Py.Skype() skype.Attach() print skype.RecentChats[0].RecentMessages[0]
としてみると、
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Library/Python/2.6/site-packages/Skype4Py/chat.py", line 342, in _GetRecentMessages return ChatMessageCollection(self._Owner, split(self._Property('RECENTCHATMESSAGES'), ', ')) File "/Library/Python/2.6/site-packages/Skype4Py/utils.py", line 584, in __init__ self._Handles = map(self._CachedType._ValidateHandle, Handles) ValueError: invalid literal for int() with base 10: '110 111 112 113 114 115 116 117 118 581 '
みたいな感じになります。で、調べてみると、チャットのID('110 111 112 113 114 115 116 117 118 581 ')が上手く分割されていないためこうなるようです。
で、実際に分割をしているのは/path/to/Skype4Py/chat.pyの中の
341 return ChatMessageCollection(self._Owner, split(self._Property('RECENTCHATMESSAGES', Cache=False),', '))
です。split(str,', ')としているので、区切り文字', 'で分割しようとしていますが、実際チャットIDはスペースで区切られているので分割されておらず、エラーが発生しています。
https://developer.skype.com/Docs/ApiDoc/GET_CHAT_RECENTCHATMESSAGES を見る限り区切りは', 'のようですが、仕様が変わってるみたいです。
ところで、split()関数はsplitメソッドに置き換われたので、もはやPythonで使えないはずです。おかしいなーと思って調べてみたら、/path/to/Skype4Py/utils.pyの中の152から、
def split(s, d=None): """Splits a string. :Parameters: s : str or unicode String to split. d : str or unicode Optional delimiter. Any white-char by default. :return: A list of words or ``[]`` if the string was empty. :rtype: list of str or unicode :note: This function works like ``s.split(d)`` except that it always returns an empty list instead of ``['']`` for empty strings. """ if s: return s.split(d) return []
として実装されてました。
まぁとりあえずは、chat.pyの
341 return ChatMessageCollection(self._Owner, split(self._Property('RECENTCHATMESSAGES', Cache=False),', '))
を
341 return ChatMessageCollection(self._Owner, split(self._Property('RECENTCHATMESSAGES', Cache=False))
とすれば大丈夫です。
ちなみに、Messagesの方(つまり、RecentChats[0].Messages)は、取得しようとすると、
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Library/Python/2.6/site-packages/Skype4Py/chat.py", line 278, in _GetMessages return ChatMessageCollection(self._Owner, split(self._Property('CHATMESSAGES', Cache=False))) File "/Library/Python/2.6/site-packages/Skype4Py/chat.py", line 24, in _Property return self._Owner._Property('CHAT', self.Name, PropName, Value, Cache) File "/Library/Python/2.6/site-packages/Skype4Py/skype.py", line 297, in _Property value = self._DoCommand('GET %s' % jarg, jarg) File "/Library/Python/2.6/site-packages/Skype4Py/skype.py", line 281, in _DoCommand raise SkypeError(int(errnum), errstr) Skype4Py.errors.SkypeError: [Errno 106] Invalid PROP:
みたいにエラーになってしまいます。この解決法はまだ見つかってないようです。