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