orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

Ubuntu Server 12.04.2 LTSでSkypeのボットを動かすまでの手順

はじめに

開発についてのミーティングをSkypeのチャットで行っていると、このチャットに外部からメッセージ送りたくなります。例えばJenkinsからの通知とか、アラートの受信とか。

技術的にできることは知っているのですが、非GUIのサーバー環境で動かそうとすると、仮想フレームバッファとか難しそうなので今まで敬遠してました。それではいかんということで、試してみたので手順を残します。

この記事では、基本的に以下のページを参考にさせて頂きました。感謝です。以降の「参考サイト」という表記はこのページを表します。
Linux上で動くSkype用のbotを作る方法 - muddy brown thang

1. Ubuntu Serverをインストールする

まずはサーバーが必要なので、Ubuntu Server 12.04.2 LTS 64bit をインストールします。Debianが好きなのですが、Skypeのようなnon freeのソフトウェアを使うならUbuntuというイメージがあるので、今回はUbuntu Serverを選びました。

手順は省略しますが、言語は英語を選択し、パッケージはSSH Serverのみをインストールしました。

2. 仮想フレームバッファ(Xvfb)を用意し、VNCでアクセスできるようにする

次のコマンドを実行します。

# 仮想フレームバッファのインストール
sudo apt-get install xvfb
# VNCサーバーのインストール
sudo apt-get install x11vnc
# Xvfbの起動。:20はディスプレイポートを表す
Xvfb :20 &
# VNCサーバーの起動。Xvfbのディスプレイポートを指定する
x11vnc -display :20

VNCクライアントで、ポート:5900、 ディスプレイポート:20 につないで、真っ黒な画面が表示されることを確認しましょう。確認ができたら Xvfb と x11vnc は終了しておきます。

3. Skypeをインストールする

以下のページを参考にSkypeをインストールします。
Skype - Community Ubuntu Documentation

次のコマンドを実行します。

# add-apt-repositoryを使えるようにする
sudo apt-get install python-software-properties
# Skypeをインストール
sudo add-apt-repository "deb http://archive.canonical.com/ $(lsb_release -sc) partner"
sudo apt-get update && sudo apt-get install Skype
# 日本語フォントをインストールしておく
sudo apt-get install fonts-takao

4. 仮想フレームバッファ上でSkypeを起動する

参考サイトに掲載してあるinitスクリプトをforkして改変したものを利用します。

/etc/init.d/skype for Ubuntu Server 12.04.2 LTS

主な変更点
  • sudo に -H オプションを追加 *1
  • XAUTHFILE, LOGFILE, DBPATH, SKYPEのパスの変更 *2
  • Skypeアカウント情報の除去 *3
  • Xvfb に認証がかかっていなかったのを修正

次のコマンドを実行します。

# /etc/init.d/skypeをダウンロード
cd /etc/init.d
sudo wget https://gist.github.com/orangain/5018807/raw/ebd824e5e7fbf4037228d0203be5ae7aac111415/skype
sudo chmod +x skype

# skypeユーザーを作る。パスワードは設定しない
sudo adduser skype
# Skype起動
sudo /etc/init.d/skype start
# マシンの起動時にSkypeが起動するように設定する
sudo update-rc.d skype defaults 80 10

5. VNCで接続してSkypeにログインする

次のコマンドでx11vncを起動した状態で、VNCクライアントを使って外部から繋ぎます。VNCのパスワードはpasswordの部分を適当に変更してください。

sudo -u skype x11vnc -display :20 -xauth /home/skype/.Xauthority -passwd password

次の画面が表示されていれば成功です。

「I agree」をクリックすると、次の画面が表示されます。

ボット用のアカウントでログインします。「Sign me in when Skype starts」にチェックを付けておくのを忘れないようにします。

新規にアカウントを作る場合は、「Create an account」をクリックしても何も起きないので、以下のページでアカウントを作ります。*4
Skypeにサインアップ - Skypeアカウントにサインアップ

6. Skype4Pyを使ってボットを作る

次のコマンドを実行します。

# virtualenv環境を用意する
sudo apt-get install python-virtualenv
virtualenv venv
. venv/bin/activate
pip install Skype4Py

# 環境変数を設定した状態でボットを実行する
sudo -u skype env DISPLAY=:20 XAUTHORITY=/home/skype/.Xauthority python bot.py

bot.pyは参考サイトに掲載のスクリプトを改変した、以下のスクリプトです。

手元では Skype4Py.Skype(Transport='x11') としないと動きませんでした。

#coding: utf-8

import Skype4Py
import time

def handler(msg, event):
    print "Event %s: %s" % (event, msg)
    if event == u"RECEIVED":
        if msg.Body == u"生きてる?":
            msg.Chat.SendMessage(u"生きてます")

def main():
    skype = Skype4Py.Skype(Transport='x11')
    skype.OnMessageStatus = handler
    skype.Attach()
    # イベントハンドラは別スレッドにて実行されるので、
    # 本スレッドではひたすらsleepしてスクリプトが終了しないようにしておく。
    print "Attached. Waiting…"
    while True:
        time.sleep(1)

if __name__ == "__main__":
    main()

なお、初回起動時はSkypeの画面の側に次の確認画面が表示されるので、「Remember this selection」にチェックを付けた上で「Yes」をクリックします。

これで、ボットに対して「生きてる?」と聞くと「生きてます」と返ってきます。

なお、外部のイベントに応じてグループチャットにメッセージを送信するには、グループチャットにトピック名をつけた上で、Attachしたskypeオブジェクトで以下のようにすれば良いです。

chat = [c for c in skype.Chats if c.Topic == 'special topic'][0]
chat.SendMessage('test')

APIドキュメント:Skype4Py


2013年3月4日追記
Jenkinsに通知するところまでやりました。
SkypeのチャットにJenkinsのビルド結果を通知する - じっくりコトコト煮込んだみかん

まとめ

以上の手順でSkypeのボットを動かせるようになりました。しかしSkypeをサーバーで動かしておくと、スーパーノードになって負荷が高くなる可能性があります。コミュニケーションツールには、素直に外部連携のしやすいIRCとかを使ったほうがいいかもしれませんね。

*1:Ubuntuのデフォルトではsudo時に$HOMEが変わらない。参考:[http://septieme-sens.blogspot.jp/2012/02/debian-ubuntu-sudo.html:title]

*2:/var/run/はtmpfsになっているので、再起動すると消えてしまう。

*3:起動時に自動ログインにチェックをつけておけば問題ない。

*4:普通はブラウザが開くけど、ブラウザが入ってないので。