実用! 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 のステータスラインに表示するのも面白そうです。
