laravel 使用微信的图片内容检测及文字内容检测

ops/2024/11/14 22:05:19/

文字内容检测

	const SEC_LABEL = [100 => '正常',10001 => '广告',20001 => '时政',20002 => '色情',20003 => '辱骂',20006 => '违法犯罪',20008 => '欺诈',20012 => '低俗',20013 => '版权',21000 => '敏感',];/*** 检测文字安全* @param $openid   openid* @param $content  检测文本* @param $errmsg   错误信息*/public static function secMsgCheck($openid, $content, &$errmsg){$uri = 'https://api.weixin.qq.com/wxa/msg_sec_check';$uri = $uri . '?access_token=' . $getAccessToken;$info = ['content' => $content,'version' => 2,'scene' => 2,'openid' => $openid,];// curl请求,方式post,参数json$res = CurlUtil::getJson($uri, $info);$response = json_decode($res, true);switch ($response['errcode']) {case 0:if ($response['result'] && ($response['result']['suggest'] ?? 'pass') != 'pass') {$msg_type = self::SEC_LABEL[$response['result']['label'] ?? ''] ?? '违规';$errmsg = sprintf('发布失败,内容可能包含%s内容', $msg_type);return false;}return true;case 87014:$errmsg = '内容可能存在风险';return false;default:$errmsg = $response['errmsg'];return false;}}

调用

	$flag = Util::secMsgCheck($openid, $content, $errmsg);// $flag == true 及正确,否则返回 $errmsg 信息if (!$flag) return $this->error($errmsg);

图片内容检测

微信的图片检测,需要文件大小在1M以内,这就导致用户上传大图的时候无法检测成功,思路使用PHP将文件大小压缩至1M内

图片检测方法

	// 图片检测是否合法public function checkImg(Request $request){$file = $request->file('file');$extt = ['png', 'jpg', 'jpeg'];try {if (!$file->isValid()) throw new \Exception("请上传文件");//扩展名$ext = $file->getClientOriginalExtension();if (!in_array($ext, $extt)) throw new \Exception("图片格式不支持上传(支持png,jpg,jpeg)");// 文件大小$size = $file->getSize();//临时绝对路径$realPath = $file->getRealPath();// 大于1M就将图片压缩if ($size > 1024 * 1024 * 1) {// 图片压缩$img_path = public_path() . '/images/';$rand_img_url = date('Ymd') . uniqid() . '.' . $ext;ImagesUtil::thumb($realPath, $img_path, $rand_img_url, $ext);// 微信检测图片$rand_img_url = $img_path . $rand_img_url;$flag = Util::secImgCheck($rand_img_url, $errmsg);// 如果想保留图片将就不加这段代码// ******** start ********unlink($rand_img_url);// ********  end  ********if (!$flag) throw new \Exception($errmsg);} else {$flag = Util::secImgCheck($file, $errmsg);if (!$flag) throw new \Exception($errmsg);}return response()->json(['message' => ['检测成功!']]);} catch (\Exception $e) {return response()->json(['message' => [$e->getMessage()]], 422);}}

Util文件

	/*** 检测图片安全* @param $file     图片* @param $errmsg   错误信息* @return bool*/public static function secImgCheckNew($file, &$errmsg){$uri = 'https://api.weixin.qq.com/wxa/img_sec_check';$uri = $uri . '?access_token=' .  $getAccessToken;$real_path = realpath($file);$obj = new \CurlFile($real_path);$obj->setMimeType("image/jpeg");$info = ['media' => $obj,];// curl请求,方式post,参数 FormData$res = CurlUtil::SeedHttp($uri, $info, true);$response = json_decode($res, true);switch ($response['errcode']) {case 0:return true;case 87014:$errmsg = '图片可能存在风险';return false;case 40006:$errmsg = '被检测图片内容不能超过1M';return false;case 45002:$errmsg = '被检测图片内容超过限制';return false;default:$errmsg = $response['errmsg'];return false;}}

ImagesUtil文件

	/*** 对图片进行缩放* @param $filename     图片的路径* @param $img_path     生成图片路劲* @param $img_url      生成图片名称* @param $ext          图片后缀* @param int $width    设置图片缩放的宽度* @param int $height   设置图片缩放的高度*/public static function thumb($filename, $img_path, $img_url, $ext, $width = 600, $height = 600){// 获得原图的宽度和高度list($width_orig, $height_orig) = getimagesize($filename);// 根据参数$width和$height的值,换算出等比例的宽高if ($width && ($width_orig < $height_orig)) {$width = ($height / $height_orig) * $width_orig;} else {$height = ($width / $width_orig) * $height_orig;}// 将原图缩放到这个新创建的图片资源中$image_p = imagecreatetruecolor($width, $height);// 获取原图的图像资源if ($ext == 'jpg' || $ext == 'jpeg') {$image = imagecreatefromjpeg($filename);} elseif ($ext == 'png') {$image = imagecreatefrompng($filename);} else {$image = imagecreatefromgif($filename);}// 使用imagecopyresamapled()函数进行缩放设置imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);// 将缩放后的图片保存$_img_url = $img_path . $img_url;if ($ext == 'jpg' || $ext == 'jpeg') {imagejpeg($image_p, $_img_url, 9);} elseif ($ext == 'png') {imagepng($image_p, $_img_url, 9);} else {imagegif($image_p, $_img_url);}imagedestroy($image_p);// 销毁图片资源$image_pimagedestroy($image);// 销毁图片资源$image}

CurlUtil文件内容

	public static function getJson($url = '', $param = [], $contentType = 'json'){$ch = curl_init();// 请求地址curl_setopt($ch, CURLOPT_URL, $url);// 请求参数类型$param = $contentType == 'json' ? urldecode(json_encode($param)) : http_build_query($param);// 关闭https验证curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);// post提交if ($param) {curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $param);}// 返回的数据是否自动显示curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// 执行并接收响应结果$output = curl_exec($ch);// 关闭curlcurl_close($ch);return $output !== false ? $output : false;}/*** 发送CURL请求* @param $url 请求URL* @param $data 请求数据 无数据 == null* @param $ispost 是否发送POST 发送 true or false* @return bool|string 返回结果集*/public static function SeedHttp($url, $data, $ispost){//初使化init方法$ch = curl_init();//指定URLCURLOPT_POSTFIELDScurl_setopt($ch, CURLOPT_URL, $url);//设定请求后返回结果curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//声明使用POST方式来进行发送if ($ispost) {curl_setopt($ch, CURLOPT_POST, 1);}//发送什么数据呢if ($data != null || $data != '') {curl_setopt($ch, CURLOPT_POSTFIELDS, $data);}//忽略证书curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//忽略header头信息curl_setopt($ch, CURLOPT_HEADER, 0);//设置超时时间curl_setopt($ch, CURLOPT_TIMEOUT, 10);//发送请求$output = curl_exec($ch);//关闭curlcurl_close($ch);//返回数据return $output;}

http://www.ppmy.cn/ops/17396.html

相关文章

python 脚本头(PyCharm+python头部信息、py头部信息、python头信息、py头信息、py文件头部)

文章目录 参考PyCharm设置脚本头头部信息 参考 https://developer.aliyun.com/article/1166544 https://blog.csdn.net/Dontla/article/details/131743495 https://blog.csdn.net/dongyouyuan/article/details/54408413 PyCharm设置脚本头 打开pycharm&#xff0c;点击file–…

软件工程中的耦合和内聚

耦合 在软件工程中&#xff0c;耦合是一个重要的概念&#xff0c;用于描述模块或组件之间的相互依赖程度。 从非直接耦合到内容耦合的耦合性依次升高&#xff0c;所以非直接耦合是我们最想见到的结果&#xff0c;内容耦合是我们最不想见到的结果。 非直接耦合数据耦合标记耦…

web server apache tomcat11-11-Jasper 2 JSP Engine

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

HarmonyOS 实战开发-使用canvas实现图表系列之折线图

一、功能结构 实现一个公共组件的时候&#xff0c;首先分析一下大概的实现结构以及开发思路&#xff0c;方便我们少走弯路&#xff0c;也可以使组件更加容易拓展&#xff0c;维护性更强。然后我会把功能逐个拆开来讲&#xff0c;这样大家才能学习到更详细的内容。下面简单阐述…

美国服务器vs香港服务器,哪个网站部署打开更快一些?

网站打开速度受多种因素影响&#xff0c;包括服务器地理位置、网络质量、带宽等。用户距离服务器越近&#xff0c;访问速度越快。对于中国大陆用户而言&#xff0c;香港的服务器可能会提供更快的网站访问体验&#xff0c;因为香港距离大陆较近&#xff0c;且网络连接通常较好。…

科普:嵌入式代码软件在环(SiL)测试的可靠性

关键词&#xff1a;嵌入式系统、软件在环&#xff08;SiL&#xff09;、测试、生命周期 01.简介 当前&#xff0c;嵌入式系统开发的大趋势为通过软件实现大量的硬件功能&#xff0c;这导致软件的复杂程度显著上升——代码开发成本和风险也成倍增加。复用已有系统中的软件组件…

C#自定义窗体更换皮肤的方法:创建特殊窗体

目录 1.窗体更换皮肤 2.实例 &#xff08;1&#xff09;图片资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#xff09; 生成效果 &#xff08;5&#xff09;一个遗憾 1.窗…

MyBatis-动态sql常见使用

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能&#xff0c;它存在的意义是为了解决 拼接SQL语句字符串时的痛点问题。 1. if if标签可通过test属性的表达式进行判断&#xff1a;若表达式的结果为true&#xff0c;则标签中的内容会执行&#xff1b;反之标…