カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

Perlで一日分のTwitterの発言を取る方法

概要: Perlを使ってTwitter上の一日の発言を引っこ抜く!


僕がTwitterでつぶやかなくなった理由という記事を書いてからなぜかモリモリTwitterでつぶやくようになったnyarlaです。 みんなつぶやいてますか?

まあそんな前置きはどうでもいいんですが、今日ふと無貌断片の方に、 一日分のTwitterの発言を投稿したらよさげなんじゃないかなーと思い投稿スクリプトを書いてたんですが、なんか途中で面倒になってきたので、 Twitterのタイムラインから一日の発言を引っこ抜く部分だけ抽出してBlogの記事にしてみることにしました。

ということでTwitterの発言から一日分を抜き出すコートは下記の通り。

#!/usr/bin/perl
# this code is under public domain.

use strict;
use warnings;

use XML::Feed;
use URI;

my $username    = 'nyarla';
my $userid      = '3402381';
my $timezone    = 'Asia/Tokyo';

my $now         = time;
my $yesterday   = $now - ( 60 * 60 * 24 );

my $page        = 1;
my $uri         = URI->new("http://twitter.com/statuses/user_timeline/${userid}.atom");
   $uri->query_form( count => 200, page => $page );

my @timelines   = ();

LOOP: while ( 1 ) {
    my $feed = XML::Feed->parse( $uri )
        or die "Failed to fetch twitter timeline feed: " . XML::Feed->errstr;

    for my $entry ( $feed->entries ) {
        my $twit = $entry->content->body;
           $twit =~ s{^$username:[ ]}{};

        my $date = $entry->issued;
           $date->set_time_zone( $timezone );

        if ( $date->epoch <= $yesterday ) {
            last LOOP;
        }

        push @timelines, +{
            twit => $tiwt,
            date => $date,
        };

        $page++;
        $uri->query_form( count => 200, page => $page );
    }

    sleep 1;
}

for my $timeline ( @timelines ) {
    my ( $twit, $date ) = @{qw( $timeline )}{qw( twit date )};
    # your code here.
}

exit;

なお上記のコードは自由に使って欲しいのでパブリックドメインとします。

んで解説。

最初の方の$username$userid$timezoneは各環境にあわせて書き換えてください。 $usernameはTwitter上のURIに使ってるscree name、$useridはTwitterのタイムラインのFeedのURIのなんかIDっぽい文字列、 $timezoneはPerlのDateTimeに指定できるタイムゾーンという感じです。

で、後の部分はTwitterのタイムラインから一日分の発言を引っこ抜く部分で、 一日分の発言が引っこ抜けるまで無限ループしてページを辿ってって、 引っこ抜けたらループを終わる、というコードです。 まあそのまんまなコード書いてるので、多分コード読めば理解できると思います。

まあコードの話は以上。

で、うちの空繰再繰と無貌断片ではplasxomという自作のBlogシステムを使ってて、 ファイルの管理にgitを使ってるんですが、空繰再繰と無貌断片に記事を投稿する時、

  1. 記事書く
  2. ローカルの管理ディレクトリに記事を追加
  3. git addして新しい記事をgitの管理下に置く
  4. git ci && git pushする
  5. サーバのpost-updateフックスクリプトがサーバ上のplasxomの記事ディレクトリをupdate

という感じの流れになるんですが、サーバ上で記事ファイルを生成とかすると、 git add && git ci && git pushをやらなくちゃいけなくなるのと、 記事を追加する前にローカルでgit pull origin masterしないと問題があるのと、 Twitterの一日のまとめログのタイトルどーすんだべ!?という問題に遭遇し、 なんかスクリプト書くのがめんどくさくなった次第。 まあちょっとした手間なんだけど、やる気が萎えてしまったと言う。

まあTwitterの一日の発言を引っこ抜く部分はできたんで、 まあ良しとしとこうかなという感じです。

以上、スクリプト書いてたらやる気がなえてしまったという話でした。