Twitter のタイムラインで必要な情報を取得

AWK Users JP :: みんなの願い事がわかる awk スクリプトあたりで基本的なことは取得できているのですが、Twitter の発言を後で再利用しやすいように少し手直ししておきます。 具体的に欲しい情報は以下の 3 項目とします。

  • 発言のリンク先
  • 日付と日時 (もちろん日本時間で)
  • 発言内容

特に日付と時間は普通に取得するとグリニッジ標準時間になるため、注意が必要になります。

#! /usr/local/bin/xgawk -f
# user_timeline.awk
# ユーザーのタイムラインを表示する
# usage: xgawk -f user_timeline.awk

@load xml

BEGIN {
    # Twitter の ID
    twitter_id = "hi_saito";

    # 自分のタイムラインの RSS
    timeline_url = "http://search.twitter.com/search.atom?q=" twitter_id;

    tmp_file = ENVIRON["TMP"] "/user_timeline." PROCINFO["pid"];

    # nkf の場所
    nkf_cmd         = "/usr/bin/nkf";
    nkf_opt         = "--numchar-input -w";
    nkf_exec        = nkf_cmd " " nkf_opt " " tmp_file;

    # rm の場所
    rm_cmd          = "/bin/rm";
    rm_exec         = rm_cmd " " tmp_file;

    XMLMODE = 0;
    base_url = gensub(/.*\/\/([^/]+)\/.*/, "\\1", 1, timeline_url);
    http_service = "/inet/tcp/0/" base_url "/80";
    http_request = "GET " timeline_url " HTTP/1.0";

    ORS = "\r\n";
    print http_request                      |& http_service;
    print ""                                |& http_service;
    while ((http_service |& getline) > 0) {
        if ($0 ~ /<\?xml/) {
            is_xml = 1;
        }
        if (is_xml) {
            print $0 > tmp_file;
        }
    }
    close(http_service);
    close(tmp_file);

    # ここから XMLMODE
    XMLMODE = 1;
    ORS = "\n";

    while ((nkf_exec | getline) > 0) {
        if (XMLCHARDATA) {
            data = $0;
        }
        if (XMLENDELEM == "updated") {
            split(data, arr_data, /[-:TZ]/);
            unix_time = mktime(arr_data[1] " " arr_data[2] " " arr_data[3] \
                            " " arr_data[4] " " arr_data[5] " " arr_data[6]) \
                            + 9 * 3600;
            time = strftime("%Y/%m/%d %H:%M:%S", unix_time)
            print "Date: " time;
        }
        if (XMLSTARTELEM == "link") {
            if (XMLATTR["href"] ~ /http:\/\/twitter.com\//) {
                print "Link: " XMLATTR["href"];
            }
        }
        if (XMLENDELEM == "title") {
            if (data != twitter_id " - Twitter Search") {
                print "Twit: " data;
            }
        }
    }
    close(nkf_exec);

    system(rm_exec);
}

XML を扱うため、xgawk のみの対応ですが、実行結果は以下のようになります。

$ xgawk -f user_timeline.awk
Date: 2009/08/16 22:22:32
Link: http://twitter.com/hi_saito/statuses/3343994134
Twit: Kernel 2.6.30 になって欲しかった。orz (アップデート中
<snip>

元々のインスパイヤされた元ははてなダイアリーに一日単位で自分のツイッターのつぶやきをアップする方法なのですが、現在あまりはてなダイアリーを使っていないこともあり、データの列挙までにとどめておきました。

tag_xgawk.png