日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: 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 対応版に修正した。