HTTPでSkypeにBOT投稿(CentOS5編)

「サーバの障害情報とかエラーログとか、簡単にSkypeに投稿できればなー」
というわけでHTTPで投稿できるようにしてみました


botサーバにむけてこんな感じのURL叩くと指定したチャットに投稿できます

http://192.168.1.11/skype/chat.py/chat?chat_name=botTest&msg=日本語投稿テスト

サーバからでもcurlでサクッと

curl "http://192.168.1.11/skype/chat.py/chat?chat_name=botTest&msg=curlで投稿テスト"

でけた!!!


POSTで投稿できるようにしよう


手順

作業開始時の環境

Skypeのバージョンが変わるのでCentOS6系だと違う手順になると思います

Bot用アカウント作る

テキトウに作りましょう

Skypeをインストールする

公式Wikiの手順ベース
http://wiki.centos.org/HowTos/Skype
最新版のSkypeはCentOS5系では動かないのでちょっと古いのをインストールする

# yum install glibc.i686 alsa-lib.i386 libXv.i386 \
  libXScrnSaver.i386 libSM.i386 libXi.i386 libXrender.i386 \
  libXrandr.i386 freetype.i386 fontconfig.i386 zlib.i386 \
  glib2.i386 libstdc++.i386

# cd /tmp
# wget http://download.skype.com/linux/skype_static-2.1.0.47.tar.bz2
# cd /opt
# tar xjvf /tmp/skype_static-2.1.0.47.tar.bz2
# ln -s skype_static-2.1.0.47 skype

# ln -s /opt/skype /usr/share/skype
# ln -s /opt/skype/skype /usr/bin/skype

xtermからskypeを起動

承認&botアカウントでログイン

起動した

コンタクトの追加やグループチャットの作成をやっておきましょう(Windowでやったほうが簡単)

まずはGUIBotプログラムの実行

Skype4Pyを使います
ドキュメントはここ

# yum install python-setuptools
# easy_install Skype4Py
# easy_install ctypes

とりあえず指定したアカウントにメッセージを送るプログラムを作成
※先にコンタクト追加しとこうね!

# encoding: utf-8
import Skype4Py

skype = Skype4Py.Skype(Transport='x11')
skype.Attach()
chat = skype.CreateChatWith("<送信先アカウント>")
chat.SendMessage(u"テストメッセージ!")

別ターミナルからテストプログラムを実行してみよう

初回はアプリからの接続を許可を聞かれるので「この選択を記憶する」をチェックして「はい」押しちゃいましょう
メッセージが届いたらGUIでの動作確認は完了!!!

GUIなしで起動できるようにする

ランレベル3で再起動

# vi /etc/inittab
...
id:3:initdefault:
...
# reboot
Skypeをデーモン起動する

起動スクリプトをダウンロード
https://gist.github.com/557242
パーミッションの調整がめんどうだからapacheユーザで起動する

# wget https://raw.github.com/gist/557242/9c5b74769969efcf4e982949c0470561ed6c096c/launch-skype.sh
# vi launch-skype.sh
※このへん編集
------------------------
# chkconfig: 345 80 10
# description: skype daemon ←追加
# processname: skype

DAEMON_USER=apache
DBPATH=/var/db/skype
USERNAME=<BOTアカウント>
PASSWORD=<BOTアカウントのパスワード>
------------------------

# mkdir /var/db/skype /var/run/skype/ /var/log/skype/
# chown apache.apache /var/db/skype /var/run/skype/ /var/log/skype/

# mv launch-skype.sh /etc/init.d/skype
# chmod 755 /etc/init.d/skype

# /etc/init.d/skype start
# chkconfig --add skype
# chkconfig skype on
x11vncを使ってVNC可能に

EPELからインストール。xinetdでデーモン化します。

# yum install xinetd

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
# yum install x11vnc

# vim /etc/xinetd.d/x11vnc
service x11vnc
{
        port            = 5900
        type            = UNLISTED
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = apache
        server          = /usr/bin/x11vnc
        server_args     = -inetd -o /var/log/skype/xinetd.log -display :20 -xauth /var/run/skype/Xauthority
        disable         = no
}
# /etc/init.d/xinetd restart

コマンドラインでx11vncを起動する場合はこんな感じ

# sudo -u apache  /usr/bin/x11vnc -display :20 -xauth /var/run/skype/Xauthority
VNCで接続してSkypeに接続

自分はUrtraVNC使ってます

承認画面で承認

GUI動作確認のときに使ったスクリプトコマンドラインからテスト

# sudo -u apache env DISPLAY=:20 XAUTHORITY=/var/run/skype/Xauthority python test.py

Skype4Pyの接続を許可します。「この選択を記憶する」のチェックを忘れずに

メッセージが届いたらSkypeのデーモン起動完了!

HTTPでブックマークしたチャットに投稿

mod_python使います

チャットをブックマーク

投稿したいチャットをBookmarkして名前をわかりやすいのに変更しておきましょう

pythonプログラムを設置
# yum install mod_python
# vim /etc/httpd/conf.d/skype.conf
Alias /skype/ /var/www/skype/
<Directory /var/www/skype/>
    AddHandler mod_python .py
    PythonHandler mod_python.publisher
</Directory>
# /etc/init.d/httpd start
# chkconfig httpd on

# mkdir /var/www/skype/
# vi /var/www/skype/chat.py

プログラムはとりあえずこんな感じ

# -*- coding: utf-8 -*-
import Skype4Py
import os
from mod_python import apache

def index():
        return "Hello! index"

def chat(req, chat_name, msg):
        os.environ["DISPLAY"] = ":20"
        os.environ["XAUTHORITY"] = "/var/run/skype/Xauthority"
        skype = Skype4Py.Skype(Transport='x11')
        skype.Attach()
        chat = getChat(skype, chat_name)
        chat.SendMessage(msg)
        req.write(msg)

def getChat(skype, chatName):
        for chat in skype.BookmarkedChats:
                if chat.FriendlyName == chatName:
                        return chat

これで冒頭のURLにアクセスすれば指定したチャットにメッセージが出てくるはず!!!