skype-cli

昨日のコードを元に、skype-cli というコマンドラインツールを書いた。

typester/skype-cli-osx - GitHub

Skype の Desktop API っていうのはマシン上で起動している Skype と通信することで、Skypeの機能にアクセスするAPIで、プラットフォーム毎に通信手段はことなるが、つながってしまったあとの通信内容はテキストベースのプロトコルとなっている。

なので、このテキストプロトコルをtelnet感覚で標準入出力でアクセスできるツールを作ってみたという感じ。

これを子プロセスで実行することで、nodeやEmacsなどからも簡単にSkype APIがたたける、はず。

なんだけど、実際にnodeで以下のようなコードを書いてみてもうまく動かない。

var child_process = require("child_process");

var skype = child_process.spawn("./skype-cli");

skype.stdout.setEncoding("utf8");
skype.stdout.on("data", function (data) {
    console.log("stdout: %s", data);
});

skype.stderr.setEncoding("utf8");
skype.stderr.on("data", function (data) {
    console.log("stderr: %s", data);
});

process.stdin.resume();
process.stdin.setEncoding("utf8");
process.stdin.pipe(skype.stdin, { end: false });

skype.on("exit", function (code) { process.exit(code) });

なーんでか。

by typester / at 2011-12-16T18:00:00 / osx · skype / Comment

Cocoa::Skype とか

Cocoa:: なんちゃらでほしいものを聞いていたときにも挙がっていた Cocoa::Skype だけど、その昔Skype4COMを使った記憶があって、SkypeAPI のバインディング書くのはめんどそうな印象だったのだが、 今日 Skype.framework のヘッダファイルみたら、

#import <Cocoa/Cocoa.h>

@protocol SkypeAPIDelegate;

@interface SkypeAPI : NSObject 
{

}

+ (BOOL)isSkypeRunning;             
+ (BOOL)isSkypeAvailable;       // You can only connect and send commands when this method returns YES.
                                // For example, when Skype is running, but user is logged out, then it returns NO.

+ (void)setSkypeDelegate:(NSObject<SkypeAPIDelegate>*)aDelegate;
+ (NSObject<SkypeAPIDelegate>*)skypeDelegate;
+ (void)removeSkypeDelegate;

+ (void)connect;
+ (void)disconnect;

+ (void)sendSkypeCommand:(NSString*)aCommandString;
@end


// delegate protocol
@protocol SkypeAPIDelegate
- (NSString*)clientApplicationName;
@end

// delegate informal protocol
@interface NSObject (SkypeAPIDelegateInformalProtocol)
- (void)skypeNotificationReceived:(NSString*)aNotificationString;
- (void)skypeAttachResponse:(unsigned)aAttachResponseCode;              // 0 - failed, 1 - success
- (void)skypeBecameAvailable:(NSNotification*)aNotification;
- (void)skypeBecameUnavailable:(NSNotification*)aNotification;
@end

と想像以上に短く、これならすぐバインディング書けそうだなーということで気分転換もかねてPerlバインディングをつくってみた。

typester/Cocoa-Skype - GitHub

使い方は付属の example を参照のこと。 Skype.framework の機能は全部つけてある。 Perl サイドのメソッド名とかはまだ変更するかもしれない。暇なときにドキュメントつけてリリースしよう。

by typester / at 2011-12-15T22:52:00 / perl · skype · osx / Comment