Microsoft Translator APIを使ってみる

  • 175
    いいね
  • 5
    コメント

かなり前に書いた記事ですが、動かなくなってるらしいです。@n0bisukeさんの記事の方がわかりやすいのでそちらを見てもらったほうがいいと思いますが、ここのコードも動くように直しておきました。
ではまたね。


翻訳botとかで使えたりするんじゃないかなと思って翻訳APIを調べてみました。Googleの翻訳APIは有料らしいのですが、マイクロソフトのほうは月200万文字まで無料で使わせてくれるみたいです。

ということで書いてみた。

1 準備

とりあえず http://www.microsoft.com/translator/ を開く。

Get started を押すと、"To start using the Translator API, follow these steps"と書いてあるので、これにしたがって進める(下記)といい感じ。

1-1 Sign up for Microsoft Translator

https://datamarket.azure.com/home/ を開いて、Windows Azure Marketplaceにサインインします。(初めての人は、レジストレーションする)

Microsoft Translatorのページ https://datamarket.azure.com/dataset/bing/microsofttranslator を開き、200万文字/月の無料コースをサブスクライブします。

1-2 Register your application and create your credentials

Translator APIを使うためには、さらにアプリケーションの登録が必要です。

https://datamarket.azure.com/developer/applications を開き、登録ボタンを押します。

なんか登録画面が出てきますので次の項目を入力します。

  • クライアントID - アプリケーションの識別子です。他とぶつからない好きな文字列をどうぞ。
  • 名前 - アプリケーションの名前です。わかりやすい名前をどうぞ。
  • 顧客の秘密 - デフォルトで表示されているものでよいと思います。
  • リダイレクトURI - Microsoft Translatorでは、無効なURLを入力します。(例: https://localhost/)
  • サブドメインアクセスを有効にする - オフのままほっときましょう。
  • 説明 - 別に書かなくてもいいと思います。

ここで設定したクライアントID(client id)と顧客の秘密(client secret)は、APIを実際に使うときに必要になります。

これで準備は完了です。

2 使ってみよう

translate.js

'use strict';

var http = require('http');
var https = require('https');
var qs = require('querystring');

getAccessToken(function (token) {
    translate(token, '翻訳したい文章', function (translated) {
        console.log(translated);
    });
});

function getAccessToken(callback) {
    var body = '';
    var req = https.request({
        host: 'datamarket.accesscontrol.windows.net',
        path: '/v2/OAuth2-13',
        method: 'POST'
    }, function (res) {
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            body += chunk;
        }).on('end', function () {
            var resData = JSON.parse(body);
            callback(resData.access_token);
        });
    }).on('error', function (err) {
        console.log(err);
    });
    var data = {
        'client_id': 'クライアントIDに設定した文字列',
        'client_secret': '顧客の秘密に設定した文字列',
        'scope': 'http://api.microsofttranslator.com',
        'grant_type': 'client_credentials'
    };

    req.write(qs.stringify(data));
    req.end();
}

function translate(token, text, callback) {
    var options = '&to=en' +
            '&text=' + qs.escape(text) +
            '&oncomplete=translated';
    var body = '';
    var req = http.request({
        host: 'api.microsofttranslator.com',
        path: '/V2/Ajax.svc/Translate?' + options,
        method: 'GET',
        headers: {
            Authorization: 'Bearer ' + token,
        }
    }, function (res) {
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            body += chunk;
        }).on('end', function () {
            eval(body);
        });
    }).on('error', function (err) {
        console.log(err);
    });

    req.end();

    function translated(text) {
        callback(text);
    }
}

ポイントは、getAccessToken() でclient idとclient secretから(600秒有効な)アクセストークンを取得し、そのトークンを使って実際の翻訳APIを呼び出すってとこかなあ。