短縮 URL の展開

bit.lyの展開 - みずぴー日記bit.ly, a simple url shortenerTinyURL.com - shorten that long URL into a tiny URL, is.gd URL Shortener - The Shortest URLs Around などで行っている短縮 URL の展開方法が記載されています。

gawk の TCP 通信を使うのであれば、以下のようにして記述することが可能です。

#! /usr/bin/gawk -f
# expand_url.awk

BEGIN {
    RS = ORS = "\r\n";
    base_url = gensub(/http:\/\/(.*)\/.*/, "\\1", 1, ARGV[1]);
    url      = gensub(/http:\/\/.*\//, "", 1, ARGV[1]);
    http_url = "/inet/tcp/0/" base_url "/80";
    http_req = "HEAD /" url;

    print http_req " HTTP/1.0" |& http_url;
    print "User-Agen: expand_url.awk" |& http_url;
    print "Accept: */*" |& http_url;
    print "Host: " base_url |& http_url;
    print "Connection: keep-alive" |& http_url;
    print "" |& http_url;
    while ((http_url |& getline) > 0) {
        if ($1 ~ /Location/) {
            expand_url = $2;
        }
    }
    close(http_url);

    print expand_url;
}

実際に動かしてみましょう。

$ gawk -f expand_url.awk http://bit.ly/4q0GhX
http://gauc.no-ip.org/awk-users-jp/

$ gawk -f expand_url.awk http://tinyurl.com/5w5hys
http://gauc.no-ip.org/awk-users-jp/

$ gawk -f expand_url.awk http://is.gd/lAgR
http://gauc.no-ip.org/awk-users-jp/

上記の短縮 URL はともに AWK Users JP :: 日本の AWK ユーザのためのハブサイトへのリンクになっています。

次に wget コマンドを使って取得してみます。 こちらの方が手続きが少ない分、簡単です。

#! /usr/bin/gawk -f
# expand_url_2.awk

BEGIN {
    wget_cmd = "/usr/bin/wget";
    wget_opt = "--spider -o /dev/stdout";
    url = ARGV[1];

    wget_exec = wget_cmd " " wget_opt " " url;
    while (wget_exec | getline > 0) {
        if ($1 ~ /^Location/) {
            expand_url = $2;
        }
    }
    close(wget_exec);

    print expand_url;
}

gawk 系以外の awk を使ったりする場合には、こちらの方が楽かもしれません。

$ nawk -f expand_url_2.awk http://bit.ly/4q0GhX
http://gauc.no-ip.org/awk-users-jp/

$ nawk -f expand_url_2.awk http://tinyurl.com/5w5hys
http://gauc.no-ip.org/awk-users-jp/

$ nawk -f expand_url_2.awk http://is.gd/lAgR
http://gauc.no-ip.org/awk-users-jp/

短縮 URL にはお世話になっているのですが、圧縮は既にLL Golf Hole 1 - tinyurl.comを使ってURLを短縮する DouKaku? の問題で AWK Users JP :: LL Golf #1 - tinyurl.comを使ったURLの短縮 として書いていますが、展開の方は未着手でしたので、参考にしてください。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png