Developer’s blog | Microsoftの翻訳APIを久しぶりに使ってみた(アクセストークン取得API実装編)の続きです。
ちょっと時間が空いてしまいましたが、いよいよ翻訳処理の実装をしていきたいと思います。
アクセストークン取得の実装(Javascript)
前回は、アクセストークンを取得するphpの処理を実装し、それをauth.phpという名前で保存しました。
まずは、これをJavascriptから呼び出してアクセストークンを取得する部分を実装します。
function authorize(src, dst, text) { var xhr = new XMLHttpRequest(); xhr.open("POST", "auth.php", true); xhr.responseType = 'json'; xhr.onload = function () { if (xhr.readyState == 4) { if (xhr.status === 200) { console.log(xhr.response.access_token); } } }; xhr.onerror = function () { console.log("認証に失敗しました。"); }; xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(); }
xhr.response.access_token
の形式でアクセストークンの参照ができます。
翻訳API呼び出しの実装(PHP)
翻訳APIを呼び出す部分ですが、こちらもJavascriptからクロスドメインのアクセスが許可されていないようなので、phpで実装しサーバーサイドから呼び出すようにしました。
アクセストークンをHTTPヘッダーにセットしてAPIを呼び出します。
‘Authorization: Bearer ‘ . $token
それと同時にAccess-Control-Allow-Originのヘッダーにoriginの値をセットします。ここでhttp://api.microsofttranslator.comとしています。トークンと合わせてセットすると以下のようになります。
$header = array( 'Authorization: Bearer ' . $token, 'Content-Type: application/x-www-form-urlencoded', 'Access-Control-Allow-Origin: http://api.microsofttranslator.com' );
次に、これをストリームコンテキストリソースにまとめて、
$context = stream_context_create(array( "http" => array( "method" => "GET", "header" => implode("\r\n", $header), ) ));
file_get_contentsメソッドに渡してAPIを呼び出します。
$response = file_get_contents( 'https://api.microsofttranslator.com/v2/Http.svc/Translate?' . http_build_query($data, "", "&"), false, $context );
まとめるとこうです。
<?php $token = $_GET['token']; $text = $_GET['text']; $src = $_GET['src']; $dst = $_GET['dst']; $data = array( 'text' => $text, 'from' => $src, 'to' => $dst ); $header = array( 'Authorization: Bearer ' . $token, 'Content-Type: application/x-www-form-urlencoded', 'Access-Control-Allow-Origin: http://api.microsofttranslator.com' ); $context = stream_context_create(array( "http" => array( "method" => "GET", "header" => implode("\r\n", $header), ) )); $response = file_get_contents( 'https://api.microsofttranslator.com/v2/Http.svc/Translate?' . http_build_query($data, "", "&"), false, $context ); echo $response;
これをtranslate.phpとして保存しました。
翻訳API呼び出しの実装(Javascript)
続いて、translate.phpをJavascriptから呼び出す部分を実装します。
function translate(src, dst, text, token) { var params = ['token=' + encodeURIComponent(token), '&text=' + encodeURIComponent(text), '&src=' + src, '&dst=' + dst ].join(""); var xhr = new XMLHttpRequest(); xhr.open('GET', 'translate.php?' + params, true); xhr.onload = function () { if (xhr.readyState == 4) { if (xhr.status === 200) { var xml = $.parseXML(xhr.response); $("#dstText").val($(xml).text()); } else { showErrorMessage("翻訳に失敗しました。"); } } }; xhr.onerror = function () { showErrorMessage("翻訳に失敗しました。"); }; xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(); }
翻訳結果はXML形式で返ってくるので、
var xml = $.parseXML(xhr.response);
パースして翻訳結果を出力するようにします。
一番最初に記載した、アクセストークンを取得する処理、authorizeでトークンをconsoleにログ出力していた部分を
xhr.onload = function () { if (xhr.readyState == 4) { if (xhr.status === 200) { console.log(xhr.response.access_token); } } };
translate関数を呼び出すように修正しています。
xhr.onload = function () { if (xhr.readyState == 4) { if (xhr.status === 200) { translate(src, dst, text, xhr.response.access_token); } } };
これで翻訳結果が、下のtextareaに表示されるようになりました!
サンプルをこちらにアップしておきましたので、参考までにどうぞ。
サンプル
ソース一式はこちら。
mojyamojya/bing