2011年3月19日土曜日

TwitterのツイートをSkypeのムードに反映させる

Twitterのツイート(つぶやき)をSkypeのムードに反映させる方法です。
自分はTwitterの他にSkypeとWindows Live MessangerとFacebookを使ってるんですけど、近況報告はもっぱらTwitterだけなんです。
Live MessangerとFaceboookは設定すればツイートをそれぞれのサービスに反映させる機能を標準で持ってるんですが、
Skypeはそれがない。逆はあるのですが(ムード→ツイート)
調べたらSkype4COM.dllを使えば出来そうだったのでやりました。
ちなみに環境はWindows 7 64bitです。Skype4COMは32ビットバイナリですが、次のようにすれば64ビット環境で使えます。

1.Skype4COMをダウンロードして適当な場所に展開

2.Skype4COM.dll をレジストリに登録
regsvr32 Skype4COM.dll

3.ActivePerl x86版をダウンロードしてインストール。64ビット環境でもx86版をダウンロードする。

4.必要なモジュールをインストール
> cpan
cpan> install XML::RSS
cpan> install URI::Fetch
cpan> install Date::Parse

5.次のコードを書く(ちなみに私はtweet2skype.plというファイル名にしています)
#!/usr/bin/perl

use strict;
use warnings;
use Win32::OLE;
use URI::Fetch;
use XML::RSS;
use Date::Parse;
use Encode;

my $id = 'TwitterのID';

my $time = time;
my $fetch_response
= URI::Fetch->fetch(
       "http://twitter.com/statuses/user_timeline/$id.rss?dummy=$time")
or die URI::Fetch->errstr;
my $rss = XML::RSS->new;
$rss->parse($fetch_response->content);
die 'no items' if @{$rss->{items}} == 0;
my $item = $rss->{items}->[0];
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
= localtime(str2time($item->{pubDate}));
my $title = $item->{title};

my $mood = substr($title,length($id)+1,length($title));

$mood = Encode::encode('shiftjis', $mood);

my $skype = Win32::OLE->new('Skype4COM.Skype');
$skype->Client->Start unless $skype->Client->IsRunning;
my $profile = $skype->CurrentUserProfile;
$profile->{MoodText} = $mood;

6.定期的に実行されるようにタスクスケジューラを設定する
プログラム/スクリプト C:\Perl\bin\wperl.exe
引数 c:\program\tweet2skype.pl
みたいな感じ。