はてなハイクAPIを使用して、指定キーワードのタイムラインを取得する

kujoo2009-05-08



さっき小一時間くらい使ってちょこっと書いてみた。


Net::Twitterを継承したパッケージを書いた方が良さそうですが・・・。

#!perl
use strict;
use warnings;
use URI::Escape;
use XML::TreePP;
use Data::Dumper;


 # 初期化系

 my $keyword = uri_escape('ひとりごと'); # このタイムラインを取得する
 my $api_uri = 'http://h.hatena.ne.jp/api/';
 my $api_method = 'statuses/keyword_timeline/';
 my $api_format = '.xml';
 my $date_time;
 my $datetime_filename = 'datetime';
 my $param_count = '200';
 my $param_since;


 # 前回取得した時間を読込む

 open my $datetimefile, '<', $datetime_filename
  or $param_since = '2001-01-01T00:00:00Z';
 if(! $param_since) {
  while(<$datetimefile>) {chomp; $param_since = $_;}
 }


 # 指定キーワードのタイムラインを取得

 $api_uri = $api_uri . $api_method . $keyword . $api_format;
 $api_uri .= "?count=$param_count";
 $api_uri .= "&since=$param_since" if($param_since);
 # ページ指定は使わないかな〜?

 my $xtpp = XML::TreePP->new(force_array => [qw(status)]);
 my $contents = $xtpp->parsehttp(GET => $api_uri);
 my $status = $contents->{statuses}->{status};

 foreach my $hash (@$status) {
  $date_time = $hash->{created_at}; last;
 }


 # ダンプってみる

 print Dumper $contents;


 # タイムライン取得した日時を保存

 if($date_time) {
  open(OUT, ">$datetime_filename") or die;
  print OUT $date_time;
  close(OUT);
 }

 exit;


あいかわらずアレですが・・・。

GETもPOSTも処理できるようなので(といってもLWP::UserAgentをラップしてるのかな)、XML::TreePPを選択してみました。JKL.ParseXMLを使ったこともあるのでw

JSONの方が世の中的には良いんですかね・・・。まあ、本質的な操作は行わないと思うのでいつでも変えられるかな。

前回取得した時の最後の記事の時間を記録して、次回はAPIにその時間を渡して以降の記事を取得するようにしてます。秒単位なのでタイミングによってはこぼしそうなんですけど・・・。別にいっか。

あとで、各ユーザーIDとかを纏めて、それぞれの過去タイムラインを取得する処理を加える。

本文は、keyword=本文になっているものもあるので=前がキーワードと一致したら削除。

本文纏めてyahoo apiに渡す。そういえばあそこの戻りってXMLだよね。じゃあ、XMLでいいか。



カミナリこえ〜。=