PHP and Bing Translation API

user1408397 picture user1408397 · May 25, 2012 · Viewed 17.8k times · Source

I've registered with Azure Marketplace, I have a client ID and a client "secret", but everything I've tried so far nonetheless results in a "400 Bad Request" error. Thanks very much!

Here is a rather basic sample of the code I've been trying (I've redacted the Client ID and Secret Value). I'm operating with the understanding that the post variables can be passed through the URL request... I hope that's correct.

$authURL = 'http://datamarket.accesscontrol.windows.net/v2/OAuth2-13&grant_type=client_credentials&client_id={CLIENT_ID VALUE HERE}&client_secret={CLIENT_SECRET VALUE HERE}&scope=http://api.microsofttranslator.com';
$chpre = curl_init();
curl_setopt($chpre, CURLOPT_URL, $authURL );
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$xpre = curl_exec($chpre);

$texttobetranslated = "الذي تقدمه";
$BingURL = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" . $texttobetranslated . "&from=ar&to=en";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $BingURL );
$x = curl_exec($ch);

Answer

torayeff picture torayeff · Jan 20, 2014

I have createde little PHP class that is easy to use and easy to integrate to any PHP project. You can find it here. This is code:

  <?php
    class BingTranslation
    {
        public $clientID;
        public $clientSecret;

        public function __construct($cid, $secret)
        {
            $this->clientID = $cid;
            $this->clientSecret = $secret;
        }

        public function get_access_token()
        {   
            //if access token is not expired and is stored in COOKIE
            if(isset($_COOKIE['bing_access_token']))
                return $_COOKIE['bing_access_token'];

            // Get a 10-minute access token for Microsoft Translator API.
            $url = 'https://datamarket.accesscontrol.windows.net/v2/OAuth2-13';
            $postParams = 'grant_type=client_credentials&client_id='.urlencode($this->clientID).
            '&client_secret='.urlencode($this->clientSecret).'&scope=http://api.microsofttranslator.com';

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url); 
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postParams);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
            $rsp = curl_exec($ch); 
            $rsp = json_decode($rsp);
            $access_token = $rsp->access_token;

            setcookie('bing_access_token', $access_token, $rsp->expires_in);

            return $access_token;
        }

        public function translate($word, $from, $to)
        {
            $access_token = $this->get_access_token();
            $url = 'http://api.microsofttranslator.com/V2/Http.svc/Translate?text='.$word.'&from='.$from.'&to='.$to;

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url); 
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization:bearer '.$access_token));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
            $rsp = curl_exec($ch); 

            preg_match_all('/<string (.*?)>(.*?)<\/string>/s', $rsp, $matches);

            return $matches[2][0];
        }

        public function translate2($word, $from, $tos)
        {
            //translates 1 word to several languages
            //$tos is array of languages to translate to
            //returns array of translations as $result['en']=>'Hello'

            $access_token = $this->get_access_token();

            $result[$from] = $word;

            foreach($tos as $to)
            {
                $url = 'http://api.microsofttranslator.com/V2/Http.svc/Translate?text=hello&from='.$from.'&to='.$to;

                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url); 
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization:bearer '.$access_token));
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
                $rsp = curl_exec($ch); 

                preg_match_all('/<string (.*?)>(.*?)<\/string>/s', $rsp, $matches);

                $result[$to] = $matches[2][0];
            }

            return $result;
        }
    }
 ?>