#!/Perl5.8/bin/perl.exe use LWP::Simple; use CGI qw(:cgi); use URI::Escape; ### 初期設定(必要な場合、デフォルト項目3箇所のみ設定してください) # 本CGIを置くパスの設定 my $cgi_path = "http://localhost/cgi-bin";### デフォルト ### # 検索パターンの取得 my $pattern = ".";#### デフォルト ### if($ARGV[0]){ $pattern = $ARGV[0];# コマンドライン第1引数から }elsif(param('pattern')){ $pattern = param('pattern');# CGIのパラメータ、patternから } # usernameの取得 my $tw_user = "jscripter";### デフォルト ### if($ARGV[1]){ $tw_user = $ARGV[1];# コマンドライン第2引数から }elsif(param('tw_user')){ $tw_user = param('tw_user');# CGIのパラメータ、tw_userから } # 追加モードの設定 my $addmode = 1;# 2: 全取得モード if($ARGV[2]){ $addmode = $ARGV[2]; }elsif(param('addmode')){ $addmode = param('addmode'); } # ツイッタープロファイルのURLの取得 my $tw_url = "http://twitter.com/" . $tw_user; # ページを移動する際、再帰的に本CGIからURLを取得する場合にusernameを取得 if(param('tw_url')){ $tw_url = param('tw_url'); if($tw_url =~ /^http:\/\/twitter.com\/([^\?]+)$/){ $tw_user = $1;# CGIパラメータをURLが持たない場合 }elsif($tw_url =~ /^http:\/\/twitter.com\/(.+?)\?/){ $tw_user = $1;# CGIパラメータをURLが持つ場合 } } # 現在のページの取得 my $ppage = 0; # ページを移動する際、再帰的に本CGIからURLを取得する場合にページ数を取得 if($tw_url =~ /page=(\d+)/){ $ppage = $1; } # 次ページがない場合のフラグ(1: 次ページなし) my $nopage = 0; my $npage = 0;# 次ページ数 my $new_tw_url = "";# 次ページのURL my $escaped_next_url = "";# 次ページのURLの値をエスケープしたもの my $prevpage = 0;# 前ページ数 my $prev_tw_url = "";# 前ページのURL my $escaped_prev_url = "";# 前ページのURLの値をエスケープしたもの ### CGI 最初の部分の出力 print < HEADER ### print "ADDMODE: ",$addmode,"\n"; while(!$nopage){ # 読み込みURLのCGI出力 print "

${tw_url}

\n"; ### ツイートデータの取得 # LWP::Simpleのgetメソッドに入力するためのURL変換 $tw_url =~ s/\&/\&/g; # LWP::SimpleのgetメソッドでURLに対応するHTMLを得る my $tw = get($tw_url); # HTML中のツイート部分を個別に配列に格納 #
  • (.+?)<\/li.*?>/sg); # 次ページのURLを取得、現在のページ数の取得 if($tw =~ /" . $ppage . "\n"; print "
    "; ### ツイートのCGI出力 my $year = ""; my %mon = (); my $month = ""; my $tweet = ""; foreach (@status_bodys){ if(/>.*?$pattern.*?/<\/div>/sg; # @usernameや#hashtagの処理 # "/username"や"/search?q=#hashtag"のハイパーリンクを補完する s/(<.*?)href="(\/[^\/]+?)"/${1}href="http:\/\/twitter.com$2"/sg; # published timestampを経過時間に替えて表示する if(/published timestamp.+?\w{3} (\w{3}) (\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2}) [\-\+]\d{4} (\d{4}).+?>/) { $year = $6; $month = $1; %mon = ( 'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04', 'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08', 'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12', ); unless (-e $year){ mkdir $year; } unless (-e "$year/$mon{$month}"){ mkdir "$year/$mon{$month}"; } unless (-e "$year/$mon{$month}/$tw_user"){ mkdir "$year/$mon{$month}/$tw_user"; } $tweet = $year . $mon{$month} . $2 . $3 . $4 . $5 . "_" . $tw_user . ".txt"; if (-e "$year/$mon{$month}/$tw_user/$tweet"){ print "*"; if($addmode == 1){ print "新規ツイートの取得を完了しました!\n"; $nopage = 1; last; } }else{ open(OUT, "> $year/$mon{$month}/$tw_user/$tweet"); print OUT $_; close OUT; s/().+?(<\/div>)/$1$3$2$4/; } } print $_; } } ### print "
    \n"; ### 進むページへのURL設定 if($nopage){ print "もうページはありません。\n";# 最後のページの場合 last; }else{ $tw_url = "http://twitter.com${next_tw_url}"; } ### # while loop interval sleep int(rand(10)) + 25;# アクセス頻度: 120回/時間程度 }# while loop end # CGIの最後の部分の出力 print "\n\n"; __END__