hi,all,最近离考试还有一段时间,这里分享一些最近我调试微软的表情识别的api接口的一些心得(各种坑)。
简单介绍微软的emotion api
首先贴出api地址,微软还很贴心的给出了console的一个调试页面,有没有感动的哭了,呜呜呜。。。首先看他的官方解释: <em>情感的API测试以图像作为输入,并返回的信心在一组情绪每个人脸在图像中,以及包围盒的脸上,从脸的API。情绪检测幸福、悲伤、惊讶、愤怒,恐惧,轻蔑、厌恶或中性。这些情感是相通的跨文化普遍通过基本相同的面部表情,在确定情感的API。</em>
啦啦啦还提供了各种demo,一切好像都变的简单起来!
好的,我们先来一段js代码,气氛搞起来,
<!DOCTYPE html>
<html>
<head>
<title>JSSample</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
$(function() {
var params = {
// Request parameters
};
$.ajax({
url: "https://api.projectoxford.ai/emotion/v1.0/recognize?" + $.param(params),
beforeSend: function(xhrObj){
// Request headers
xhrObj.setRequestHeader("Content-Type","application/json");
xhrObj.setRequestHeader("Ocp-Apim-Subscription-Key","{subscription key}");
},
type: "POST",
// Request body
data: "{body}",
})
.done(function(data) {
alert("success");
})
.fail(function() {
alert("error");
});
});
</script>
</body>
</html>
擦擦擦简单,我们来改下相关参数,哈哈哈哈,我去,为什么老提示什么
好吧,这个原来是js 的ajax跨域不能访问的原因,微软这坑X,那好用jsonp吧,这个可以吧
$.ajax({ type: "get",
async: false,
url: "http://example",
dataType: "jsonp",
jsonp: "callback",
//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
jsonpCallback:"flightHandler",
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: function(json)
{ alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。'); },
error: function(){ alert('fail'); }
});
});
看这里 擦擦擦就类似这种的,我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的。,,wait,为什么还不行,jsonp是只支持get的,post不行,
好吧,我是一个PHP程序员,那么就用宇宙最好的语言吧,哈,刚好人家也提供了demo
<?php
// This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents-client-ga/)
require_once 'HTTP/Request2.php';
$request = new Http_Request2('https://api.projectoxford.ai/emotion/v1.0/recognize');
$url = $request->getUrl();
$headers = array(
// Request headers
'Content-Type' => 'application/json',
'Ocp-Apim-Subscription-Key' => '{subscription key}',
);
$request->setHeader($headers);
$parameters = array(
// Request parameters
);
$url->setQueryVariables($parameters);
$request->setMethod(HTTP_Request2::METHOD_POST);
// Request body
$request->setBody("{body}");
try
{
$response = $request->send();
echo $response->getBody();
}
catch (HttpException $ex)
{
echo $ex;
}
?>
稍等,这是啥?Http_Request2,,还有这样写demo的,这个直接我都没有,好不容易下了个,人家还require_once()了好几个。。
擦擦擦
好吧,自己写,,用curl吧,大家要没用过,就看看这篇文章写的蛮好的,
好的,直接贴出代码吧,知道你们最想看什么
$imgurl=trim($_POST['imgurl']) ? trim($_POST['imgurl']) : '';
$patharr=explode('.', $_SERVER['SCRIPT_NAME']);
$path=substr($patharr[0], 0,strrpos($patharr[0],'/'));
$finurl="http://".$_SERVER['SERVER_NAME'].$path.'/'.$imgurl;
if($imgurl=='' or !isset($imgurl)){
return 'fail';
}
$header = array (
"POST HTTP/1.1",
"Content-Type: application/json",
"Ocp-Apim-Subscription-Key:XXXXXXXXX",
); 32879366.jpg";
$param=array('url'=>$finurl);
$jsonparam=json_encode($param);
$ch = curl_init();
$url="https://api.projectoxford.ai/emotion/v1.0/recognize";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonparam);//
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //设置头信息的地方
curl_setopt($ch, CURLOPT_HEADER, 0); //no取得返回头信息
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出response
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//如果返回的response 头部中存在Location值,就会递归请求
try {
$result = curl_exec($ch);
//unlink($imgurl);
echo $result;
} catch (Exception $e) {
echo "fail!".'<br>';
var_dump(curl_error($ch));
}
好的,终于解决了最主要的问题,剩下的就简单了,页面什么的,能用就好了。
谢谢大家
最后附上项目部署的BAE地址,ps:这个地址可能随时失效,主要是欠费了。。。。。。。
http://huanyi.duapp.com/emotion.html
网友评论