mirror of https://github.com/helloxz/imgurl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
7.8 KiB
199 lines
7.8 KiB
<?php |
|
/* |
|
name:图片处理控制器,图片鉴黄、图片压缩... |
|
*/ |
|
defined('BASEPATH') OR exit('No direct script access allowed'); |
|
class Deal extends CI_Controller{ |
|
//构造函数 |
|
public function __construct(){ |
|
parent::__construct(); |
|
//设置超时时间为5分钟 |
|
set_time_limit(300); |
|
//加载数据库类 |
|
$this->load->database(); |
|
} |
|
//图片压缩服务,传入images的id |
|
public function compress($id){ |
|
//只有管理员才有压缩权限 |
|
$this->load->library('basic'); |
|
$this->basic->is_login(TRUE); |
|
$id = (int)$id; |
|
//生成SQL语句 |
|
$sql = "SELECT a.`id`,a.`path`,a.`compression`,b.`mime` FROM img_images AS a INNER JOIN img_imginfo AS b ON a.imgid = b.imgid AND a.id = $id"; |
|
$query = $this->db->query($sql); |
|
$row = $query->row_array(); |
|
//图片绝对路径 |
|
$path = FCPATH.$row['path']; |
|
|
|
//如果图片已经压缩过,就不要再压缩了 |
|
if($row['compression'] == 1){ |
|
$this->err_msg('此图片已经压缩!'); |
|
} |
|
//检查MIME类型,仅压缩jpeg & png |
|
if(($row['mime'] != 'image/jpeg') && ($row['mime'] != 'image/png')){ |
|
$this->err_msg('此图片类型不支持压缩!'); |
|
} |
|
|
|
//先取出tinypng信息 |
|
$sql = "SELECT * FROM img_options WHERE name = 'tinypng' LIMIT 1"; |
|
$row = $this->db->query($sql)->row_array(); |
|
|
|
//验证是否启用了压缩功能 |
|
if($row['switch'] == 'OFF'){ |
|
$this->err_msg('您没有启用压缩功能!'); |
|
} |
|
//上面验证通过,继续执行 |
|
//取出tinypng key |
|
//拼写错误处理 |
|
$keys = $row['values']; |
|
|
|
//可以使用任意多个key |
|
//@todo 建议使用列表类型而不是联名数组类型保存key |
|
$keys = json_decode($keys, true); |
|
$i = 'api'.rand(1, count($keys)); |
|
$key = $keys[$i]; |
|
|
|
$url = "https://api.tinify.com/shrink"; |
|
$data = file_get_contents($path); |
|
|
|
$ch = curl_init(); |
|
$user = "api"; |
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
|
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); |
|
curl_setopt($ch, CURLOPT_USERPWD, "{$user}:{$key}"); |
|
// post数据 |
|
curl_setopt($ch, CURLOPT_POST, 1); |
|
// post的变量 |
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); |
|
//https |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
|
$output = curl_exec($ch); |
|
curl_close($ch); |
|
$output = json_decode($output); |
|
//获取压缩后的图片链接 |
|
$outurl = $output->output->url; |
|
|
|
//先判断是否是正常的URL,万一请求接口失败了呢 |
|
if(!filter_var($outurl, FILTER_VALIDATE_URL)){ |
|
//糟糕,没有验证通过,那就结束了 |
|
$this->err_msg('请求接口失败!'); |
|
} |
|
|
|
//下载图片并保存覆盖 |
|
$curl = curl_init($outurl); |
|
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"); |
|
curl_setopt($curl, CURLOPT_FAILONERROR, true); |
|
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); |
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); |
|
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); |
|
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); |
|
#设置超时时间,最小为1s(可选) |
|
|
|
$data = curl_exec($curl); |
|
curl_close($curl); |
|
|
|
//重新保存图片 |
|
file_put_contents($path,$data); |
|
|
|
//最后别忘了更新数据库呀 |
|
$sql = "UPDATE img_images SET compression = 1 WHERE `id` = $id"; |
|
if($this->db->query($sql)){ |
|
$this->suc_msg('压缩完成!'); |
|
} |
|
} |
|
//图片鉴黄识别 |
|
public function identify($id){ |
|
$id = (int)$id; |
|
//生成SQL语句 |
|
$sql = "SELECT a.id,a.path,a.level,b.domains FROM img_images AS a INNER JOIN img_storage AS b ON b.engine = 'localhost' AND a.id = $id"; |
|
$query = $this->db->query($sql); |
|
$row = $query->row_array(); |
|
$imgurl = $row['domains'].$row['path']; |
|
//echo $row['level']; |
|
//如果图片已经识别过,就不要再次识别了 |
|
if(($row['level'] != 'unknown') && ($row['level'] != NULL)){ |
|
$this->err_msg('此图片已经识别过!'); |
|
} |
|
//继续执行 |
|
$sql = "SELECT * FROM img_options WHERE name = 'moderate' LIMIT 1"; |
|
$row = $this->db->query($sql)->row_array(); |
|
//如果没有启用压缩功能 |
|
if($row['switch'] == 'OFF'){ |
|
$this->err_msg('未启用图片鉴黄识别!'); |
|
} |
|
|
|
$apiurl = "https://www.moderatecontent.com/api/v2?key=".$row['values']."&url=".$imgurl; |
|
$curl = curl_init($apiurl); |
|
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"); |
|
curl_setopt($curl, CURLOPT_FAILONERROR, true); |
|
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); |
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); |
|
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); |
|
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); |
|
|
|
$html = curl_exec($curl); |
|
curl_close($curl); |
|
|
|
$html = json_decode($html); |
|
@$level = $html->rating_label; |
|
@$error_code = (int)$html->error_code; |
|
|
|
//最后更新数据库 |
|
$sql = "UPDATE img_images SET level = '$level' WHERE `id` = $id"; |
|
|
|
//如果执行成功才进行更新 |
|
if($error_code === 0){ |
|
//更新数据库 |
|
$this->db->query($sql); |
|
if($level == 'adult'){ |
|
$arr = array( |
|
"code" => 400, |
|
"msg" => '您的IP已记录,请不要上传违规图片!' |
|
); |
|
$arr = json_encode($arr); |
|
echo $arr; |
|
} |
|
else{ |
|
$this->suc_msg('识别完成!'); |
|
} |
|
} |
|
else{ |
|
$this->err_msg('识别失败!'); |
|
} |
|
} |
|
//批量识别图片 |
|
public function identify_more(){ |
|
$sql = "SELECT * FROM img_images WHERE (`level` = 'unknown') OR (`level` = NULL) ORDER BY `id` DESC LIMIT 5"; |
|
//查询数据库 |
|
$query = $this->db->query($sql); |
|
$result = $query->result(); |
|
|
|
//循环识别图片 |
|
foreach($result as $row){ |
|
$this->identify($row->id); |
|
} |
|
} |
|
|
|
//返回错误码 |
|
protected function err_msg($msg){ |
|
$arr = array( |
|
"code" => 0, |
|
"msg" => $msg |
|
); |
|
$arr = json_encode($arr); |
|
echo $arr; |
|
exit; |
|
} |
|
//成功,返回正确的状态码 |
|
protected function suc_msg($msg){ |
|
$arr = array( |
|
"code" => 200, |
|
"msg" => $msg |
|
); |
|
$arr = json_encode($arr); |
|
echo $arr; |
|
} |
|
} |
|
?>
|