LoginSignup
27
25

More than 5 years have passed since last update.

Microsoft Translator APIを使ってみた

Last updated at Posted at 2015-09-09

自宅付近にポータルが未だに生えないので初投稿です。

再翻訳bot作りてえ

というわけで、200万文字まで無料で使えるMicrosoft Translator APIを使ってみました。

じゅんび

kemayakosさんの記事Microsoft Translator APIを使ってみるを頼りに登録する(他力本願
登録できたら、クライアント ID顧客の秘密を確保しておきます。

さっそく翻訳する

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/
grant_typescopeと一緒にクライアント 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
textto、任意でfromを投げます。

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

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

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

botにする

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にあるコードがなんか動かなかったり、検索かけても古い記事ばっかりでアテにならなかったり辛かった。

作ったbotはSetCronJobで30分に一度動かしてます。
@016538良かったら見てね!
再翻訳bot自体はもともと誰かが作ってあったはずだけど二番煎じとかいのはNG
凍結しました―完―

27
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
25