2010年3月21日日曜日

PerlでTwitterAPI使ってみた。

ちょっと前にPerlでつくってみたけどサーバーが無いから公開してなかったやつを紹介。

入力した文字をTwitterで検索して、Google Chart Toolsを使ってどの時間帯に発言されたかを図に示すものを作ってみました。

※時間は世界標準時になってます。+9時間が日本時間です。
「#hanamaru」の結果。
偏ってます。0~1時のは、はなまるマーケット?

「#pandaneko」の結果。
こちらははなまる幼稚園専用っぽいです。上のヤツ以上に偏ってます。
それと、あまり流行ってないのか、結果が500未満です。

「#drrr」の結果。
一部突出してますが、意外と満遍なく発言されてる。

「#haiku」の結果。
発言が多すぎて500件では一日分とってこれてないです。

TwitterのsearchAPIっていろいろと分かってない部分が多くて、検索結果は最大で1500件ぐらいとってこられるみたいなんですが、古いTweetは取ってこられないみたいなんですよね。そんなに精度の高いものではないみたいです。

以下ソースコード。
よくわかってないで書いたのでダメダメです。
use strict;
use warnings;
use Net::Twitter;

print "Content-type: text/html\n\n";
print << 'HERE';
<html>
<head><title>test</title></head>
HERE
my $data;
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
my($name, $value) = split(/=/, $data);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
my $twitter = Net::Twitter->new();
my @times = ();
foreach my $page (0..4) {
 my $results = $twitter->search($value, { rpp=>100, page=>$page+1 });
 foreach my $key (@{ $results->{results} }) {
  push @times, ($key->{ created_at });
 }
}
my %trends = ('0' => 0, '1' => 0, '2' => 0, '3' => 0, '4' => 0, '5' => 0,
'6' => 0, '7' => 0, '8' => 0, '9' => 0, '10' => 0, '11' => 0,
'12' => 0, '13' => 0, '14' => 0, '15' => 0, '16' => 0, '17' => 0,
'18' => 0, '19' => 0, '20' => 0, '21' => 0, '22' => 0, '23' => 0);
for (@times) {
 $_ =~ s/0[0-9]:\d\d:/&count0($_); next;/e;
 $_ =~ s/1[0-9]:\d\d:/&count1($_); next;/e;
 $_ =~ s/2[0-9]:\d\d:/&count2($_)/e;
}
sub count0 {
 $_ =~ s/\d0:\d\d:/$trends{'0'}++/e;
 $_ =~ s/\d1:\d\d:/$trends{'1'}++/e;
 $_ =~ s/\d2:\d\d:/$trends{'2'}++/e;
 $_ =~ s/\d3:\d\d:/$trends{'3'}++/e;
 $_ =~ s/\d4:\d\d:/$trends{'4'}++/e;
 $_ =~ s/\d5:\d\d:/$trends{'5'}++/e;
 $_ =~ s/\d6:\d\d:/$trends{'6'}++/e;
 $_ =~ s/\d7:\d\d:/$trends{'7'}++/e;
 $_ =~ s/\d8:\d\d:/$trends{'8'}++/e;
 $_ =~ s/\d9:\d\d:/$trends{'9'}++/e;
}
sub count1 {
 $_ =~ s/\d0:\d\d:/$trends{'10'}++/e;
 $_ =~ s/\d1:\d\d:/$trends{'11'}++/e;
 $_ =~ s/\d2:\d\d:/$trends{'12'}++/e;
 $_ =~ s/\d3:\d\d:/$trends{'13'}++/e;
 $_ =~ s/\d4:\d\d:/$trends{'14'}++/e;
 $_ =~ s/\d5:\d\d:/$trends{'15'}++/e;
 $_ =~ s/\d6:\d\d:/$trends{'16'}++/e;
 $_ =~ s/\d7:\d\d:/$trends{'17'}++/e;
 $_ =~ s/\d8:\d\d:/$trends{'18'}++/e;
 $_ =~ s/\d9:\d\d:/$trends{'19'}++/e;
}
sub count2 {
 $_ =~ s/\d0:\d\d:/$trends{'20'}++/e;
 $_ =~ s/\d1:\d\d:/$trends{'21'}++/e;
 $_ =~ s/\d2:\d\d:/$trends{'22'}++/e;
 $_ =~ s/\d3:\d\d:/$trends{'23'}++/e;
}
print "<body>\n";
print "<form method='post' action='http://localhost/cgi-bin/twi.cgi'>\n";
print "<input name='tag' type='text' />\n";
print "<dl><dt>word</dt><dd>$value</dd><dt>tweets</dt><dd>";
print my $line = @times, "</dd></dl>\n";
print "<img src=\"http://chart.apis.google.com/chart?cht=bvg&chs=800x300&chxt=x,y&chxl=0:|0:00|1:00|2:00|3:00|4:00|5:00|6:00|7:00|8:00|9:00|10:00|11:00|12:00|13:00|14:00|15:00|16:00|17:00|18:00|19:00|20:00|21:00|22:00|23:00|24:00&chd=t:$trends{'0'},$trends{'1'},$trends{'2'},$trends{'3'},$trends{'4'},$trends{'5'},$trends{'6'},$trends{'7'},$trends{'8'},$trends{'9'},$trends{'10'},$trends{'11'},$trends{'12'},$trends{'13'},$trends{'14'},$trends{'15'},$trends{'16'},$trends{'17'},$trends{'18'},$trends{'19'},$trends{'20'},$trends{'21'},$trends{'22'},$trends{'23'}\" />";
print "</body>\n";
print "</html>";
なんて非効率なコード・・・

参考サイトなど:
Net::Twitter - search.cpan.org
Google Chart Tools - Google Code
Twitter 検索API メモ - 超自己満足プログラミング
Twitter search api - cool_ni_ikouの日記
正規表現 | Perl講座 [Smart]
Perl/CGI研究室 'PERL-LABO'

2010年3月20日土曜日

最近

このブログの駄目なところはジャンルを統一しないところですね。

今回は雑記です。
最近は専ら就職活動をしてます。そのついでに東京観光などをしてみたり。
湯島聖堂明治神宮カンボジア大使館
東京って坂道多いですね。

あと、本屋にも結構寄ります。品揃えが全然違うので。
気になった本をメモ。



最後に東京とは関係ないですが、
これ買いました。「激闘~Battle No.2~」欲しさに。
RPGのボス戦の曲で一番好きな曲だし、Amazonの中古で1000円ぐらいなので1つの曲のために買うのも悪くないかなーと。
ただこの曲聴いてたら他のサントラも欲しくなってしまった。特にOPとED曲は欲しい・・・

2010年3月14日日曜日

Perlのforeachで・・・

先日ちょっとPerlを書く機会があって、その時に次のようなコードを書いてみた。
#!/usr/bin/perl
use strict;
use warnings;

# コピー元の配列作成
my @a = ("One", "Two", "Three", "123");
# コピー先の配列
my @b = ();

foreach my $val (@a) {
 push @b, $val;
 $val = "Change";
}
print @b, "\n";
print @a, "\n";

これ実行結果は、
OneTwoThree123
ChangeChangeChangeChange
となるのですが、なんかこれちょっと不思議な感じがする。個人的に。
$valに代入してるつもりが、@aの要素にも代入されてるのが気持ち悪いのかな?
うっかり元配列まで変更しないように気をつけないといけませんね。