☆Twitterのタイムラインをマージする

Twitterのタイムラインをマージしたいと思って、下記のようなスクリプトを書きました。
毎度初心者レベルなものですいません。
作った環境はUbuntu Karmic Koala。
libdatetime-format-dateparse-perl パッケージを導入していることが前提です。
導入した覚えがない場合は下記のようにして導入してください。
これを使う理由は☆Twitter の投稿時刻をPerlでローカル時刻にするを見てください。

$ sudo apt-get install libdatetime-format-dateparse-perl

tw_merge.shtw_merge_rev.pl をダウンロードして、実行権限をつけ、下記のようにして使います。
~/tmp というディレクトリを作るか、tw_merge.sh の HTML_TMP_DIR の指定を適当に変えてください。
スクリプトで作成したファイルは残ったままになるので、ときどき手動で削除してください。

使用例
$ tw_merge.sh _hito_ mizuno_as pores_n ikunya seotch henrich
$ tw_merge.sh 'cc_jp?max_id=11149920499&per_page=20' 'henrich?max_id=11149420427&per_page=24' 'Say_no?max_id=11150167435&per_page=4'
$ tw_merge.sh 'HPLinuxJP?max_id=11248010182&per_page=7' 'henrich?max_id=11192408823&per_page=2' 'henrich?max_id=11247481244&per_page=3'

ブラウザで結果が表示されます。
結果はTwitterのWeb表示とは逆順になります。
通常と同じ順番が場合はtw_merge_rev.plの下から4行目
「sort keys %TWEET」の部分を「reverse sort keys %TWEET」に修正してください。

最初の例の場合、リストと違って発言の多い人と少ない人でズレがでてきてしまうのが難点です。
揃えたい場合はper_pageでTweetの数を調整します。
古い時期の発言を揃えて見たい場合はmax_idを使います。

max_idやper_pageはあらかじめFirefoxで見たいところを選択して選択部分のソースをみて調べておきます。
(これが一番大変なのですが、簡単な方法が思いつきませんでした。)

一応リストもマージ対象に出来ます。 通常 user_name のところに user_name/list_name としてやればOKです。
(ちょっと表示がおかしくなりますが、読めないことはないです。)
リストが対象に入っている場合は、リストを引数の先頭にしてください。

tw_merge.sh
#!/bin/bash
HTML_TMP_DIR=~/tmp
OUT_HTML=${HTML_TMP_DIR}/TwitRev-`date '+%F-%H%M%S'`-$$.html

i=0
for arg in $*
do
  html=${HTML_TMP_DIR}/`echo $arg | sed -e 's#[/?&]#_#g'`.html
#  HTMLS="$HTMLS $html"
  HTMLS[$i]=$html
  wget -O - http://twitter.com/$arg |sed -e 's#</li>#</li>\n#;' > ${html}
  i=$(($i+1))
done

tw_merge_rev.pl ${HTMLS[*]} > $OUT_HTML
x-www-browser $OUT_HTML &
tw_merge_rev.pl
#!/usr/bin/perl
use DateTime;
use DateTime::Format::DateParse;
my $tzhere = DateTime::TimeZone->new( name => 'local' );

my $thumb_span_tmplt = <<'EOF';
<span class="thumb vcard author">
<a href="http://twitter.com/%s" class="tweet-url profile-pic url">
<img alt="%s" class="photo fn" height="48" src="%s" width="48" />
</a>
</span>
EOF


sub repTime
{
  my $gmt = shift;
  $dt = DateTime::Format::DateParse->parse_datetime($gmt);
  $dt->set_time_zone($tzhere);
}

my $is_header_saved = 0;
my $is_footer_saved = 0;
my (@HEADER, @FOOTER);
my (%TWEET);

for $twhtml (@ARGV){
    open TWHTML, $twhtml or die "$!:$twhtml\n";

    my $screen_name;
    my $url_screen_name;
    my $thumb_span;

    # search start of tweets.
    while(<TWHTML>){
      if(not $is_header_saved){
        s#<head>#<head><base href="http://twitter.com/" />#;
        push @HEADER, $_;
      }
      last if m#<ol id='timeline' class='statuses'>#;

      # build screen_name span
      if(!$screen_name and m#<meta content="(.+)" name="page-user-screen_name" />#){
        $screen_name = $1;
        $url_screen_name = qq(<strong><a href="http://twitter.com/$1">$1</a></strong>);
      }

      # buid thumb span
      if(!$thumb_span and m#<a href="/account/profile_image/.*src="([^"]+)"#){
        my $src_url = $1;
        $src_url =~ s#_bigger\.(\w+)$#_normal.\1#;
        $thumb_span = sprintf $thumb_span_tmplt, $screen_name, $screen_name, $src_url;
      }
    }
    $is_header_saved = 1;

    # save tweets
    OUTER:
    while(1){
      my($id, $tweet);
      while(<TWHTML>){
        last OUTER if m#</ol>#;
        $id = $1 if /id="status_(\d+)"/;
        s#(<span class="published timestamp" data="{time:'([^']+)'}">)[^<]+</span>#$1 . repTime($2) . "</span>"#e;
        $tweet .= $_;
        last if m#</li>#;
      }

      # add $url_screen_name and $thumb_span if not contained.
      if( $tweet !~ m#class="tweet-url screen-name"#){
        $tweet =~ s#<span class="status-body">#$thumb_span <span class="status-body" style="padding-left:48px;">#;
        $tweet =~ s#<span class="status-content">#<span class="status-content"> $url_screen_name#;
      }

      $TWEET{$id} = $tweet;
    }

    if(not $is_footer_saved){
        @FOOTER = $_;
        # save remaining
        while(<TWHTML>){
          push @FOOTER, $_;
        }
        $is_footer_saved = 1;
    }

    close TWHTML;
}

print @HEADER;
for (sort keys %TWEET){
    print $TWEET{$_};
}
print @FOOTER;

0 件のコメント:

コメントを投稿