Linuxä¸ã§åãSkypeç¨ã®botãä½ãæ¹æ³
ã¯ããã«
以åãç¥äººã®ãã£ã¦ããBeProudã¨ããä¼ç¤¾ãæä¼ã£ãã®ã§ãããBeProudã§ã¯ãã¨ã³ã¸ãã¢ã®ä¸»è¦ãªã³ãã¥ãã±ã¼ã·ã§ã³ææ®µã¨ãã¦Skypeã使ããã¦ãã¾ããã彿ãè¶£å³ã§ãã¾ãã¾Skypeã®APIã«ã¤ãã¦èª¿ã¹ã¦ããã®ã§ãæªæ¯ã£æ°ãåºãã¦ãéçºç°å¢ã«å³å¸ã§Skype APIã使ã£ãbotãè¨ç½®ãã¦ã¿ãã¨ãããæãã®ã»ã好è©ãåãããã¾ãã¤ã³ãã©ã¨è¨ã£ã¦ãéè¨ã§ã¯ãªãåå¨ *1 *2ã¨åããããã§ãã
ã¾ããããªç¶æ³ãçºãã¤ã¤ãèªå® ã®ãµã¼ãã«Skype botãè¨ç½®ãã¦ããæ°ã«å ¥ãã®Skypeãã£ããã«ãbotãå ãã¦ã¿ãã¨ããããããçµæ§å¥½è©ã ã£ãã®ã§ãèå³ãããããªäººåãã«ä½ææ¹æ³ãã¾ã¨ãããã¨ã«ãã¾ãã
Skype Public API
Skype Public APIã¨ã¯ãSkypeãå¤é¨ããã³ã³ããã¼ã«ããããã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãã
Skype Public APIãLinuxä¸ã§ç°¡åã«å©ç¨ããã«ã¯ãã¹ã¯ãªããè¨èªãã¤ã³ãã£ã³ã°ã§ããSkype4PyãPHP Skype API wrapperãããããã§ãããããã§ã¯æºå ¬å¼ãªä½ç½®ä»ãã§APIãå å®ãã¦ããSkype4Pyã使ãã¾ãã
Skype4Pyã®ã¤ã³ã¹ãã¼ã«
Ubuntuã§ããã°ãmultiverseã«ãpython-skypeãã¨ããããã±ã¼ã¸åã§åé²ããã¦ããã®ã§ãaptitudeä¸çºã§ã¤ã³ã¹ãã¼ã«ã§ãã¾ããOpenSUSEã«ããpython-Skype4Pyãã¨ããããã±ã¼ã¸ãããããã§ãã
ä»ã®ãã£ã¹ããªãã¥ã¼ã·ã§ã³ã§ããsetuptoolsçµç±ã§ç°¡åã«ã¤ã³ã¹ãã¼ã«ã§ãã¾ãã
$ easy_install Skype4Py
Skype4Pyã試ã
æåã¯è©ãªããã«Pythonã®ã¤ã³ã¿ã©ã¯ãã£ãã¢ã¼ãã§Skype4Pyã使ã£ã¦ã¿ããã¨ã«ãã¾ãã
æå ã«ã¾ãXãç«ã¡ä¸ãã£ã¦ãã¦Skypeã使ããç°å¢ãç¨æãã¦ãã ãããã¾ããå¿ è¦ã«å¿ãã¦botç¨ã®ã¢ã«ã¦ã³ããåå¾ãã¦ããã¾ãã
Skypeãèµ·åããã¦ã¼ã¶åãã¹ã¯ã¼ããå
¥åãã¦ããµã¤ã³ã¤ã³ããã¨ããã§ãã¿ã¼ããã«ãéããPythonãç«ã¡ä¸ãã¾ãã

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
Skype4Pyãã¤ã³ãã¼ããã¦ãSkypeãªãã¸ã§ã¯ããçæããAttach()ã¡ã½ãããå¼ã³ã¾ãã
>>> import Skype4Py
>>> skype = Skype4Py.Skype()
>>> skype.Attach()
æåã«ãã®æä½ãè¡ãã¨ããSkypeã¯APIãå©ç¨ããã¢ããªã±ã¼ã·ã§ã³ãä¿¡ç¨ãã¦ããããã確èªããããã³ãããåºããAPIã®å¼ã³åºãå´ã¯ãã®ããã³ããã«å¯¾ãã¦é¸æãè¡ãããã¾ã§ãããã¯ãã¾ããããã§ã¯ããã¡ãã[ã¯ã]ã鏿ãã¾ãã

鏿ãçµããã¨ãåã³Pythonã®ã¤ã³ã¿ã©ã¯ãã£ãã¢ã¼ãã«å¦çãæ»ãã¾ãã
æå§ãã«ã³ã³ã¿ã¯ãä¸è¦§ãåå¾ãããã®ååã表示ãã¦ã¿ã¾ãããã
>>> skype.Friends (<Skype4Py.user.IUser object at 0x7f6cb3876890 with Handle=u'echo123'>, <Skype4Py.user.IUser object at 0x7f6cb38766d0 with Handle=u'moriyoshi_koizumi_2nd'>) >>> for user in skype.Friends: print user.Handle, user.FullName ... echo123 Skype Test Call moriyoshi_koizumi_2nd moriyoshi
次ã«ãSkype Test User (echo123) ã«åãã£ã¦ä½ãã¡ãã»ã¼ã¸ãéä¿¡ãã¦ã¿ã¾ãããã
>>> chat = skype.CreateChatWith("echo123")
>>> chat.SendMessage("test")
<Skype4Py.chat.IChatMessage object at 0x7f67bde5c690 with Id=82>
>>> chat.SendMessage(u"ãã¹ã")
<Skype4Py.chat.IChatMessage object at 0x7f67bde5c950 with Id=85>
ãã£ããã¦ã£ã³ãã¦ãéãã¨ãecho123ã«å¯¾ãã¦ã¡ãã»ã¼ã¸ãéãããåãå
容ãecho123ã«ãã£ã¦ã¨ã³ã¼ããã¯ããã¦ãããã¨ã確èªã§ããã¨æãã¾ãã

ã§ã¯ãã¡ãã»ã¼ã¸åä¿¡ãªã©ã®ã¤ãã³ããçºçããã¨ãã«ç¹å®ã®å¦çãè¡ãã¤ãã³ããã³ãã©ã試ãã¦ã¿ã¾ãã
>>> def handler(msg, event): ... print event ... >>> skype.OnMessageStatus = handler >>> chat.SendMessage("???") <Skype4Py.chat.IChatMessage object at 0x7f67bde5c890 with Id=125> >>> SENDING SENT RECEIVED >>> def handler(msg, event): ... if event == u"RECEIVED": ... print msg.Body ... >>> skype.OnMessageStatus = handler >>> chat.SendMessage(u"ï¼¼(^o^)ï¼") <Skype4Py.chat.IChatMessage object at 0x7f67bc484190 with Id=138> >>> tof-bot 2010.09.26 02:33:10 ï¼¼(^o^)ï¼
以ä¸ãè¸ã¾ãã¦ãããã£ã±ããã¨ããã¡ãã»ã¼ã¸ãåä¿¡ããã¨ãç«ã好ããã¨è¿ãbotãæ¸ãã¦ã¿ã¾ãããã
# encoding: utf-8 import Skype4Py import time def handler(msg, event): if event == u"RECEIVED": if msg.Body == u"ãã£ã±ã": msg.Chat.SendMessage(u"ç«ã好ã") def main(): skype = Skype4Py.Skype() skype.OnMessageStatus = handler skype.Attach() # ã¤ãã³ããã³ãã©ã¯å¥ã¹ã¬ããã«ã¦å®è¡ãããã®ã§ã # æ¬ã¹ã¬ããã§ã¯ã²ãããsleepãã¦ã¹ã¯ãªãããçµäºããªãããã«ãã¦ããã while True: time.sleep(1) if __name__ == "__main__": main()
ããã
$ python yappari.py
ã®ããã«èµ·åãã¦ãå¥ãã·ã³ããããã£ã±ãããéä¿¡ãã¦ã¿ã¾ããããæ¬¡ã®ã¹ã¯ãªã¼ã³ã·ã§ããã®ããã«ãªãã°æåã§ãã
ä¾ããã¿ã¾ãããæåã§ã
ã¨ãã¾ããã©ãã§ãããããã£ãããã ãã®APIãè¦ããã°ãbotãä½ãã¦ãã¾ãã¨ãããã¨ãããã£ãã®ã§ã¯ãªããã¨æãã¾ãã
Skypeããã¼ã¢ã³åãã
ã¨ãããã¾ã§Skypeãäºãç«ã¡ä¸ããããGUIç°å¢ä¸ã§Skype Public APIãå©ç¨ããæ¹æ³ã説æãã¾ããããããã§ã¯ãµã¼ãã«è¨ç½®ããã®ãããé¢åã§ããéGUIç°å¢ã§Skypeãèµ·åãããããå©ç¨ãã¦botãæ¸ããã¨ã¯ã§ããªããã®ã§ããããããã®ãããªæã«å¨åãçºæ®ããã®ãXvfbã§ããXvfbã¨ã¯ããã®ååã®vfbãvirtual framebufferããç±æ¥ãã¦ãããã¨ããããããããã«ããã¬ã¼ã ãããã¡ (ç»é¢ã¸ã®åºåå 容ãèãã¦ããã¡ã¢ãª) ã¨ãã¦ããããªã«ã¼ãã使ãã®ã§ã¯ãªããRAMä¸ã«ç¢ºä¿ããä»®æ³ãã¬ã¼ã ãããã¡ã使ãã¨ããXã®å®è£ ã§ããããã使ããã¨ã§ãCUIç°å¢ä¸ã§Xãµã¼ããç°¡ä¾¿ã«æ±ããã¨ãã§ãã¾ãã
Xvfbã®èµ·åæ¹æ³ã¯ç°¡åã§ãXã®ãã£ã¹ãã¬ã¤çªå·ã弿°ã«ä¸ããã ãã§ãã
$ Xvfb :20
ããã©ã«ãã§ã¯ã¹ã¯ãªã¼ã³ãµã¤ãºã1280x1024ã§ãã¯ã»ã«ã®æ·±ãã24ã¨ãªãã¾ããããã夿´ããã¨ãã¯
$ Xvfb :20 -screen 0 800x600x8
ã®ããã«-screenãªãã·ã§ã³ãæå®ãã¾ããä¸è¬ã«ãç»é¢ãµã¤ãºãå°ãããã°å°ããã»ã©ããã¯ã»ã«ã®æ·±ããå°ãããã°å°ããã»ã©ãå¿
è¦ãªãã¬ã¼ã ãããã¡ã®ãµã¤ãºãå°ãããªããçã¡ã¢ãªã¨ãªãã¾ããSkypeã¯ããããã¦ç»é¢ãµã¤ãº800x600ããã¯ã»ã«ã®æ·±ã8ã§åä½ããããã¨ãã§ãã¾ãã
Xvfbä¸ã§åãã¢ããªã±ã¼ã·ã§ã³ãå¤é¨ããæä½ããã«ã¯ãVNCãå©ç¨ãã¾ããVNCãµã¼ãã®å®è£ ã¯ããããããã¾ãããã³ãã³ãã©ã¤ã³ããæè»½ã«ä½¿ãããå種ãã£ã¹ããªãã¥ã¼ã·ã§ã³ã§ããã±ã¼ã¸ãç¨æããã¦ããã¨ããç¹ã§x11vncããããããã¾ãã
x11vnc ã®å©ç¨æ¹æ³ãç°¡åã§ã
$ x11vnc -display :20
ã®ããã«Xã®ãã£ã¹ãã¬ã¤çªå·ãä¸ããã ãã§ããããã©ã«ãã®æ¥ç¶ãã¼ãçªå·ã¯5900çªã§ãããããã夿´ããã«ã¯-rfbportãªãã·ã§ã³ãæå®ãã¾ãã
ã¨ãè½æ¸ãã¯ããã¾ã§ã«ãã¦ãCentOSãªã©RedHatç³»ã®ãã£ã¹ããªãã¥ã¼ã·ã§ã³ãDebianç³»ã®ãã£ã¹ããªãã¥ã¼ã·ã§ã³ã§åãinitã¹ã¯ãªãããã¨ããããè²¼ãã¾ããsudoã使ã£ã¦ããã®ã§ãããã©ã«ãã§ã¤ã³ã¹ãã¼ã«ããã¦ããªãç°å¢ã«ã¯ãããããã¤ã³ã¹ãã¼ã«ãã¦ããã¦ãã ããã
ãã®ã¹ã¯ãªããã¯DAEMON_USERã§æå®ãããã¦ã¼ã¶ã§Xvfbããã³skypeãèµ·åã¾ãã¯åæ¢ãã¾ãã/etc/init.d以ä¸ã«initã¹ã¯ãªããã¨ãã¦è¨ç½®ãã¦ä»¥ä¸ã®ããã«ä½¿ãã¾ãã
- èµ·å
$ /etc/init.d/launch-skype.sh start
- 忢
$ /etc/init.d/launch-skype.sh stop
initã¹ã¯ãªãããOSèµ·åæã«èªåçã«å¼ã³åºãããããã«è¨å®ããæ¹æ³ã¯ãåãã£ã¹ããªãã¥ã¼ã·ã§ã³ã®ããã¥ã¡ã³ããåç §ãã¦ãã ããã
èµ·åãã°ã¯/var/log/skype以ä¸ã«ãxauth cookieã¯/var/run/skype以ä¸ã«ä¿åããã®ã§ãããããããããã®ãã£ã¬ã¯ããªãDAEMON_USERã§èªã¿æ¸ãã§ããããã«ä½æãã¦ããå¿
è¦ãããã¾ãã
Skypeã§ãµã¤ã³ã¤ã³ããã¦ã¼ã¶åã¨ãã¹ã¯ã¼ãã¯ããããUSERNAMEã¨PASSWORDã§æå®ãã¾ãã®ã§ããããé©å®ç·¨éãã¦ãã ããã
XSERVERNUMã¯Xvfbã®ãã£ã¹ãã¬ã¤çªå·ãæå®ãã¾ãã
DBPATHã¯Skypeãè¨å®æ
å ±ãªã©ãæ¸ãè¾¼ãå
ã®ãã£ã¬ã¯ããªã§ãããããDAEMON_USERã§èªã¿æ¸ãã§ããããã«ãã¦ããã¦ãã ããã
ãã®ã¹ã¯ãªããã§èµ·åãããskypeã®ç°å¢ã«x11vncã§ã¢ã¯ã»ã¹ããã«ã¯ã次ã®ããã«ãã¾ãã
$ sudo -u skype x11vnc -xauth /var/run/skype/Xauthority
åæèµ·åæã®è¨å®
åæèµ·åæãVNCã¯ã©ã¤ã¢ã³ãã§æ¥ç¶ããã¨æ¬¡ã®ãããªç»é¢ã¨ãªã£ã¦ããã¯ãã§ãã
ããã§[I agree]ã鏿ããã¨ãèªåçã«ãã°ã¤ã³ãéå§ããã¾ãã
次ã«ãSkype4Pyãã¤ã³ã¿ã©ã¯ãã£ãã¢ã¼ãã§èµ·åãã¦ãSkype Public APIã¸ã®ã¢ã¯ã»ã¹è¨±å¯ãè¨å®ãã¾ãã
x11vncã®èµ·åã§æå®ããããã«ãenvã³ãã³ããªã©ã§DISPLAYç°å¢å¤æ°ã¨XAUTHORITYç°å¢å¤æ°ããããããè¨å®ããç¶æ
ã§pythonãèµ·åããå¿
è¦ãããã¾ãã
$ env DISPLAY=:20 XAUTHORITY=/var/run/skype/Xauthority python Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import Skype4Py >>> skype = Skype4Py.Skype() >>> skype.Attach()
åç¯ã§èª¬æããããã«ä¸æ¦Attach()ã§ãããã¯ããç¶æ
ã«ãªãã¾ãã®ã§ãããã§VNCã使ã£ã¦ããã³ãããæä½ãã¾ãã

å¿ ã[Remember this selection]ã«ãã§ãã¯ãå ¥ãã¦ãã[Yes]ã鏿ãã¦ãã ãããã§ãªãã¨ãbotãèµ·åãããã³ãæ¯åº¦ãã®æä½ãVNCããè¡ããªãã¦ã¯ãªããªããªã£ã¦ãã¾ãã¾ãã
以ä¸ã§åæèµ·åæã®è¨å®ã¯å®äºã§ãã
botãåãã
ä¸ã®åæèµ·åæã®è¨å®ã«åºã¦ããã³ãã³ãã©ã¤ã³ããã®ã¾ã¾å©ç¨ãã¾ãã
$ env DISPLAY=:20 XAUTHORITY=/var/run/skype/Xauthority python bot.py
ã®ããã«ãã¦èµ·åãã¦ãã ããã
ãããã«
Skype public APIããã®å©ç¨æ¹æ³ã«ã¤ãã¦è§£èª¬ãã¦ããæ¥æ¬èªã®æ å ±ããã¾ããªããããæ·å± ãé«ããªã£ã¦ããå°è±¡ãåãã¾ããããã®è¨äºãå°ãã§ãè¶³ãã«ãªãã°å¹¸ãã§ãã
注æç¹ã¨ãã¦ãSkypeã¯åºæ¬çã«P2Pã¢ããªã±ã¼ã·ã§ã³ãªã®ã§ãä¸è¬çãªãã£ããã¯ã©ã¤ã¢ã³ãã¨ã¯éããåæã«ãã¾ãã¾ãªãã¼ãã¨æ¥ç¶ãéå§ãã¦ãã¾ãã¾ãããµã¼ãã§éç¨ããã¨ãã¯ããã®ãµã¼ãã®å±ãããããã¯ã¼ã¯ã®ç®¡çè ã«ç®¡çããªã·ã¼ãªã©ã確èªããã»ããããã§ãããã
ã¡ãªã¿ã«ãä»ã®ã¨ããããããã®VPSãEC2ã§Skypeãåãããã¨ãã§ãã¦ãã¾ãã
ãããã¦èªã¿ãã:
ãPythonã§Skypeã«ãã®ã³ã°ããã
*1:http://twitter.com/shin_no_suke/status/25658845058
*2:http://www.slideshare.net/bpstudy/bpstudy36-beproudbot-5319457



