Microsoft Translator APIを使ってみた

自宅付近にポータルが未だに生えないので初投稿です。
#再翻訳bot作りてえ
というわけで、200万文字まで無料で使えるMicrosoft Translator APIを使ってみました。
##じゅんび
kemayakosさんの記事[Microsoft Translator APIを使ってみる](http://qiita.com/kemayako/items/21fe36005e6e729aff77)を頼りに登録する（他力本願
登録できたら、**クライアント ID**と**顧客の秘密**を確保しておきます。

#さっそく翻訳する

```php:Translator.php
<?php

/* access_token さえ取れればいい */
function getAccessToken($client_id, $client_secret, $grant_type = "client_credentials", $scope = "http://api.microsofttranslator.com"){
	$ch = curl_init();
	curl_setopt_array($ch, array(
		CURLOPT_URL => "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/",
		CURLOPT_SSL_VERIFYPEER => false,
		CURLOPT_RETURNTRANSFER => true,
		CURLOPT_POST => true,
		CURLOPT_POSTFIELDS => http_build_query(array(
			"grant_type" => $grant_type,
			"scope" => $scope,
			"client_id" => $client_id,
			"client_secret" => $client_secret
			))
		));
	return json_decode(curl_exec($ch));
}

/* 肝心の翻訳君 */
function Translator($access_token, $params){
	$ch = curl_init();
	curl_setopt_array($ch, array(
		CURLOPT_URL => "https://api.microsofttranslator.com/v2/Http.svc/Translate?".http_build_query($params),
		CURLOPT_SSL_VERIFYPEER => false,
		CURLOPT_RETURNTRANSFER => true,
		CURLOPT_HEADER => true,
		CURLOPT_HTTPHEADER => array(
			"Authorization: Bearer ". $access_token),
		));
	preg_match('/>(.+?)<\/string>/',curl_exec($ch), $m);
	return $m[1];
}
```

##access_tokenを取得する
[https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/](https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/)に
**grant_type**、**scope**と一緒にクライアント IDと顧客の秘密を投げます。
grant_typeは**client_credentials**、scopeは**http://api.microsofttranslator.com**固定でいいみたい（？）
そうしたら、json形式で返ってくるので、access_tokenを取り出します。


```php
$access_token = getAccessToken("クライアント ID","顧客の秘密")->access_token;

```
expires_inが発行されたトークンの有効時間（秒）っぽい？

##翻訳
ヘッダを
`Authorization: Bearer アクセストークン`
として、
[https://api.microsofttranslator.com/v2/Http.svc/Translate](https://api.microsofttranslator.com/v2/Http.svc/Translate)に
**text**と**to**、任意で**from**を投げます。

access_tokenを取得するときはjsonで返すくせに、こっちだとxmlで返してくるあたり困惑した。
xmlの扱いに慣れてないので正規表現君に任せた。

```php
$text = Translator($access_token, array('text' => 'hello','to' => 'ja', 'from' => 'en'));
echo $text;

```
「こんにちは」と返ってくる。はず。。。。


#botにする
```php:main..php
<?php

require 'Translator.php';
require 'TwistOAuth.phar'; //毎度お世話になっておりますTwistOAuth先輩

/* 再翻訳関数君 */
function Retranslation($access_token, $text){
	return Translator($access_token, array(
		'text' => Translator($access_token, array(
			'text' => $text,
			'to' => 'en',
			'from' => 'ja')),
		'to' => 'ja',
		'from' => 'en'));
}
/* keys */
$client_id = "クライアント ID";
$client_secret = "顧客の秘密";
$access_token = getAccessToken($client_id, $client_secret)->access_token;

$to = new TwistOAuth(CK,CS,OT,OS);


try{

	/* get sample tweet */
	$res = $to->get('search/tweets', array('q' => 'lang:ja exclude:retweets', 'count' => 10));
	
	$a = 0;
	do{
		$text = $res->statuses[$a]->text;
		$id = $res->statuses[$a]->id_str;
		$a++;
	}while(preg_match('/(@|＠)\w{1,15}/', $text)); // リプライ除外
	
	/* 再翻訳ツイート */
	curl_exec($to->curlPost('statuses/update', array('status' => Retranslation($access_token, $text))));

}catch(TwistException $e){
	echo $e->getmessage();
}
```


#まとめ
クソクソ言いながら書いたコードで多分ガバガバなので良かったら修正案くださいオナシャス
jsonとxmlの両方で返してきたり、[https://msdn.microsoft.com/en-us/library/hh454950.aspx](https://msdn.microsoft.com/en-us/library/hh454950.aspx)にあるコードがなんか動かなかったり、検索かけても古い記事ばっかりでアテにならなかったり辛かった。

作ったbotは[SetCronJob](https://www.setcronjob.com/)で30分に一度動かしてます。
[@016538](https://twitter.com/016538)良かったら見てね！

再翻訳bot自体はもともと誰かが作ってあったはずだけど二番煎じとかいのはNG

凍結しました―完―