実用! awk でコマンドラインで Twitter 受信

実用! awk でコマンドラインから Twitter 投稿を書いたついでに昔書いた twitter の受信部分を書いておきます。 基本は送信も受信も同じ基本認証で行います。

#! /usr/bin/gawk -f
# twitter_rec.awk
# twitter の自分の友達の発言を垂れ流しします
# usage: gawk -f twitter_rec.awk

BEGIN {

    # 設定など
    # twitter の atom の URL
    atom_url = "http://twitter.com/statuses/friends_timeline.atom";
    twitter_id = "*****";
    twitter_pass = "*****";

    http_url = "/inet/tcp/0/twitter.com/80";
    tmp_file = "/tmp/awk" PROCINFO["pid"];
    nkf_command = "nkf --numchar-input --overwrite -w ";
    sleep_command = "sleep ";
    interval = 180;
    base64_command = "echo -n " twitter_id ":" twitter_pass "| base64";
    base64_command | getline mail_pass;

    # ここからがメイン
    for(;;) {
        # Basic 認証部分
        ORS = "\r\n";
        print "GET " atom_url " HTTP/1.0"       |& http_url;
        print "Authorization: Basic " mail_pass |& http_url;
        print ""                                |& http_url;

        # 一旦ファイルに書き出し
        while ((http_url |& getline) > 0) {
            print $0 > tmp_file;
        }
        close(http_url);
        close(tmp_file);

        # awk には Encode がないので nkf で変換
        system(nkf_command tmp_file);

        # 再読み込み
        ORS = RS = "\n";
        while (getline < tmp_file > 0) {
            # xgawk の機能は使わず処理
            if ($0 ~ /^ +<content type="html">/) {
                sub(/ +<content type="html">/, "", $0);
                sub(/<\/content>/, "", $0);
            content = $0;
            }
            if ($0 ~ /<published>/) {
                sub(/ +<published>/, "", $0);
                sub(/<\/published>/, "", $0);
                year  = substr($0, 1, 4);
                month = substr($0, 6, 2);
                day   = substr($0, 9, 2);
                hour  = substr($0, 12, 2);
                min   = substr($0, 15, 2);
                sec   = substr($0, 18, 2);
                stime = mktime(year " " month " " day " " hour " " min " " sec);
                comment[++i] = stime "\t" content;
            }
        }
        close(tmp_file);
        system("rm -f " tmp_file);

        # 発言の表示
        for (;i > 0;i--) {
            split(comment[i], sub_content, "\t");
            if (sub_content[1] > now) {
                print sub_content[2];
                now = sub_content[1];
            }
        }

        # xgawk の sleep() は使わず
        system(sleep_command interval);
    }
}

使い方も簡単で、以下のようにして起動しておけば変数 interval に毎に Twitter に問い合わせてくれます。

$ gawk -f twitter_rec.awk

どう使うかですが、GNU Screen などでコンソールの分割をして半分は送信、半分は受信というのも面白そうですし、受信したものを GNU Screen のステータスラインに表示するのも面白そうです。