スペースモラトリアムノカミサマ

日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)

最近の TrackBack:
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|06|07|08|09|10|
2011|01|02|03|07|10|11|
2012|02|03|04|07|08|09|
2013|01|06|07|
2014|02|08|09|11|
2015|09|
2016|01|05|
2017|07|

2010/01/01 編集

_ [] あけました

あけましておめでとうございます。

仕事がいっぱいいっぱい過ぎるため今年は帰省と年賀状は無しですが、よろしくお願いします。


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 で回すと…

mension プッシュ通知画面

でも本当のプッシュ通知と違って handler を指定できないので「表示」を押すと MMS が開いてしまうのが×。

っていうかそもそも別にそんなに mension リアルタイムにチェックしたいわけじゃないんだけど。能動的に Echofon 開いた時に気づく程度で十分な気がする。

(2010年9月5日追記)

先月で Basic 認証が終了してしまったので OAuth 対応版に修正した。