PHP和Bing翻译API

PHP和Bing翻译API,php,translation,access-token,azure-marketplace,Php,Translation,Access Token,Azure Marketplace,我已经在Azure Marketplace注册了,我有一个客户端ID和一个客户端“机密”,但到目前为止我尝试的所有操作都会导致“400错误请求”错误。非常感谢 下面是我一直在尝试的代码的一个相当基本的示例(我已经编辑了客户机ID和Secret值)。我的操作理解为post变量可以通过URL请求传递。。。我希望这是正确的 $authURL = 'http://datamarket.accesscontrol.windows.net/v2/OAuth2-13&grant_type=client

我已经在Azure Marketplace注册了,我有一个客户端ID和一个客户端“机密”,但到目前为止我尝试的所有操作都会导致“400错误请求”错误。非常感谢

下面是我一直在尝试的代码的一个相当基本的示例(我已经编辑了客户机ID和Secret值)。我的操作理解为post变量可以通过URL请求传递。。。我希望这是正确的

$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);

我创建了一个小PHP类,它易于使用,并且易于集成到任何PHP项目中。你可以找到它。这是代码:

  <?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;
        }
    }
 ?>

请将此代码放在标题部分。。 这对我来说太好了。享受吧

<div id='MicrosoftTranslatorWidget' class='Light' style='color:white;background-color:#555555'></div>
<script type='text/javascript'>
setTimeout(function(){{
var s=document.createElement('script');
s.type='text/javascript';
s.charset='UTF-8';
s.src=((location && location.href && location.href.indexOf('https') == 0)?'https://ssl.microsofttranslator.com':'http://www.microsofttranslator.com')+'/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKkd965FeEGM5JtQ**&ctf=False&ui=true&settings=Manual&from=';
var p=document.getElementsByTagName('head')[0]||document.documentElement;
p.insertBefore(s,p.firstChild); 
}},0);
</script>

setTimeout(函数(){{
var s=document.createElement('script');
s、 type='text/javascript';
s、 字符集='UTF-8';
s、 src=((location&&location.href&&location.href.indexOf('https')==0)?”https://ssl.microsofttranslator.com':'http://www.microsofttranslator.com“)+”/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKkd965FeEGM5JtQ**&ctf=False&ui=true&settings=Manual&from=”;
var p=document.getElementsByTagName('head')[0]| | document.documentElement;
p、 插入前(s,p.第一个孩子);
}},0);

以下是基于Bing Translation API的最新凭证为我提供的最新代码:

<?php 
$key1 = "??????";  //enter your azure key here
$endpoint = 'https://languagetranslationservice.cognitiveservices.azure.com/sts/v1.0/issuetoken';  //enter your azure end point here
$from = "en";  //Support Languages: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/language-support
$to = "te";
$inputStr = "welcome to paradise";

function getToken($key1, $endpoint)
{
    $ch = curl_init();
    $data_string = json_encode('{body}');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data_string),
            'Ocp-Apim-Subscription-Key: ' . $key1
        )
    );
    curl_setopt($ch, CURLOPT_URL, $endpoint);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $strResponse = curl_exec($ch);
    curl_close($ch);
    return $strResponse;
}

// function for translation
function curlRequest($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $curlResponse = curl_exec($ch);
    curl_close($ch);
    return $curlResponse;
}

//start translation
$accessToken = getToken($key1, $endpoint);
$params = "text=" . urlencode($inputStr) . "&to=" . $to . "&from=" . $from . "&appId=Bearer+" . $accessToken;
$translateUrl = "http://api.microsofttranslator.com/v2/Http.svc/Translate?$params";
$curlResponse = curlRequest($translateUrl);
$output = simplexml_load_string($curlResponse);
echo $output;
?>


Hi User,相反,您为什么不向我们展示您所做的工作,然后询问有关代码的具体问题,这样我们就可以更好地帮助您了。这个网站并不是为人们编写代码,而是在他们陷入困境时提供帮助(你是……你只需要发布你的代码:)祝你好运!您需要将令牌传递到第二个curl请求中吗?我没有注意到,所以谢谢。。。但添加$TokenHeader=“授权:持有人”$xpre;和curl_setopt($ch,CURLOPT_HEADER,$TokenHeader);不幸的是,我没有解决我的问题。我不知道我还能帮上多少忙,但那篇博客文章是最近的。如果您可以访问unix机器(Mac/Linux),我建议您使用自己的值来运行他的示例。确保API和所有密钥都正常工作,这将帮助您判断是您的代码被破坏了,还是您的密钥/令牌被破坏了。我的想法是缩小问题的范围。希望有帮助!为什么不试试下面的实现演示呢