2012/10/29

Recent entries from same category

  1. PerlでWindowsと親和性の高いreadlineが欲しい → あった「Caroline」
  2. Perl をゆるふわと語ろう
  3. cpanfile とは何か、なぜそれを使いたいのか
  4. plackup の --path 引数
  5. Amon2::LiteでとCPANモジュールで作る「Nopaste」チュートリアル

Github Notification API が出ました。
Notifications API - GitHub

Recent posts in this category Notifications API technoweenie on October 26, 2012 Latest commit per d...

https://github.com/blog/1306-notifications-api
github の通知を取得する場合、これまでは miyagawa さんが github growler でやっていた様に、ダッシュボードのRSSを使って自分のイベントを抽出しなければなりませんでしたが、Notification API を使う事で Github 上と同じ通知メッセージが取れる様になりました。
今日は Perl で Github のメッセージを通知するアプリケーションを作ってみました。
#!perl

use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Encode;
use JSON;
use Term::ReadKey;
use Data::Deduper;
use Growl::Any;

my ($username$password);

print "Username: ";
chomp($username = <STDIN>);
print "Password: ";
ReadMode(2);
chomp($password = ReadLine(0));
ReadMode(0);
print "\n";

my $ua = LWP::UserAgent->new;
$ua->ssl_opts(verify_hostname => 0);

my $req = HTTP::Request->new('POST''https://api.github.com/authorizations');
$req->content(to_json {
    scopes => ['notifications'],
    note => 'github-notification.pl',
    note_url => 'https://github.com/mattn/github-notification',
});
$req->authorization_basic($username$password);
my $res = from_json $ua->request($req)->decoded_content;
my $token = $res->{token};

my $dd = Data::Deduper->new(
    expr => sub {
        my ($a$b) = @_;
        $a->{id} eq $b->{id}
    },
);

my $growl = Growl::Any->new(
    appname => 'Github Notification',
    events => ['notification''error'],
);

while (1) {
    $res = $ua->get("https://api.github.com/notifications?access_token=$token");
    my $items = from_json decode_utf8 $res->decoded_content;
    for ($dd->dedup($items)) {
        $growl->notify(
            'notification',
            $_->{subject}->{title},
            $_->{description},
            $_->{repository}->{owner}->{avatar_url})
    }
    sleep($res->header('X-Poll-Interval') || 60);
}
前半部分はトークンを取る処理で、パスワードは token を得る為だけに使っています。
簡単ですね。これでどんなネタ振りも取りこぼす事無く反応出来ますね!
github notification
Posted at by