HubotでMicrosoft Translator APIを使う(2017/02)

#やりたいこと

諸事情でslackでhubotを動かしたらここで打つ文章が翻訳されて返ってきたら面白いよねと思ったので試して見た。
結果としてやることはすごい簡単なのだけど、タイミング悪くWindows Azure Marketplaceに登録するやり方からAzure Potalへの統合を行なっている真っ最中のようでAPIの仕様などが変更されている模様。
今までのサンプルコードほとんど使えないし公式のサンプルコードにもちゃんと書いてないし公式の確認サービスでは変に動かないしそこに至るまでの諸々がすごい大変だった。


#注意
いろんなところで書かれている[Windows Azure Marketplaceにサインイン](https://datamarket.azure.com/home/)ですが、2017/2/9現在サイトに行ってもらうと書いてありますが、もうすでに新規での登録などはできないようです。また、2017/3/31に現在のサブスクリプション自体がクローズされるようです。
お気をつけを。
というわけで以下はその代替方法。

#前提

[slackでちょっとしたbotを動かしたい](http://qiita.com/t-katsura/items/62715ea7876f5b9dad54)
これくらいできる




#やったこと

1. [Microsoft azure](https://azure.microsoft.com/ja-jp/) への登録
2. Microsoft Translator API を使えるようにする
3. hubotで翻訳APIを使えるようにする

#なぜMicrosoft Translator APIなのか

Googleは金かかるって書いてあったから。

#[Microsoft azure](https://azure.microsoft.com/ja-jp/) への登録

これは普通に無料で登録すればいんじゃないでしょうか。
会社連絡先とかあるけど個人用にしてます。

#Microsoft Translator API を使えるようにする



##本題

Microsoft azureにログインして上の検索窓から[Cognitive Services accounts]を検索してクリック
![スクリーンショット 2017-02-09 13.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/97116/9af19d7a-7965-0ddc-9679-e6033b2eca30.png)

私の場合は下記みたいになってたので、[+　Add]ボタンを押して登録作業に。
![スクリーンショット 2017-02-09 13.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/97116/43d1a380-b5bd-6f3c-1e45-ed497185ec2b.png)

すると作成画面になるので、必要情報を登録する。
今回は[Translator Text API]を使うのでこれを利用する。
API type部分をクリックすると出てくる。(下記はAPI選択窓が出てきてる状態)
![スクリーンショット 2017-02-09 13.54.02.png](https://qiita-image-store.s3.amazonaws.com/0/97116/f5320b6c-dd58-4d84-7100-9f067cf661e2.png)

名前とか料金設定とはそれぞれは適切に自分で考えて入れてください。

するとダッシュボードになんか増えます。
![スクリーンショット 2017-02-09 13.58.22.png](https://qiita-image-store.s3.amazonaws.com/0/97116/1b5acc72-579e-ee40-9c48-8b275dafac69.png)

これをクリックするとこのAPIを利用するために必要なKEYや[Subscription ID]が手に入ります。

後はまぁ簡単に作れます。

#hubotで翻訳APIを使えるようにする

ここら辺からは英語ドキュメントを探して頑張って読みました。
Azure Potalも最近この形式にしたのかな？って感じで誰もこの日本語のAzure Portalを元にやり方とかを書いてないのでめんどくさくてポータル自体を英語したし。(なのですいませんがAzure Portalは英語表記になってます)


[APIなどの説明やドキュメント](https://www.microsoft.com/cognitive-services/)ここで色々と動きを確認しました。
2017/02/09現在ではまだgithubに挙げられてるサンプルコードは古いままっぽいです。
2016/12/31以前であればこちらを参照しても動くと思いますが、新規のものだとclientidなどの必要なものが取得できないので無理っぽい(やり方あれば教えてください)

以下2項目は全ての言語に共通する内容なのでここは押さえておくといい。

##一時的なトークンの発行

[Authentication Token API](http://docs.microsofttranslator.com/oauth-token.html)を参照。

ここで下記のグリーン部分のValueにKeyを入れる。
ちなみにここでDescription部分にSubscription keyとかかれてはいるものの利用するのはRESOURCE MANAGEMENTのKeysにあるKEY1もしくはKEY2である。
[Try it out!]ボタンを押すことでcurlでの一時トークン取得処理を実行してくれる。
後実行したコマンドも教えてくれるのでこれを元にHTTPリクエストを作ればここと同じ結果が得られるぜヒャッホイということである。
![スクリーンショット 2017-02-09 14.34.28.png](https://qiita-image-store.s3.amazonaws.com/0/97116/f7719ef0-7eaa-6a01-2ac1-0dbbfde8e2bf.png)



##一時トークンを使ってのAPIリクエスト送信

[Text Translation API](http://docs.microsofttranslator.com/text-translate.html#/)を参照。
ここでようやく翻訳APIである。
今回は下記画像で見るように[GET /Translate]を利用している。
やることはほとんどさっきと一緒だがさっきの一時トークンを利用する必要がある。
もし何かに実装するとしたらフローとしては
1. 一時トークンの取得
2. 翻訳APIリクエスト
3. 取得して表示
みたいな感じになるのではないだろうか、よくわかんないけど。

ちなみにここでappidの説明(description)部分にAuthorization headerを指定しないときは必要と書かれているがこのシステム上だけで言えば大嘘である(私の環境ではだめだった)
Authorizationの項目だけ入れてappidを空で[Try it out!]ボタンを押すとなぜかレスポンスCODEで0が返ってくる。
逆にAuthorizationの内容をappidに入れれば普通に翻訳された結果が返ってくるので問題ないだろう(いじめかな？）(問題はある)
さらにさらに言えば実行されたコードというのをローカル環境で実行するとちゃんと翻訳されたXMLが返ってくる。
なんだかよくわからないシステムである。
![スクリーンショット 2017-02-09 14.43.49.png](https://qiita-image-store.s3.amazonaws.com/0/97116/7bf085fe-3962-32cb-d0a7-0b5c407f17c4.png)

##hubot用のスクリプト

HUBOTに関してはXMLの解析方法とかnode関連でちょっと手間取った。
リクエスト自体はそれほどでもないかな。
まずはpackage.jsonに下記二つを追加
```json:package.json
  "dependencies": {
  	....
    "request": "2.79.0",
    "xmldom": "0.1.27 "
    ....
```

ローカルで確認したい場合は、`npm install`して確認してください。
HUBOT用のcoffeescriptはこちらに置いときますね。
https://github.com/takatsura/hubot-ms-translator

HUBOT_TRANSLATOR_KEYに利用するKEYを入れてください

今回のは日本語から英語だけですけど、応用すれば簡単に指定の言語から指定の言語への翻訳というのを実装できると思います。

![スクリーンショット 2017-02-09 16.22.23.png](https://qiita-image-store.s3.amazonaws.com/0/97116/81c9ff59-24e0-3dba-aab3-7fe2ca5fc36b.png)