Subscribed unsubscribe Subscribe Subscribe

Notwifeの自分への通知を自分で行うスクリプト

Perl Twitter

Notwife、使ってみたら予想以上にイイカンジだったので愛用させていただいています。
http://notwife.heroku.com/
が、Notwifeが使用しているNotifoに利用回数の上限があるそうで、この先の運用が危うくなっているようです。
http://notwife.heroku.com/information
とは言え、月間10000回という使用回数はサービス提供側でなく個人での利用であれば十分な回数なので、Notwifeのサービスを経由せずに自分でNotifoのAPIを利用して通知するようにすれば、もしNotwifeが利用できなくなっても通知の恩恵は受けられるよね、ということで書いてみた。

#!/usr/bin/env perl
use strict;
use warnings;

use AnyEvent::Twitter::Stream;
use Config::Pit;
use Net::Twitter::Lite;
use WebService::Notifo;

my $config = pit_get('twitter.com', require => {
    consumer_key    => 'consumer_key',
    consumer_secret => 'consumer_secret',
    token           => 'token',
    token_secret    => 'token_secret',
});
my $screen_name = do {
    Net::Twitter::Lite->new(
        %$config,
        access_token        => $config->{token},
        access_token_secret => $config->{token_secret},
    )->verify_credentials->{screen_name};
};
my $notifo = WebService::Notifo->new;

my $cv = AE::cv;
my $listener = AnyEvent::Twitter::Stream->new(
    %$config,
    method => 'userstream',
    on_tweet => sub {
        my ($tweet) = @_;

        # Retweet
        if (my $retweet = $tweet->{retweeted_status}) {
            if ($retweet->{user}{screen_name} eq $screen_name) {
                my $from = $tweet->{user}{screen_name};
                my $text = $retweet->{text};
                $notifo->send_notification(msg => "Retweet from \@$from: $text");
            }
        }
        # Mention
        else {
            for my $mention (@{ $tweet->{entities}{user_mentions} }) {
                if ($mention->{screen_name} eq $screen_name) {
                    my $from = $tweet->{user}{screen_name};
                    my $text = $tweet->{text};
                    $notifo->send_notification(msg => "Mention from \@$from: $text");
                }
            }
        }
    },
    on_event => sub {
        my ($tweet) = @_;

        my $event  = $tweet->{event};
        my $from   = $tweet->{source}{screen_name};
        my $target = $tweet->{target_object} ? $tweet->{target_object}{text} : '';
        $notifo->send_notification(msg => "$event from \@$from: $target");
    },
    on_connect => sub {
        warn "on_connect";
    },
    on_delete => sub {
        warn "on_delete";
    },
    on_eof => sub {
        warn "on_eof";
    },
    on_error => sub {
        warn "on_error";
    },
    on_friends => sub {
        warn "on_friends";
    },
);
$cv->recv;

https://gist.github.com/718689


これを自分でどこかサーバーなりPCなりで動かしておけばNotwifeと同じような通知ができる…はず!
一応解説すると

api_key: *********************************************
user: sugyan

みたいなものを用意しておく。

  • favorite, followなどのeventはon_eventで取得できる。普通に"イベント名"と"誰からか"を取得して通知。
  • Retweet, Mentionはeventとしては流れてこないので、"自分の発言をRetweetされたものか", "Mentionの対象に自分が入っているか"を判別して通知。

Notifoについて思うこと

iPhoneへの通知だけならim.kayac.comが非常に便利なツールとして使えるのだけど、Notwifeのように外部サービスがそのAPIを使えるようにと仕組みがつくってあるNotifoは流石だなぁと思った。ここまでちゃんと作っているのがすごい。
http://notifo.com/desktop#macのおかげでGrowlにも通知してもらえるようになって、便利。