こんにちは。
武田です。

今日はskypeのBotを作ってみようと思います。
Botを置くサーバはLinuxを利用。
Pythonでskypeを操作するパッケージ「Skype4Py」なるものがあるのでこれを利用して動かしてみます。

実験環境

  • Cent OS 6.5 64bit
  • Python 2.6.6
  • skype 4.3.0.37(linux用クライアント)

インストール

まずはアプリケーションを入れないとですね。
これがないと始まらない。。。
skyep(linux用)をインストールしていきます。

  • skypeインストール

※※※ 本作業はlinuxのGUI上でターミナルを立ち上げた状態で行います ※※※

0

まずはyum関連をアップデート、必須と思われるツールのインストール

sudo yum groupinstall Desktop
sudo yum update
sudo yum install http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo yum install qtwebkit.i686 webkitgtk.i686
sudo yum install alsa-lib.i686 libXv.i686 libXScrnSaver.i686 gtk2-engines.i686 \
sudo yum install pulseaudio-libs.i686 alsa-plugins-pulseaudio.i686
# 結構時間かかります。。。

skype Linux用クライアントの最新版をDL

cd /tmp
curl -L -O https://downloads.skype.com/linux/skype-4.3.0.37.tar.bz2
cd /opt
# アプリケーション展開
tar xjvf /tmp/skype-4.3.0.37.tar.bz2
# pathを通す
sudo  ln -s skype-4.3.0.37 skype
sudo  ln -s /opt/skype /usr/share/skype
sudo  ln -s /usr/lib/libtiff.so.3 /usr/lib/libtiff.so.4
sudo  ln -s /opt/skype/skype /usr/bin/skype

skypeがインストールされたはず。。。
一般ユーザでコンソールを立ち上げ直して
skypeを動かしてみましょう

1

無事起動しましたね。
linuxでもskypeって動くんですね。

ついでbot用アカウントでskypeにログインしておく

2

ほかにも必要なアプリケーションをいれていきましょう
今回は[Skype4Py]を利用したいでそれの下準備としてPythonパッケージ導入のためのツールをインストールします。

  • setuptoolsインストール
    sudo yum -y install python-setuptools

  • pipインストール
    sudo easy_install pip

これでSkype4Pyをインストールできるはず

  • Skype4Pyインストール
    sudo easy_install Skype4Py

Skype4Pyも入ってくれました。

まずは挨拶を返してくれるbotを作りましょう

なにかしらのチャットが飛んできたら [ hi ] と返すだけのスクリプト
pythonでスクリプトを書きます。

cat hi.py
# encoding: utf-8

import Skype4Py
import time

def handler(msg, event):
    if event == u"RECEIVED":
        msg.Chat.SendMessage(u"hi")

def main():
    skype = Skype4Py.Skype()
    skype.OnMessageStatus = handler
    skype.Attach()
    while True:
        time.sleep(1) 

if __name__ == "__main__":
    main()
  • コンソールからスクリプトを実行
    python hi.py

3

skype側の方で[skype API 認証要求]が表示されるので[はい]を選択

これでbot側は受付状態になってるはず。。。
別のPCでbotに話しかけてみましょう!

4

ちょっと順番が逆になってる気もしますがbotに対しての[hi,おはよう,こんにちは]発言のたびに[hi]と返してくれてますね。

ちょっと挨拶の種類で返答を変えてみましょう

  • 日本語で(おはよう/こんにちは/こんばんは)というと英語で返してくれるように変更
おはよう   -> Good morning
こんにちは -> Hello
こんばんは -> good evening
該当なし   -> (mooning) おれの知っている言葉にしてくれよな!

※(mooning)はおしりを出す絵文字です。
 イケてる絵文字なので無理やり使ってみました。
 皆さんも是非ご利用ください。
cat hi.py

# encoding: utf-8

import Skype4Py
import time

def handler(msg, event):
    if event == u"RECEIVED":
        time.sleep(1) # 返答は早過ぎる場合あるのでちょっとスリープ
        if msg.Body == u"おはよう":
            msg.Chat.SendMessage(u"Good morning")
        elif msg.Body == u"こんにちは":
            msg.Chat.SendMessage(u"Hello")
        elif msg.Body == u"こんばんは":
            msg.Chat.SendMessage(u"good evening")
        else:
            msg.Chat.SendMessage(u"(mooning)")
            msg.Chat.SendMessage(u"おれの知っている言葉にしてくれよな!")

def main():
    skype = Skype4Py.Skype()
    skype.OnMessageStatus = handler
    skype.Attach()
    while True:
        time.sleep(1) 

if __name__ == "__main__":
    main()

スクリプトを再起動
python hi.py

また話しかけてみましょう

5

ちゃんと話しかけた文字に応じて適切な返答をしてますね
おしり絵文字もアニメーションでキビキビと動いていてるので気分がいい!!

skype経由でlinuxにコマンドを送る

※※※ けっこう乱暴な作りなのでお遊び程度と思ってください! ※※※
送られてきた文字列を評価できるということはそのままlinuxにコマンド送ったりできないですかね?
skypeでlinuxサーバを操作なんて、ある意味スーパーハカー感

cat shell.py 

# encoding: utf-8

import Skype4Py
import time
import commands # Pythonからlinuxへコマンドを渡すため commandsモジュールをインポート

# 定義したskypeのアカウントのみコマンドを通すようにするため定義
adminHandle = '【skypeのアカウント】'

def handler(msg, event):
    if event == u"RECEIVED":
        time.sleep(1) 
        if adminHandle == msg.FromHandle:
            # メッセージの内容をコマンドとしてそのままぶちこむ
            msg.Chat.SendMessage(commands.getoutput(msg.Body))
        else:
            msg.Chat.SendMessage('許可されてないユーザーです')

def main():
    skype = Skype4Py.Skype()
    skype.OnMessageStatus = handler
    skype.Attach()
    while True:
        time.sleep(1) 

if __name__ == "__main__":
    main()

スクリプト起動しなおしてクライアントからコマンドを打ってみます
やはり基本の ls でも叩いてみましょう

6

きちんと [ ls ] も[ ls -l ]も返してくれますね。

[ man ls ] ではどうでしょう

7

なんとなくそれっぽく動いてますね!
一部のアルファベットが2重表示になってますが。。

viのような操作が続くようなコマンドでなけりゃとりあえずは動作するみたいですね。

暇つぶしに使うbot

もう少しこったモノが欲しいですね。
暇つぶし用のbotとして[はてブのホッテントリ、ヤフーニュース、そして我らがこのブログ]から
ランダムで記事を選んできてURLを表示するボットを作ってみましょう。

  • RSSを処理するためのパーサーが必要なので以下のパッケージ[ feedparser ]をインストールします。
    sudo pip install feedparser

そんでもってボット用のスクリプト
ベースの部分はhi.pyと一緒ですが、記事をランダムで取得する機能を追加してます。

cat himatsubushi.py

# encoding: utf-8

import Skype4Py
import time
import feedparser # Pythonでrssを処理するためのパーサー
import random     # ランダム処理 モジュール

# 定義済みのRSSのリストよりランダムで一つを返す
def getRss():
    rss = [
        "http://rss.dailynews.yahoo.co.jp/fc/rss.xml",    # yahooニュース
        "http://feeds.feedburner.com/hatena/b/hotentry",  # はてブ ホッテントリ
        "http://blog.adjust-work.com/feed/",              # 本ブログ(sudo rm -rf /)
    ]
    random.shuffle(rss)
    return rss[0]

# 取得した記事のうちランダムで1つ返す
def getCntent():
    rssUrl = getRss()
    contents = feedparser.parse(rssUrl)
    random.shuffle(contents.entries)
    return contents.entries[0]

def handler(msg, event):
    if event == u"RECEIVED":
        time.sleep(1)
        content = getCntent()
        msg.Chat.SendMessage(content.link)

def main():
    skype = Skype4Py.Skype()
    skype.OnMessageStatus = handler
    skype.Attach()
    while True:
        time.sleep(1)

if __name__ == "__main__":
    main()

では動かしてみましょう!
8

別のPCから話しかけてみると。。。

ちゃんとニュースなり記事なりが取得できてますね。

話しかけるたびに別記事となります。
これで仕事が煮詰まった時の気分転換によさ気です。

まとめ

社内のコミュニケーションツールとしてskypeを利用している会社さんかは多いと思います。
今回はしょうもない系のbotでしたが作りこみ次第ではプロジェクト管理ソフトや内部での情報共有など
いくらでも利用可能かと思います。
これを気にskypeで楽することを考えてみてはいかがでしょうか?

参考