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_p
        imagedestroy($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);
        // 关闭curl
        curl_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_POSTFIELDS
        curl_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);
        //关闭curl
        curl_close($ch);
        //返回数据
        return $output;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java 词法分析练习

import parser.Parser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arrays.asList("int","String…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进&#xff0c;因此在使用和维护上需要更专业的手法&#xff0c;而对于普通客户来说并不具备专业操作激光打印机的技能&#xff0c;为了通俗易懂地让客户理解激光打印机&#xff0c;我们为企业定制了激光打印机3D产品说明书&#xff0c;将为您带…

Trello与Notion的开源替代项目管理利器Focalboard本地安装与远程访问

本篇文章将介绍如何使用 Docker 本地部署 Focalboard 项目管理工具&#xff0c;并且结合 cpolar 内网穿透进行公网访问&#xff0c;实现团队协作&#xff0c;提高工作效率&#xff01; Focalboard 是一个开源项目管理工具&#xff0c;可以替代 Asana、Trello 和 Notion 等软件…

软件项目交付支撑文档有哪些?文档下载获取

软件文档交付清单是指在软件开发项目完成后&#xff0c;开发团队需要准备的一份详细清单&#xff0c;用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件开发文档&#xff1a;这包括需求文档、设计文档、测试文档等…

SignalR中的重连机制和心跳监测机制详解

一. 重连机制 声明&#xff1a;   本节仅介绍重连机制和心跳监测机制&#xff0c;基于Core 3.1框架&#xff0c;至于SignalR其它的一些基本使用&#xff0c;包括引入、Hub、配置等常规操作&#xff0c;在本节中不介绍&#xff0c;后续写Core下的SignalR 说明   默认是没有重…

Linux抓包工具tcpdump

一、tcpdump抓包工具 1.命令格式解析 命令格式&#xff1a;tcpdump option proto dir type proto&#xff08;协议&#xff09; 1.tcp、udp、icmp 2.ip、ipv6 3.arp dir&#xff08;数据的方向 &#xff09; 1.src 192.168.7.130 只抓取源地址是7.130 2.…

【数学建模】DVD在线租赁

2005高教社杯全国大学生数学建模竞赛题目B 随着信息时代的到来&#xff0c;网络成为人们生活中越来越不可或缺的元素之一。许多网站利用其强大的资源和知名度&#xff0c;面向其会员群提供日益专业化和便捷化的服务。例如&#xff0c;音像制品的在线租赁就是一种可行的服务。这…

A Survey of State of the Art on Rumor Detection in Social Network

Abstract 互联网上充斥着谣言帖子&#xff0c;谣言的传播会给社会和谐稳定带来负面影响&#xff0c;影响网络信息生态的健康发展。谣言的不确定性、时效性、主观性等特点&#xff0c;使其不同于一般的虚假网络信息。社交网络谣言检测是社交网络与信息传播研究领域的热点问题&am…

Linux 调度优先级

Linux中的每个任务都有其优先级。这个优先级的范围从-20到19。优先级越低&#xff08;-20&#xff09;&#xff0c;分配 给任务的CPU时间就越多。默认的优先级是0。 并非所有的任务都需要使用相同的优先级。交互式应用要求快速响应&#xff0c;通过 crontab 运行的后台…

Java本地缓存技术选型(Guava Cache、Caffeine、EhCache)

前言 对一个java开发者而言&#xff0c;提到缓存&#xff0c;第一反应就是Redis。利用这类缓存足以解决大多数的性能问题了&#xff0c;我们也要知道&#xff0c;这种属于remote cache&#xff08;分布式缓存&#xff09;&#xff0c;应用的进程和缓存的进程通常分布在不同的服…

Web3技术解析:区块链在去中心化应用中的角色

引言 在过去几年中&#xff0c;Web3技术已经成为了互联网领域的一个热门话题。作为区块链技术的延伸&#xff0c;Web3不仅仅是数字货币的代名词&#xff0c;更是一个能够为各种应用提供去中心化解决方案的强大工具。本文将深入探讨区块链在Web3去中心化应用中的关键角色&#…

贪心算法在找零问题中的应用

贪心算法在找零问题中的应用 引言a. 贪心算法求解找零问题算法设计算法证明 b. 硬币面额为c的幂时的贪心算法证明算法设计算法证明 c. 设计使贪心算法失效的硬币面额组合d. 通用找零算法设计算法设计算法实现&#xff08;伪代码&#xff09;算法实现&#xff08;C代码&#xff…

【热门话题】PostCSS:现代前端开发中的CSS增强工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 PostCSS&#xff1a;现代前端开发中的CSS增强工具一、引言二、PostCSS简介2.1 核…

【树莓派4B】如何点亮树莓派的LED灯

在之前一系列文章中&#xff0c;使用python、行人入侵检测&#xff0c;确没有使用树莓派的硬件。控制引脚进行输出&#xff1a; 如何写python点亮led灯闪烁&#xff0c;我灯接在gpio13,GPIO19,gpio26。我都想闪烁。 你可以使用Python的GPIO库来控制树莓派上的LED灯。首先&…

安卓常用组件(启停活动页面、活动之间传递信息、收发应用广播、操作后台服务)

启停活动页面 Activity的启动和结束 页面跳转可以使用startActivity接口&#xff0c;具体格式为startActivity(new Intent(this, 目标页面.class));。 关闭一个页面可以直接调用finish();方法即可退出页面。 Activity的生命周期 页面在安卓有个新的名字叫活动&#xff0c;因…

【MySQL关系型数据库】基本命令、配置、连接池

目录 MySQL数据库 第一章 1、什么是数据库 2、数据库分类 3、不同数据库的特点 4、MySQL常见命令&#xff1a; 5、MySQL基本语法 第二章 1、MySQL的常见数据类型 1、数值类型 2、字符类型 3、时间日期类型 2、SQL语句分类 1、DDL&#xff08;数据定义语言&#x…

Relu激活函数

概念 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值&#xff0c;并将输入值传递给下一层。在多层神经网络中&#xff0c;上层节点的输出和下层节点的输入之间具有一个函数关系&#xff0c;这个函数称为激活函数。 激活函数做的事情时把神经元的输…

STM32存储左右互搏 SDIO总线FATS文件读写SD/MicroSD/TF卡

STM32存储左右互搏 SDIO总线FATS文件读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而…

SN75107BDR 总线接收器 中文资料_PDF中文资料_参数_引脚图

SN75107BDR 规格信息&#xff1a; 制造商:Texas Instruments 产品种类:总线接收器 RoHS:是 接收机数量:2 Receiver 接收机信号类型:Differential 电源电压-最小:/- 4.75 V 电源电压-最大:/- 5.25 V 工作电源电流:30 mA 最小工作温度:0 C 最大工作温度: 70 C 封装 / 箱…

文旅IP孵化打造抖音宣传推广运营策划方案

【干货资料持续更新&#xff0c;以防走丢】 文旅IP孵化打造抖音宣传推广运营策划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 文旅IP抖音运营方案 1. 项目背景与目标 - 背景&#xff1a…
最新文章