日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)
- p (01/03)
- Thiramil (10/26)
- 久々にいまむらを食べたい通りすがり (09/28)
- Fluxadir (05/16)
- Antiprestin (11/08)
2010/01/16
_ [Perl][ネット諸々] Twitter の mention や DM をメール通知するスクリプト (OAuth 対応版)
Echofon とか Twitbird とか、iPhone の各種 Twitter アプリの有料版を買うと Global Push という機能があって mention や DM を iPhone にプッシュ通知してくれるらしい。
それと同じことを自前でやっている im.kayac.comでiPhoneにtwitterのリプライを通知するを見て、それって im.kayac.com にアカウント作らなくても MMS にメール送るだけでもほとんど同じことできるよな…と思い、Net::Twitter::Lite の練習がてら書いてみた。
#!/usr/bin/env perl
use strict;
use warnings;
use POSIX;
use Net::Twitter::Lite;
use Email::Send;
# Twitter の認証情報 ( http://dev.twitter.com/ から取得し設定)
my $consumer_key = 'xxxxxxxxxxxxxxxxxxx';
my $consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
my $access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
my $access_token_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
# メール通知元・先
my $mailfrom = '送信元として名乗る適当なメアド';
my $mailto = '通知したい iPhone の MMS アドレス';
# ファイル
my $lastidfile = 'MailTwitterMentions-lastid';
my $logfile = 'MailTwitterMentions.log';
my $nt = Net::Twitter::Lite->new(
consumer_key => $consumer_key,
consumer_secret => $consumer_secret) or die $!;
$nt->access_token($access_token) or die $!;
$nt->access_token_secret($access_token_secret) or die $!;
dbmopen my %lastid, $lastidfile, 0644 or die $!;
check('mention');
check('DM');
dbmclose %lastid;
exit;
sub check
{
my $type = shift;
logger("check new $type" . 's...');
$lastid{$type} ||= 1;
my $statuses = $type eq 'mention'
? $nt->mentions({ since_id => $lastid{$type}, count => 1 })
: $nt->direct_messages({ since_id => $lastid{$type}, count => 1 });
for my $status (@$statuses) {
my $sender = $type eq 'mention'
? $status->{user}{screen_name}
: $status->{sender_screen_name};
logger("new $type from $sender found.");
$lastid{$type} = $status->{id};
sendmail($type, $sender, $status->{text});
}
}
sub sendmail
{
my ($type, $name, $text) = @_;
my $sender = Email::Send->new({ mailer => 'SMTP' }) or die $!;
$sender->send(<<"EOD") or die $!;
From: $mailfrom
To: $mailto
Subject: $type from $name
Content-Type: text/plain; charset="UTF-8"
$name: $text
EOD
}
sub logger
{
if (defined $logfile) {
open my $fh, '>>:utf8', $logfile or die $!;
print $fh strftime('%Y-%m-%d %H:%M:%S ', localtime), @_, "\n";
close $fh;
}
}
あとはこれを適当に cron で回すと…

でも本当のプッシュ通知と違って handler を指定できないので「表示」を押すと MMS が開いてしまうのが×。
っていうかそもそも別にそんなに mension リアルタイムにチェックしたいわけじゃないんだけど。能動的に Echofon 開いた時に気づく程度で十分な気がする。
(2010年9月5日追記)
先月で Basic 認証が終了してしまったので OAuth 対応版に修正した。
