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

文字内容检测

	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.mzph.cn/web/2546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 数据持久化——persistentDataPath储存路径

Unity中&#xff1a; StreamingAssets的文件夹,特点是:只能读,不能写. persistentDataPath可读可写&#xff08;但是,此文件夹在Editor阶段没有&#xff0c;手机安装App后自动生成&#xff09; 可以将一些必需的文件先放在StreamingAssets,在App安装后Copy到persistentDataP…

详解数据结构:队列(含栈与队列扩展)

一、顺序队列 有一种线性序列&#xff0c;特点是先进先出&#xff0c;这种存储结构称为队列。队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能再两端操作&#xff1a;一端进、一端出。进的一端称为队尾&#xff0c;出的一端称为队头。队列可以用顺…

C# 计算两个坐标点直接的距离

在C#中计算两个坐标点之间的距离时&#xff0c;方法的选择取决于坐标系的类型以及您需要处理的具体情况。以下是几种常见场景下的计算方法&#xff1a; 1. 平面直角坐标系中的两点距离 在二维平面直角坐标系中&#xff0c;给定两个点A(x1, y1)和B(x2, y2)&#xff0c;它们之间…

Sharding-JDBC 5.0.0快速集成Springboot2.3.2【读写分离】

Sharding-JDBC 5.0.0快速集成Springboot2.3.2 引入依赖&#xff1a; <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0</version> …

自己实现httpsession

package com.kongjs.emo.web.session;import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; import java.util.*; // 实现类 public class Session implements HttpSession {private String id;privat…

20240424codeforces刷题题解

240424刷题题解 Walk on Matrix CodeForces - 1332D 思路 构造题&#xff0c;每个 d p i , j dp_{i,j} dpi,j​​​都是由其左上方向中的按位与最大值决定的。 我们需要从使得贪心解与正确解的差值为 k k k。 为了方便获得 k k k&#xff0c;可以考虑构造一个贪心解为 0…

Windows批处理脚本,用于管理Nginx服务器

先看截图&#xff1a; Windows批处理脚本&#xff0c;用于管理Nginx服务器。它提供了启动、重启、关闭Nginx以及刷新控制台等功能。 设置环境变量&#xff1a; set NGINX_PATHD:&#xff1a;设置Nginx所在的盘符为D盘。set NGINX_DIRD:\nginx1912\&#xff1a;设置Nginx所在…

HTML5+CSS3小实例:炫彩荧光线条登录框

实例:炫彩荧光线条登录框 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-sca…

每日一题---环形链表的约瑟夫问题

文章目录 前言1.题目2.解题思路2.1创建节点 2.2.创建环形链表2.3.进行遍历 4参考代码 前言 前段时间我们学习到了单链表和双向链表的相关知识&#xff0c;下面我们解决一道具有代表性的一个编程题。 牛客网—环形链表的约瑟夫问题 1.题目 2.解题思路 2.1创建节点 //创建节点…

flink入门程序(一)

Flink中提供了3个组件&#xff0c;包括DataSource、Transformation和DataSink。 DataSource&#xff1a;表示数据源组件&#xff0c;主要用来接收数据&#xff0c;目前官网提 供了readTextFile、socketTextStream、fromCollection以及一些第三方的Source。 Transformation&…

scratch选择火车下铺 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch根据身份证号码识别是否优先选择火车下铺 一、题目要求 1、准备工作 2、功能实现 二、案例分析

25计算机考研院校数据分析 | 复旦大学

复旦大学(fudan University)&#xff0c;简称"复旦”&#xff0c;位于中国上海&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列985工程、211工程、双一流A类&#xff0c;入选“珠峰计划"、"111计划""2011计划…

理解CSS中的sticky与fixed定位

在CSS中&#xff0c;position: sticky; 和 position: fixed; 是两种常见的定位方式&#xff0c;它们可以让元素脱离文档流&#xff0c;并具有固定位置的效果。然而&#xff0c;它们在实际应用中有着不同的特点和使用场景。 sticky定位 特点&#xff1a;position: sticky; 允许…

【学习】软件测试自动化,是未来的趋势还是当前的必需

在当今快速迭代的软件开发周期中&#xff0c;速度和质量成为了企业生存的关键。随着DevOps实践的普及和持续集成/持续部署&#xff08;CI/CD&#xff09;流程的标准化&#xff0c;软件测试自动化已经从未来的趋势转变为当前的必要性。本文将探讨自动化测试的现状、必要性以及其…

【node:19212】 解决 Node.js 报错 “将文件视为 CommonJS 模块“

【node:19212】 解决 Node.js 报错 “将文件视为 CommonJS 模块” 当在 Node.js 中运行 JavaScript 文件时&#xff0c;可能会遇到类似以下的报错信息&#xff1a; (node:19212) Warning: To load an ES module, set "type": "module" in the package.js…

uniapp 引用组件后 不起作用 无效果 不显示

根据uniapp官方文档easycom组件规范 只要组件安装在项目的components目录下或uni_modules目录下&#xff0c;并符合components/组件名称/组件名称.(vue|uvue)目录结构&#xff08;注意&#xff1a;当同时存在vue和uvue时&#xff0c;uni-app 项目优先使用 vue 文件&#xff0c;…

【C语言__指针02__复习篇12】

目录 前言 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 前言 本篇主要讨论以下问题&#xff1a; 1. 数组名通常表示什么&#xff0c;有哪两种例外情况&#xff0c;在例外情况中…

Retelling|Gap Year

录音 Retelling|Gap Year gap year 转写 im a trainee from DJ teaching interpretation. And Im going to talk about taking a gap year. Its Most of our popular off for students are taken after college and before University, the UK taking a cut cups here and hav…

我用ADAU1467加5个ADAU1772,做20进10出的音频处理板(七):音量调节的更多例程

作者的话 ADAU1467是现阶段ADI支持最多通道的ADAU音频DSP&#xff0c;他配合外部的AD/DA&#xff0c;可以实现最多32路音频通道&#xff0c;接了一个小项目&#xff0c;我拿它做了一块20进10出的板&#xff0c;10个MIC/LINE输入,10个LINE IN输入&#xff0c;10个HPOUT&#xf…

烟雾识别图像处理:原理、应用与未来发展---豌豆云

本文详细介绍了烟雾识别图像处理的基本原理、应用领域以及未来的发展趋势。 通过深入剖析烟雾识别图像处理的关键技术和方法&#xff0c;帮助读者了解该领域的最新进展&#xff0c;为实际应用提供有价值的参考。 随着计算机视觉和人工智能技术的快速发展&#xff0c;烟雾识别…