微信小程序和QQ小程序图片安全内容检测接口之ThinkPHP实现

news/2024/7/20 1:11:55 标签: 微信小程序, 小程序, 微信

由于相关管控,UGC小程序的开发者,必须要过滤违法违规内容(如黄)。

UGC小程序官方定义:

小程序中的功能或服务中,涉及用户将自己自定义编辑的文字、图片、音频、视频等内容通过小程序进行展示或提供给其他用户的,属于UGC小程序

拒审条例:

存在平台为允许的服务内容,违反《微信小程序>微信小程序平台运营规范常见拒绝情形3.2》

原因:

小程序提供用户图片处理功能,但是未接入图片安全内容检测接口https://api.weixin.qq.com/wxa/img_sec_check

注意:不要尝试做假调用,审核人员真的会用有颜色的图片来测试!!!

解决方案:


尝试过小程序云开发,但是云函数大小有限制太死,行不通。改自己服务器用php实现安全校验接口。用的是ThinkPHP,你们自行调整。

其实微信小程序>微信小程序和QQ小程序的安全检测接口思路和代码差不多一次,但是为了大家方便参考比对和Copy,就全贴出来了。

微信小程序>微信小程序服务端相关代码

  • 图片敏感检测接口
	//微信小程序>微信小程序图片敏感检测
    public function wxImgSecCheck() {
        $access_token = $this->getMiniToken();
        $img = request()->param('img');
        if (empty($img)) {
            return RJson::error("");
        }
        
        $filePath = $this->saveBase64Image($img, 0);
        if (empty($filePath)) {
            return RJson::error("");
        }
        $obj = new \CURLFile(realpath($filePath));
        $obj->setMimeType("image/jpeg");
        $file['media'] = $obj;
        $url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=".$access_token;
        $info = $this->httpRequest($url,$file);
        return RJson::success($info);
    }
  • 获取access_token
	//微信小程序>微信小程序获取access_token
	private function getMiniToken() {
        $cacheKey = 'miniRcubeAccessToken';
        $access_token = Cache::get($cacheKey); 
        if (empty($token)) {
            $appid = "你的APPID";
            $secret = "你的SECRET";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
            $jsonResult = file_get_contents($url);
            $resultArray = json_decode($jsonResult, true);
            $access_token = $resultArray["access_token"];
            Cache::set($cacheKey,$access_token,180);
        }
        return $access_token;
    }

QQ小程序服务端相关代码

  • 图片敏感检测接口
	//QQ小程序图片敏感检测
    public function qqImgSecCheck() {
        $access_token = $this->getQQMiniToken();
        $img = request()->param('img');
        if (empty($img)) {
            return RJson::error("");
        }
       	
        $filePath = $this->saveBase64Image($img, 1);
        if (empty($filePath)) {
            return RJson::error("");
        }
        $obj = new \CURLFile(realpath($filePath));
        $obj->setMimeType("image/jpeg");
        $file['media'] = $obj;
        $url = "https://api.q.qq.com/api/json/security/ImgSecCheck?access_token=".$access_token;
        $info = $this->httpRequest($url,$file);
        return RJson::success($info);
    }
  • 获取access_token
	//QQ小程序获取access_token
	private function getQQMiniToken() {
        $cacheKey = 'miniQQRcubeAccessToken';
        $access_token = Cache::get($cacheKey); 
        if (empty($token)) {
            $appid = "你的APPID";
            $secret = "你的SECRET";
            $url = "https://api.q.qq.com/api/getToken?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
            $jsonResult = file_get_contents($url);
            $resultArray = json_decode($jsonResult, true);
            $access_token = $resultArray["access_token"];
            Cache::set($cacheKey,$access_token,180);
        }
        return $access_token;
    }

主要代码到这里就完了,下面补充用到的私有方法和类:

  • HTTP请求(支持HTTP/HTTPS,支持GET/POST)
	//HTTP请求(支持HTTP/HTTPS,支持GET/POST)
    private function httpRequest($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
  • 保存Base64图片
	private function saveBase64Image($base64_image, $ptype) {
        //保存位置--图片名
        $image_name =date('His').str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT).".jpg";
        $group_name = "_" . date('Ymd');
        $group_path = ROOT_PATH . 'public' . DS . 'static' . DS . 'jjfly'. DS . $group_name;
        $image_path = $group_path .'/'.$image_name;
        $http_path = "https://www.iftangtang.com/static/jjfly/" . $group_name . '/'.$image_name;
        if (!file_exists($group_path)) {
            mkdir ($group_path,0777,true);
        }
            
        //解码
        $base64_image = str_replace (" ","+", $base64_image);
        $base64_image = str_replace('data:image/jpg;base64,', '', $base64_image);
        $base64_image = str_replace('\n', '', $base64_image);
        $base64_image = str_replace('\t', '', $base64_image);
        
        $decode = base64_decode($base64_image);
        if (file_put_contents($image_path, $decode)){
            return $image_path;
        }
        return false;
    }
  • 简易封装接口用到的Json返回类:RJson.php
<?php

class RJson
{
    /*
     * 状态码code
     * 200成功,201失败
     * 1001未登录或登录信息过期,1002为access_toke过期
     * */
    //请求成功返回json格式数据
    public static function success($data='',$msg='操作成功',$code=200){
        $result = [
            'data' => $data,
            'msg' => $msg,
            'code' => $code
        ];

        return json_encode($result, JSON_UNESCAPED_UNICODE);
    }
    //请求失败返回json格式数据
    public static function error($msg='操作失败',$code=201,$data=''){
        $result = [
            'data' => $data,
            'msg' => $msg,
            'code' => $code
        ];

        return json_encode($result, JSON_UNESCAPED_UNICODE);
    }
}


http://www.niftyadmin.cn/n/28674.html

相关文章

数据结构之栈与队列详解

文章目录前言一、栈1.栈的概念及定义2.栈的实现&#xff08;1&#xff09;栈的结构&#xff08;2&#xff09;StackInit&#xff08;初始化&#xff09;&#xff08;3&#xff09;StackPush&#xff08;压栈&#xff09;&#xff08;4&#xff09;StackPop&#xff08;出栈&…

迭代器、可迭代对象、生成器的区别和联系

目录1 迭代器2 可迭代对象3 生成器1 迭代器 迭代器是一种可以更新迭代的工具&#xff0c;迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。但是他不能像列表一样使用下标来获取数据&#xff0c;也就是说迭代器是不能返回的。迭代器只能往前不会…

如何安装配置hbase

当完成hdfs、zookeeper的安装配置后&#xff0c;现在进入到hbase的安装和配置环节。这样的做的目的之一是要把海量的数据存入到hbase数据库中。JDK版本的要求hbase对JDK版本是有要求的&#xff0c;不是JDK版本越高越好&#xff0c;根据我走过的坑&#xff0c;目前最好的JDK版本…

洛谷 P1100 高低位交换

高低位交换 题目描述 给出一个小于 2322^{32}232 的非负整数。这个数可以用一个 323232 位的二进制数表示&#xff08;不足 323232 位用 000 补足&#xff09;。我们称这个二进制数的前 161616 位为“高位”&#xff0c;后 161616 位为“低位”。将它的高低位交换&#xff0c…

【SCL】1200应用案例:交通灯模拟自动装料控制

使用博图SCL语言来编写 交通灯模拟控制 和 自动装料应用案例 文章目录 目录 前言 一、应用&#xff1a;交通灯模拟控制 1.控制要求 2.I\o分配和接线 3.程序编写和效果 4.小结 二、自动装料模拟控制 1.控制要求 2.I/O分配 3.程序编写 4.小结 总结 前言 本篇文章我们继续学习西…

HTML前端表单校验的方法

1&#xff1a;jQuery框架的验证&#xff1a;validate框架1.1&#xff1a;Jquery Validate 验证规则(1)required:true 必输字段(2)remote:”check.PHP” 使用ajax方法调用check.php验证输入值(3)email:true 必须输入正确格式的电子邮件(4)url:true 必须输入正确格式的网址(5)dat…

1005.K次取反后最大化的数组和 135. 分发糖果 134. 加油站

1005.K次取反后最大化的数组和 我是暴力算出来的&#xff0c;看题解后知道了新的解法。 本题求的是将元素翻转k次后数组最大和&#xff0c;每个元素可重复翻转。 先将数组排序后&#xff0c;绝对值大的负数就在前面&#xff0c;优先翻转他们。因此排序后从前向后遍历数组&am…

Linux下dmi信息分析工具dmidecode原理

dmidecode命令主要是通过DMI获取主机的硬件信息&#xff0c;其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。它是通过SMBIOS&#xff08;System Management BIOS)来获取信息的。SMBIOS是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。 什么是DM…