Microsoft Translator APIをGroovyを使って試してみる

他言語を取り扱うサイトを構築する時に、英語とか中国語とか仮登録するのに簡単な翻訳APIがないなと探していたところ、Microsoft Translator APIなるものがあったので試してみました。

月200万文字までは無料でつかえるようなので、個人利用の範囲では問題なく使えるでしょう。


すでに使い方を記事にされている方が多くいたので、以下のサイトを参考にGroovyで書いてみました。

- [Microsoft Translator APIを使ってみる](http://qiita.com/kemayako/items/21fe36005e6e729aff77)
- [Microsoft Translator API プログラミング解説](http://so-zou.jp/web-app/tech/web-api/bing/translator/)

## APIを使うために
Microsoft Azure Marketplaceへの登録と、Microsoft Translator API の利用登録が必要です。
どちらも上記のサイトに詳しく載っているので、そちらを参照、、、

## Groovyのインストール
[Groovy](http://groovy-lang.org/download.html)のサイトからインストールを行えます。
今回はmac環境だったため、brewを使ってインストールしました。

```lang:
brew install groovy
```

## HttpBuilderを使ったHTTPアクセス
Microsoft Translator APIではPOSTで制限時間付きアクセストークンを取得し、GETで翻訳を実行するので、groovyで簡単にHTTPアクセスする方法を探していたところ、HttpBuilderなるものがあったので、こちらを使ってみます。

## 使い方
githubに使い方が載ってますね。
[GETの方法](https://github.com/jgritman/httpbuilder/wiki/GET-Examples)
[POSTの方法](https://github.com/jgritman/httpbuilder/wiki/POST-Examples)

依存関係の解決は＠Grabに記述します。

```
@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.6')
```

## 実際に書いてみる

以下みたいな実行方法を想定してます。

```lang:実行方法
groovy MsTranslator.groovy これを翻訳してください
```

実行すると標準出力に翻訳前の文章と翻訳語の文章が出力されます。

```lang:実行結果
********** 翻訳前の文章 **********
これを翻訳してください
********** 翻訳後の文章 **********
"Please translate this"
```

以下、コードです。

```groovy:MsTranslator.groovy
@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.6')
import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.*

//引数に翻訳対象文字列を指定
def target
if(args.size()>=1){
  target = args[0]
}else{
  //引数に文字列が指定されていない場合
  target = 'これはサンプルの文字列です。任意の文字列を翻訳したい場合は、プログラムの引数に文字列を指定してください。'
}

//10分間有効なトークンを取得して翻訳
def token = getAccessTokenWithTimeLimited()
def translated = translateJpToEn(token,target)

println '********** 翻訳前の文章 **********'
println target
println '********** 翻訳後の文章 **********'
println translated

/** 10分間の制限時間付きアクセストークンを取得する */
def getAccessTokenWithTimeLimited(){
    def http = new HTTPBuilder( 'https://datamarket.accesscontrol.windows.net' )
    http.post( path: '/v2/OAuth2-13',
             body: [client_id: '{登録したクライアントID}',
                    client_secret: '{登録した顧客の秘密}',
                    scope: 'http://api.microsofttranslator.com',
                    grant_type: 'client_credentials'],
             requestContentType: URLENC ) { resp,reader  ->

        if (resp.status == 200) {
            return reader.access_token
        }
        else if (resp.status == 404) {
            println "Access denied"
        }
        else {
            println "Unexpected failure: ${resp.statusLine}"
        }
    }
}
/** 日本語から英語に翻訳する */
def translateJpToEn(token,target){
    def http = new HTTPBuilder( 'http://api.microsofttranslator.com' )
    http.get(path : '/V2/Ajax.svc/Translate',
       query : [appId: 'Bearer ' + token, //MS指定形式
                text: target,
                from: 'ja',
                to: 'en'],
       contentType : TEXT) { resp, reader ->

        if (resp.status == 200) {
            return reader.text;
        }
        else if (resp.status == 404) {
            println "Access denied"
        }
        else {
            println "Unexpected failure: ${resp.statusLine}"
        }
    }
}
```

HttpBuilder使いやすいですね。
一番上のサイトを参考にNode.jsのhttpとhttpsを使って書いてみましたが、groovyの方が短く簡単に書ける印象を受けました。

## 補足：リクエストの種別
APIのリクエストには*AJAX*、*SOAP*、*HTTP*の３種類あり、それぞれレスポンスの形式が違います。
今回はAJAXなので、翻訳結果がダブルクォートで囲まれた形式で返されてきてますね。