日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)
- p (08/29)
- もり (08/29)
- 匿名 (08/20)
- ふ (08/06)
- あ (08/03)
2010/01/16 編集
_ [Perl][ネット諸々] Twitter の mension や DM をメール通知するスクリプト
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 のユーザ名・パスワード
my $user = 'Twitter のユーザ ID';
my $pass = 'Twitter のパスワード';
# メール通知元・先
my $mailfrom = '送信元として名乗る適当なメアド';
my $mailto = '通知したい iPhone の MMS アドレス';
# ログファイル
my $logfile = 'twitterchecker.log';
my $nt = Net::Twitter::Lite->new(
username => $user, password => $pass) or die $!;
dbmopen my %lastid, 'twitterchecker-lastid', 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");
$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 開いた時に気づく程度で十分な気がする。
