Twitter ダウンローダー

指定したTwitterアカウントのツイートを、指定した数だけテキスト形式でダウンロードするプログラム。

#!/usr/local/bin/perl
# tdown.pl
use strict;
use warnings;
use LWP::Simple;
use Time::Piece();

# 本日の日付を名前にしたフォルダを作成
my $localTime = Time::Piece::localtime();
my $yymmdd = $localTime->strftime('%y%m%d');
mkdir "./$yymmdd";

# -tオプションを取得
my $opt = shift || 'n/a';

# 取得したいアカウント名(キー)とツイート数(値)のペアを取得
# 何ペアでも一度に入力可
# 入力例:masason 120 kazuyo_k 55 kenichiromogi 89
my %h = split /\s/, <STDIN>;

# 各アカウントにつき、指定した数のツイートをダウンロード
# ただしツイート数の増分単位は20で、端数は切り上げ
my $user;
my $cont;
my $pmax;
my $retweet;
my $fragment;
my $tweetTime;
while (($user, $cont) = each(%h)) {	
	
	# 端数切り上げ
	if ($cont % 20 != 0) {
		$pmax = int($cont/20)+1;
	} else {
		$pmax = $cont/20;
	}
	
	print "Downloading latest $cont tweets of \@$user\n";
	unlink "$yymmdd/$user.txt";
	
	for (1..$pmax) {
		
		print "$_/$pmax\n";
		getstore("http://twitter.com/$user?page=$_", "temp.txt");
		
		open FILE, "<temp.txt";		
		while(<FILE>) {
			open OUT, ">>$yymmdd/$user.txt";
			
			# 公式RTのアイコンを取得
			if ( /<strong><a href="http/ ) {
				$_ =~ /class="tweet-url screen-name">(.+)<\/a>/;
				print OUT "[*R* $1] ";
				$retweet = 1;
				
			# 本文を取得(改行があれば「 = NL = 」に変換)
			} elsif ( /<span class="entry-content">(.*?)<\/span>/ ) {
				&replace;
				print OUT "$_\n\n";
			} elsif (/<span class="entry-content">(.*?)\n/){
				&replace;
				print OUT "$_ = NL = ";
				$fragment = 1;
			} elsif ( (/^(.*?)<\/span>\n/) and ($fragment) ){
				&replace;
				print OUT "$_\n\n";
				$fragment = 0;
			} elsif ( (/^(.*?)\n/) and ($fragment) ){
				&replace;
				print OUT "$_ = NL = ";
				
			# -tオプションで日時を取得
			} elsif (( /<span class="published timestamp"/ ) and ( $opt eq '-t')) {
				$_ =~ /data="{time:'([^']+)'/;
				$tweetTime = Time::Piece::localtime();
				$tweetTime = Time::Piece->strptime($1, '%a %h %e %T %z %Y');
				
				# UTC(協定世界時)+9時間
				$tweetTime += 32400;
				
				# 月、日、時間、分、秒、曜日をそれぞれ変数に格納
				my $month  = $tweetTime->mon;
				my $mday   = $tweetTime->mday;
				my $hour   = $tweetTime->hour;
				my $minute = $tweetTime->minute;
				my $second = $tweetTime->sec;
				my @week_names = ('日', '月', '火', '水', '木', '金', '土');
				my $wday = $tweetTime->wdayname(@week_names);
				
				print OUT "  == $month$mday日($wday$hour:$minute:$second ==";
				print OUT "\n\n" if !$retweet;
				
			# 公式RTの数を取得
			} elsif ( /<span class="shared-content">/ ) {
				$_ =~ /<\/a>[^\d]+([0-9+]+)[^\d]+/;
				$_ = $1 || 0;
				print OUT " $_ others retweeted ==\n\n" if $opt eq '-t';
				print OUT "  == $_ others retweeted ==\n\n" if $opt ne '-t';
				$retweet = 0;
			}
		}
		close OUT;
	}
}

# 本文中のHTMLタグを削除
# 文字はエスケープしない
sub replace {
	$_ = $1;
	s/<[^>]+>//g;
	s/&\#123;/{/g;
	s/&\#125;/}/g;
	s/&amp;/&/g;
	s/&quot;/"/g;
	s/&gt;/>/g;
	s/&lt;/</g;
}

例えば孫正義のツイートを最新から120件、勝間和代を55件、茂木健一郎を89件取得したい場合はコマンドライン

% perl tdown.pl [-t]
masason 120 kazuyo_k 55 kenichiromogi 89

とすると、進捗を示しながらダウンロードしてくれる。

カレントディレクトリに日付名のフォルダができて、その中にmasason.txt, kazuyo_k.txt, kenichiromogi.txt というファイルが作られる。オプション -t で各ツイートの日付・時刻も取得できる。


参考:http://www.moonmile.net/blog/archives/860