imgurl/application/controllers/Deal.php

195 lines
7.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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
$kyes = $row['values'];
$kyes = json_decode($kyes);
$i = 'api'.rand(1,2);
$key = $kyes->$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;
}
}
?>