携帯でSkype

携帯でSkype
スマートフォンだとSkypeが使えるらしい。
なんだか悔しいから普通の携帯からSkype(チャットのみ)を使える様にしてみた。

携帯Skypeの構成

1. 起動しているSkypeapplescriptから操作/情報取得出来る。
2. phpからapplescriptを使い、掲示板風の携帯サイトでSkypeを操作出来るようにしたい。
3. phpにはapplescriptを実行する権限が無いから、権限を持って起動させたjavaプログラムを仲介役に使う。
 ということで、次のような構成に。

PHP -[socket]- Java -[exec]- AppleScript -[send command]- Skype

phpから直接applescriptを実行出来る様に権限を与えておくとか
javaから直接Skypeを操作する(Skype API For Java)ことも可能かな

Skype from AppleScript

AppleScriptからSkype APIを使う方法

tell application "Skype"
	set result1 to (send command "SKYPEコマンド1" script name "ほげ")
	set result2 to (send command "SKYPEコマンド2" script name "ほげ")
end tell

これでOK。
send commandがどういった仕組みなのかはよくわからない。

SKYPEコマンド
今回使ったSKYPEコマンドについて
詳細は http://www.google.com/search?q=SKYPE%20API%20PDF から

SEARCH FRIENDS
コンタクトリスト(skype nameの羅列)を取得する

GET USER [skypename] [property]
ユーザーの詳細情報を取得する

  • GET USER tompng_fake_skypename ONLINESTATUS
  • GET USER pngtomfakename FULLNAME

SEARCH RECENTCHATS
最近のチャットリスト(チャットIDの羅列)を取得する

GET CHAT [chatid] [property]
チャットの詳細情報を取得する

  • GET CHAT #hoge/$piyo;12345678 FRIENDLYNAME
  • GET CHAT #piyo/$hoge;98765432 RECENTCHATMESSAGES
    • 最近の発言(メッセージIDの羅列)を取得

GET MESSAGE [messageid] [property]
メッセージの詳細情報を取得する

  • GET MESSAGE 63 STATUS
  • GET MESSAGE 1025 PARTNER_HANDLE
  • GET MESSAGE 8182 TIMESTAMP
  • GET MESSAGE 66636 BODY

SET MESSAGE SEEN
メッセージを既読にする

CHATMESSAGE [chatid] [message]
チャットIDを指定して発言

  • CHATMESSAGE #tom/$png;89abcdef このチャットは侵略したでゲソ!

MESSAGE [skypename] [message]
ユーザーを指定してメッセージ送信

  • MESSAGE exampleskypename_ikamusume 伊勢エビの当選おめでとうございます!

必要な機能
上記のコマンドを組み合わせて
・最近のチャットの[チャットID チャット名 未読メッセージ数]を取得する機能
・コンタクトリスト(skype名 表示名 状態)を取得する機能
・チャットIDを指定して、チャットの情報(参加者、最新メッセージ(発言者,時間,本文))を取得する機能
・チャットIDもしくは送信先ユーザーを指定してメッセージを送る機能
を作る。

Java

ServerSocketで待機して、applescriptをexecした結果を返す

class SkypeSession extends Thread{
	public static void main(String args[]){
		while(true){
			new SkypeSession(serversocket.accept()).start();
		}
	}
	public void run(){
		引数=socket.read();
		cmdarray=["osascript","スクリプトファイル.applescript",引数]
		Process proc=Runtime.getRuntime().exec(cmdarray);
		socket.write(procの結果文字列);
		socket.close();
	}
}

PHP

socket経由でjavaに要求を出す

function skypeCMD($arg){
	global $PORT;
	$fp=fsockopen("localhost",$PORT);
	fwrite($fp,$arg);fflush($fp);
	$retval="";
	while($s=fread($fp,1024))$retval.=$s;
	fclose($fp);
	return $retval;
}

セキュリティ

Javaではsocketの接続先IP(loopbackのみとか)で制限したり
PHPではIP帯域と携帯の識別番号とか普通のパスワード認証とかをかけてやればいい。

そしてついに


いたって普通の地味な掲示板っぽい見た目だけども

これ俺もでスマフォ(疑似)ユーザーの仲間入り!