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/&/&/g; s/"/"/g; s/>/>/g; s/</</g; }
例えば孫正義のツイートを最新から120件、勝間和代を55件、茂木健一郎を89件取得したい場合はコマンドラインで
% perl tdown.pl [-t]
masason 120 kazuyo_k 55 kenichiromogi 89
カレントディレクトリに日付名のフォルダができて、その中にmasason.txt, kazuyo_k.txt, kenichiromogi.txt というファイルが作られる。オプション -t で各ツイートの日付・時刻も取得できる。