stMind

about Tech, Computer vision and Machine learning

AnyEvent::Twitter::StreamとGrowl::Anyでinstagramをデスクトップに通知する

instagramのAPI公開が待ち遠しい今日この頃ですが、instagramのリンク付きtweetを拾ってGrowlで通知するスクリプトを書いてみました。別のことをしながらでもinstagram付きのtweetがお手軽に確認できます。

スクリプトソース

ソースは、AnyEvent::gist: 801843 - GitHub

#!perl

use strict;
use warnings;

use Config::Pit;
use Growl::Any;
use AnyEvent::Twitter::Stream;
use Encode;
use Web::Scraper;
use URI;

my $done = AE::cv;

my $config = pit_get("twitter.com", require => {
    "consumer_key" => "consumer_key on twitter.com",
    "consumer_secret" => "consumer_secret on twitter.com",
    "access_token" => "access_token on twitter.com",
    "access_token_secret" => "access_token_secret on twitter.com"
});

my $growl = Growl::Any->new;
$growl->register("my app", ["tweet"]);

my $streamer; $streamer = AnyEvent::Twitter::Stream->new(
    consumer_key => $config->{consumer_key},
    consumer_secret => $config->{consumer_secret},
    token => $config->{access_token},
    token_secret => $config->{access_token_secret},
    method => 'userstream',
    on_tweet => sub {
        my $tweet = shift;

        if( defined($tweet->{text}) &&  $tweet->{text} =~ /(http:\/\/instagr.am\/(.+))/ ) {

            my $s = scraper {
                process ".photo", link => '@src';
            };

            my $res;
            eval { $res = $s->scrape(URI->new($1)) };
            # Error処理
            if( $@ ) {
                print "Exception: $@";
            }
            else {
                print "$tweet->{user}{screen_name}: $res->{link}\n";

                $growl->notify(
                    "tweet",
                    encode_utf8($tweet->{user}{screen_name}),
                    encode_utf8($tweet->{text}),
                    $res->{link}
                );
            }
        }
    },
    on_error => sub {
        my $error = shift;
        warn "ERROR: $error";
        $done->send;
    },
    on_eof => sub {
        $done->send;
    },
);

$done->recv;

結果

TLにinstagramのtweetが投稿されると、こんな感じで通知されます。

f:id:satojkovic:20110130224557p:image

写真がちょーっと小さいですがw、大きい画像はブラウザなりtwitterクライアントなりで確認してもらうということで。