日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

<< 過去

未来 >>

りむったーに習ったシステムを自分で作る

かつてTwitterにりむったーというサービスがあった。

りむったー(remtter) on Twitter

Follow解除されたら、そのことについてダイレクトメッセージを使って知らせるサービスですわ。

Followされたことはメールでも通知が届くし、Followerを見れば新しいFollowerから上の方に並ぶからわかりやすいが、

Followが解除されたというのは気付きにくい。

Follow解除されたから僕もFollow解除するとかそういうわけじゃないけど、1つ目安としては役に立つものなのだが、

いろいろ苦労があるようで今のところこのサービスは止まってしまっている。


そういうわけで自分でこういう仕組みを作れないかなと考えてみた。

以前Perlで届いたメールについてTwitterに投稿する仕組みを作ったことがある。(参考記事 : OAuthで使うTwitter API)

このとき作ったTwitterアプリケーションを流用して、こいつに調べさせようと考えた。

具体的な方法だが、CPANのNet::Twitterを見ると、followers_idsというメソッドがある。

これを使うとFollowerのIDの一覧が得られる。IDというのは数値で表されて、ユーザー名などが変わっても変わらない。

これをファイルに保存しておいて、前回保存した一覧と比較して、減っていた人を報告させればいいと。そして改めてファイルに保存し直すと。

報告はE-mailでさせることにした。E-mailについてもPerlで送信したことあるしね。(参考記事 : 一人一人に年賀メールを送りましょう)

報告させるに当たってはIDでは誰か分からないので、ユーザー名と表示名についても示して送ることとする。


その結果完成したものがこれ。

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Net::Twitter::OAuth;
use FindBin;
use Mail::Sendmail;

my $client=Net::Twitter::OAuth->new(consumer_key=>'KEY',consumer_secret=>'SECRET');
my $token=do "$FindBin::Bin/oauthtoken.pl";
$client->access_token($token->{'access_token'});
$client->access_token_secret($token->{'access_token_secret'});
my @followers=();
for(my $cursor=-1,my $r;$cursor;$cursor=$r->{next_cursor}){
    $r = $client->followers_ids({'cursor'=>$cursor});
    push @followers,@{$r->{'ids'}};
}
@followers=sort{$a<=>$b}(@followers);
my @removed=();
open(my $ifh,'<',"$FindBin::Bin/follower.txt");
if($ifh){
  my $i=0;
  while(my $line=<$ifh>){
    chomp $line;
    $i++ while($followers[$i]<$line);
    if($followers[$i]!=$line){
      push @removed,$line;
    }
  }
  close($ifh);
  if(@removed){
    my $body="以下のユーザーからリムーブされました\n";
    for(@removed){
      my $info=$client->show_user($_);
      $body.=$info->{'screen_name'}.' : '.$info->{'name'}."\n";
    }
    my %params=(
      'Content-Type'=> 'text/plain; charset=ISO-2022-JP',
      'From'        => encode('MIME-Header-ISO_2022_JP','RemoveChecker <remove@example.com>'),
      'Subject'     => encode('MIME-Header-ISO_2022_JP','[Twitter] リムーブのお知 らせ'),
      'Message'     => encode('ISO-2022-JP',$body),
      'to'          => 'user@example.com'
    );
    sendmail(%params) or die $Mail::Sendmail::error;
  }
}
open(my $ofh,'>',"$FindBin::Bin/follower.txt");
print $ofh "$_\n" for(@followers);
close($ofh);

まず、クライアントを初期化する。ここのConsumer keyとComsumer secretはTwitterアプリケーションを作った時に発行されたもの。

そしてトークンを与えるわけだが、これはかつてOAuthを使う記事で書いた通り、トークンを得るための認証を行って得られたファイルより得る。

それで初期化後FollowerのIDを得るためにforループを書いているわけだが、

実はfollowers_idsは1回で5000ユーザー分も取得できる。そのためよっぽどの場合でない限り、

my @followers=sort{$a<=>$b}{@{$client->followers_ids->{'ids'}});

これでもいい。けど一応は何ユーザーでも対応できる書き方にしてある。

さて、FollowerのIDをソートして、ファイルを開いて比較するわけだが、

まず、1行読み取って、それと同じか大きなIDになるまで配列を進める。そして同じのがあるかチェックしてFollow解除を調べる。

そして解除されてたら@removedに投げ込む。

そして@removedに1つでも入ってたらメールを送信する。

show_userメソッドにIDを与えればいろいろ情報が得られるが、ここで必要なscreen_nameとnameのみ切り出す。

そしてMail::Sendmailを使って送信してやる。FromとToは自分に合わせて変更すればいい。

ここでは自分のサーバーのMTAを使って送るからSMTPサーバーは指定してないけど、指定したい場合はSmtpのパラメータを与えればいい。

あとは次回以降のために今のFollowerのID一覧を保存したら終わり。


あとはこれを毎日動かすだけ。それはcronに任せればOKですね。

crontabに書き足して完了。

りむったーみたいなサービス欲しいなと思ったら、これを参考に自分で作ればいいと思いますよ。

動かす環境、報告方法など人によっていろいろだと思いますが、そのあたりは自分で適当に選べばいいと思う。


Author : hidemaro
Date : 2010/12/04(Sat) 15:25
Linux・Net・Web | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools