PerlのGrowlライブラリって色々ある訳ですが、誰かが書いたGrowlするアプリのコードを実行しようとした際にWindowsやLinuxで動かないと少し悲しくなります。
そこでGrowl::Anyってのがあればいいんじゃね?って事で書いてみました。
Mac::Growl、notify-send、Desktop::Notify、Net::GrowlClient、Growl::GNTPのどれかがインストールされていれば使えます。
mattn's p5-Growl-Any at master - GitHub
perl module that provide any growl application
http://github.com/mattn/p5-Growl-Any
今日はこれを使って、twitterのhome_timelineをGrowlするスクリプトを書いてみました。
#!perl
use strict;
use warnings;
use Config::Pit;
use Encode;
use Growl::Any;
use Net::Twitter::Lite;
my $config = pit_get("twitter-growler");
unless ( $config->{access_token_secret} ) {
$config = pit_get(
"twitter-growler",
require => {
consumer_key => "YOUR_CONSUMER-KEY",
consumer_secret => "YOUR-CONSUMER-SECRET",
}
);
my $nt = Net::Twitter::Lite->new( %{$config} );
$| = 1;
print "Authorize this app at:\n ", $nt->get_authorization_url,
"\nAnd enter the PIN: ";
my $pin = <STDIN>;
chomp $pin;
my ( $access_token, $access_token_secret, $user_id, $screen_name ) =
$nt->request_access_token( verifier => $pin );
$config->{access_token} = $access_token;
$config->{access_token_secret} = $access_token_secret;
pit_set( "twitter-growler", data => $config );
exit;
}
my $nt = Net::Twitter::Lite->new( %{$config} );
$nt->access_token( $config->{access_token} );
$nt->access_token_secret( $config->{access_token_secret} );
my $growl = Growl::Any->new();
$growl->register( "Growl/Twitter", ["tweet"] );
my $last_id = undef;
while (1) {
my @sl;
if ($last_id) {
@sl = $nt->friends_timeline( { count => 200, since_id => $last_id } );
}
else {
@sl = $nt->friends_timeline( { count => 5 } );
}
for my $s ( @{ $sl[0] } ) {
$last_id = $s->{id} unless $last_id;
$growl->notify(
"tweet",
encode_utf8( $s->{user}{screen_name} ),
encode_utf8( $s->{text} ),
$s->{user}{profile_image_url},
);
sleep(4);
}
}
上に書いたモジュールのどれかが入っていれば(notify-sendはコマンド)、MacでもLinuxでもWindowsでも動くはずです。
なお、実は現在Growl::Anyのパラメータをutf8フラグ付きにしようかどうか迷っているので、もしかするとその修正を入れた後にこのスクリプトを動かすと文字化けしてしまうかもしれませんので注意です。
今後ネットに転がっていたスクリプトを何も修正せずにGrowlする事が出来る様になれば、素敵な事だなと思います。
ちなみに上記のスクリプトですが、初回に実行するとconsumer_key/consumer_secretを聞かれます。ブラウザでPINを貰って入力するとConfig::Pitで設定を保存して終了するので、再度起動すると動き出します。
streamなAPIでもやってみたのですが、更新が多くGrowlの表示数が激しすぎたので一定間隔で取得する様にしてあります。お好みで修正してみて下さい。