2018-05-31 最新php代码:https://www.jianshu.com/p/0c672f453552
声明
本文教程仅供学习使用,未经允许请勿随意传播
环境
本次教程所使用的平台为thinkphp 5,请大家在学习的过程中安装wamp软件,并运行于自己的计算机上,切勿公开。
教程
微软小冰颜值api
http://kan.msxiaobing.com/Api/ImageAnalyze/Process?service=yanzhi
在使用前我们看一下效果
{"msgId":"1461905520063","timestamp":0,"receiverId":null,"content":{"text":"颜值7.2分,再接再厉!捯饬捯饬,说不定就是男神了呢~","imageUrl":"http://mediaplatform.trafficmanager.cn/image/fetchimage?key=UQAfAC8ABAAAAFcAFgAGABYASgBAADgAMQBFAEQARABGAEEAMgBGADkAQgBGAEYAQwA4AEEANQAxADgAMAA4AEEANgA2ADMAMwBFADMAMAA3AEE","metadata":{"w":"scv9isnfUnZbhOfPjNnUjOfir-3Ave_sisfqiuToh-LmisD0j-zAoMbJt9Xth-bXgeDkhMHThtXpj_nArvfSv8z_i_PlgMnLHw==","aid":"926D0CE62C692233D68C55F972C001FB"}}}
这个是返回的json格式的数据,其中可以用的关键字自己把握
在使用api前,我们需要上传图片到微软的图片服务器,并接收返回的json数据
// 上传图片到微软服务器,返回服务器的json格式的图片地址
function upLoad($imgData = ''){
$curl = curl_init();
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $imgData);
curl_setopt($curl, CURLOPT_URL, "http://kan.msxiaobing.com/Api/Image/UploadBase64");
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
curl_setopt ($curl, CURLOPT_USERAGENT, $user_agent);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$str = curl_exec($curl);
curl_close($curl);
return $str;
}
// 接收一个图片url,将其转换为base64字符串形式
function didImg($imgUrl = ''){
try {
$img_file = file_get_contents($imgUrl);
} catch (Exception $e) {
return false;
}
return base64_encode($img_file);
}
我们在使用upLoad前需要把图片转换为base64的格式,使用didImg函数就可以做到。
我们来看一下上传成功服务器返回的数据:
{"Host":"http://mediaplatform.trafficmanager.cn","Url":"/image/fetchimage?key=JMGsEUAgbwPVieCjp0qsipGGlm8houXZoZqugTZlprvKOKroQbiHMnJ9WD8"}
这个就是服务器已经将图片处理了,并存放在服务器里面
我们在使用颜值api前,需要使用它
我们来看一下完整的代码
function getFace( $imgUrl= '' ){
// 获取图片,并转换为base64格式
$imgData = didImg($imgUrl);
if ($imgData == false)
return false;
// 上传图片并接收其返回值
$resImg = upLoad($imgData);
// 处理json格式
$imgArr = json_decode($resImg);
// 构造api所需数据
$data = [
'MsgId' => time()."063",
'CreateTime' => time(),
'Content%5BimageUrl%5D' => $imgArr->Host . $imgArr->Url
];
// 颜值测试
$res = curl("http://kan.msxiaobing.com/Api/ImageAnalyze/Process?service=yanzhi",$data,"POST");
// 处理数据
$res = (array)json_decode($res);
return $res;
}
getFace 可以完成颜值测试的整个过程,使用一个url图片,就可以得到其中人物的颜值,是不是很有感觉,亲自动手试一试吧!祝你好运!
可以自己DIY一下,因为有了数据,就可以利用对吧,比如通过学校的教务系统证件照,将全校颜值最高的美女揪出来,是不是很给力!其实我是想做一个我们学校的颜值大厅来表白的,把自己的女神放到第一,结果被举报了。
其他函数
你可能需要用到curl网络访问函数
/**
* 网络访问
* @param string $destURL [description]
* @param array $paramArr [description]
* @param string $flag [description]
* @param string $fromurl [description]
* @return [type] [description]
*/
function curl($destURL = '', $paramArr = array() ,$flag = 'GET',$fromurl='http://baidu.com'){
$curl = curl_init();
$paramStr = '';
if( !empty($paramArr) ){
foreach ($paramArr as $key => $value) {
$paramStr .= $key.'='.$value.'&';
}
}
if($flag == 'POST'){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $paramStr);
}else{
$destURL = $paramArr ? $destURL."?".$paramStr : $destURL;
}
// 构造IP
$header = array(
'CLIENT-IP:127.0.0.1',
'X-FORWARDED-FOR:127.0.0.1',
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
// 请求地址
curl_setopt($curl, CURLOPT_URL, $destURL);
// 来源地址
curl_setopt($curl, CURLOPT_REFERER, $fromurl);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
// 构造客户端
$user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
curl_setopt ($curl, CURLOPT_USERAGENT, $user_agent);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$str = curl_exec($curl);
curl_close($curl);
// return iconv('GB2312', 'UTF-8',urldecode($str) );
return $str;
}
代码更新 2017-7-26
upload_file_api);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$str = curl_exec($curl);
curl_close($curl);
return $str;
}
public function ice_yanzhi_test($server_img_url) {
$data = [
'MsgId' => time(). "666",
'CreateTime' => time(),
'Content%5BimageUrl%5D' => $server_img_url,
];
$ret = $this->curl($this->ice_yanzhi_api, $data, 'POST', $this->ice_page);
return $ret ? $ret : null;
}
// 可以存储header的http请求函数
private function curl($url, $param=[], $method='GET', $referer='http://localhost') {
$curl = curl_init();
$param_str = '';
if( !empty($param) ){
foreach ($param as $key => $value) {
$param_str .= $key.'='.$value.'&';
}
}
if($method == 'POST'){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $param_str);
}else{
$url = $param ? $url. "?" .$param_str : $url;
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_REFERER, $referer);
curl_setopt($curl, CURLOPT_COOKIE, $this->cookie);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_NOBODY, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$resp = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($code == '200') {
$headers_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$headers = substr($resp, 0, $headers_size);
$body = substr($resp, $headers_size);
preg_match_all('/Set-Cookie:(.*);/iU',$headers, $tmp);
if (!empty($tmp[1])) {
$cookie = '';
foreach ($tmp[1] as $key => $value) {
$cookie = $cookie . $value.';';
}
$cookie = str_replace(' ', '', $cookie);
}
// 这里应该有点问题
$this->cookie = $cookie;
} else {
// TODO::
return false;
}
curl_close($curl);
return $body;
}
private function did_img($img_url = ''){
try {
$img_file = file_get_contents($img_url);
} catch (Exception $e) {
return false;
}
return base64_encode($img_file);
}
public function test() {
// 获取headers
$this->curl($this->ice_page);
// 获取图像并上传
$data = $this->did_img('http://image.tianjimedia.com/uploadImages/2015/131/38/24XUM11WCMLP.jpg');
if ($data == false) return null;
$ret_img_json = $this->up_file($data);
if (empty($ret_img_json)) return null;
$ret_img = json_decode($ret_img_json);
$ret = $this->ice_yanzhi_test($ret_img->Host . $ret_img->Url);
return json_decode($ret);
}
}
$o = new Ice();
var_dump( $o->test() );
主要增加了Cookie验证和Referer验证。
有问题?
如果你在学习的过程中遇到问题?请直接在评论区回复。