自宅付近にポータルが未だに生えないので初投稿です。
#再翻訳bot作りてえ
というわけで、200万文字まで無料で使えるMicrosoft Translator APIを使ってみました。
##じゅんび
kemayakosさんの記事Microsoft Translator APIを使ってみるを頼りに登録する(他力本願
登録できたら、クライアント IDと顧客の秘密を確保しておきます。
#さっそく翻訳する
<?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/に
grant_type、scopeと一緒にクライアント IDと顧客の秘密を投げます。
grant_typeはclient_credentials、scopeは**http://api.microsofttranslator.com**固定でいいみたい(?)
そうしたら、json形式で返ってくるので、access_tokenを取り出します。
$access_token = getAccessToken("クライアント ID","顧客の秘密")->access_token;
expires_inが発行されたトークンの有効時間(秒)っぽい?
##翻訳
ヘッダを
Authorization: Bearer アクセストークン
として、
https://api.microsofttranslator.com/v2/Http.svc/Translateに
textとto、任意でfromを投げます。
access_tokenを取得するときはjsonで返すくせに、こっちだとxmlで返してくるあたり困惑した。
xmlの扱いに慣れてないので正規表現君に任せた。
$text = Translator($access_token, array('text' => 'hello','to' => 'ja', 'from' => 'en'));
echo $text;
「こんにちは」と返ってくる。はず。。。。
#botにする
<?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にあるコードがなんか動かなかったり、検索かけても古い記事ばっかりでアテにならなかったり辛かった。
作ったbotはSetCronJobで30分に一度動かしてます。
@016538良かったら見てね!
再翻訳bot自体はもともと誰かが作ってあったはずだけど二番煎じとかいのはNG
凍結しました―完―