Google サジェストを使ってみる

Big Sky :: Googleサジェストから補完候補を作るVimスクリプト書いた。 にインスパイアされて、awk から Google サジェストを利用してみます。

Socket 通信には gawk の TCP 通信を使い、XML のパースには xgawk の XML パース機能を用いています。

Google サジェストの API からは何故か EUC-JP の文字コードで戻ってくるので、nkf で変換したものを利用していますが、xgawk の XML パース機能の中には文字コード変換機能もあります。

#! /usr/local/bin/xgawk -f
# google_suggest.awk
# Google サジェストを使ってみる
# usage: xgawk -f google_suggest.awk word

@load xml

BEGIN {
    word = ARGV[1];

    base_url    = "www.google.co.jp";
    port        = 80;
    query       = "/complete/search?output=toolbar&hl=ja&q=" word;

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

    nkf_cmd     = "/usr/bin/nkf";
    nkf_opt     = "-w";
    nkf_exe     = nkf_cmd " " nkf_opt;

    rm_cmd      = "/bin/rm";
    rm_exe      = rm_cmd " " tmp_file;

    XMLMODE = 0;
    http_service = "/inet/tcp/0/" base_url "/80";
    http_request = "GET " query " 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 == 1) {
            # 戻ってくる XML の文字コードは EUC なので変換しておく
            "echo '" $0 "' | " nkf_exe | getline utf_str;
            close("echo '" $0 "' | " nkf_exe);

            print utf_str > tmp_file;
        }
    }
    close(http_service);
    close(tmp_file);

    XMLMODE     = 1;
    ORS         = "\n";
    while (getline < tmp_file > 0) {
        if (XMLCHARDATA) {
            data = $0;
        }

        if (XMLSTARTELEM == "suggestion") {

            print XMLATTR["data"];

        }
    }
    close(tmp_file);

    ret_val = system(rm_exe);

    if (ret_val != 0) {
        exit 1;
    }
}

実行してみます。

$ xgawk -f google_suggest.awk awk
awk コマンド
awk 正規表現
awk print
awkitchen
awk if
awk 置換
awk printf
awk substr
awk 変数
awキッチン

確かにこれは活用できると面白そうです。

tag_xgawk.png