LaCoocanでSmart.fmのAPIを使って英単語翻訳

Smart.fmがまだiKnowだった頃に友だちに頼まれて作ったアプリがあり、
それをniftyのLaCoocanで動かしてたので手直ししながらそのまとめ。

流れ

LaCoocanの機能の一つに「メール転送」というのがあって、
取得してあるドメイン(例えばmonm.on.coocan.jp)のメールアドレス(*@monm.on.coocan.jp)に来たメールを、自分の好きなスクリプトに食わせることができるって機能です。

ということで、

  1. 指定したメールアドレスにメールを投げる
  2. メール転送機能を使ってスクリプトに食わせる
  3. スクリプトは与えられたメールから英単語を抜き出しSmart.fmに投げる
  4. Smart.fmで単語の翻訳と、関係する例文を取得する
  5. メールの送信元、もしくは指定されたメールアドレスへ結果を返す

みたいなのを作ってました。
(はじめはgoogle talkのボットにしてたんですけど、プロセス切られちゃうのでメールで。)

できあがり

とりあえず「Smart.fmで単語の翻訳と、関係する例文を取得する」って部分だけ。
monmon/myapp-iknow · GitHub
eg/tr.plにある通り、

MyApp::iKnow->tr('world');

をやると単語と例文の翻訳がTAB区切りで出力されます。


XML::RSS::LibXMLとXML::LibXMLを最初使ってたんですけど、
ライブラリ持ってくのが面倒なのでXML::RSSXML::TreePPにしました。

やってること

MyApp::iKnow->tr()は単語を翻訳するMyApp::iKnow::Itemsと、
例文を翻訳するMyApp::iKnow::Sentencesのsearch()を呼び出してるだけ。


例えばMyApp::iKnow::Sentences->search()は以下のようになってて、

sub search {
    my($class, $word) = @_;
    my $tr_lang = ($word =~ m/[a-zA-Z]+/xms) ? 'ja' : 'en';
    my $base = "http://api.iknow.co.jp";
    my $sentences_uri = URI->new_abs("/sentences/matching/$word.rss", $base);
    $sentences_uri->query_form(
        translation_language => $tr_lang,
        require_translation  => 'true',
    );

    my $file_path = MyApp::iKnow::Cache->get_file_path($sentences_uri);

    my $rss = XML::RSS->new;
    $rss->parsefile($file_path);
    my @res = map {
        +{ 
            en   => __trim($_->{title}),
            ja   => __trim($_->{description}), 
        }
    } @{$rss->{items}}; 

    \@res;
}

http://api.iknow.co.jp/sentences/matching/<検索ワード>.rss」っていうRSSを取得し、
titleとdescription抜き出してるだけです。
何度も同じ単語のRSS取得にいかないようにcacheしたりしてますけど、そんな大したことせず。



という感じで、例えば「perl」で検索すると以下のような感じになります。

% perl -Ilib eg/tr.pl perl
perldoc -f join	関数joinを調べる
perldoc	perldocの使い方の表示
perldoc -f rand	perl組み込み関数を調べる(例:乱数生成rand関数の説明)
perlocution	発語媒介行為
perl -wc hello.pl	文法チェックを行う
perldoc -f localtime	localtime()関数について調べる
perldoc perl	perlの概要表示
perldoc perlfunc	組み込み関数一覧を表示 at eg/tr.pl line 7.

ホントは発音してくれるmp3へのリンクも取得して表示してたんですけど、
なぜかそれが取得できなくなってたので英語と日本語だけに直しました。
(そのためにわざわざxmlRSSの取得を分けたんですけど意味なくなっちゃった)



と、今さらこんなの手直ししても「APIが8/31に公開停止になりますよー」ってメールがこの前来てたんで、
いつ使えなくなっちゃうかわからないんですよね。