小言_互联网的博客

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

308人阅读  评论(0)

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

UGC小程序官方定义:

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

拒审条例:

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

原因:

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

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

解决方案:


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

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

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

  • 图片敏感检测接口

  
  1. //微信小程序图片敏感检测
  2. public function wxImgSecCheck() {
  3. $access_token = $this-> getMiniToken();
  4. $img = request()-> param( 'img');
  5. if ( empty( $img)) {
  6. return RJson:: error( "");
  7. }
  8. $filePath = $this-> saveBase64Image( $img, 0);
  9. if ( empty( $filePath)) {
  10. return RJson:: error( "");
  11. }
  12. $obj = new \CURLFile( realpath( $filePath));
  13. $obj-> setMimeType( "image/jpeg");
  14. $file[ 'media'] = $obj;
  15. $url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=". $access_token;
  16. $info = $this-> httpRequest( $url, $file);
  17. return RJson:: success( $info);
  18. }
  • 获取access_token

  
  1. //微信小程序获取access_token
  2. private function getMiniToken() {
  3. $cacheKey = 'miniRcubeAccessToken';
  4. $access_token = Cache:: get( $cacheKey);
  5. if ( empty( $token)) {
  6. $appid = "你的APPID";
  7. $secret = "你的SECRET";
  8. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
  9. $jsonResult = file_get_contents( $url);
  10. $resultArray = json_decode( $jsonResult, true);
  11. $access_token = $resultArray[ "access_token"];
  12. Cache:: set( $cacheKey, $access_token, 180);
  13. }
  14. return $access_token;
  15. }

QQ小程序服务端相关代码

  • 图片敏感检测接口

  
  1. //QQ小程序图片敏感检测
  2. public function qqImgSecCheck() {
  3. $access_token = $this-> getQQMiniToken();
  4. $img = request()-> param( 'img');
  5. if ( empty( $img)) {
  6. return RJson:: error( "");
  7. }
  8. $filePath = $this-> saveBase64Image( $img, 1);
  9. if ( empty( $filePath)) {
  10. return RJson:: error( "");
  11. }
  12. $obj = new \CURLFile( realpath( $filePath));
  13. $obj-> setMimeType( "image/jpeg");
  14. $file[ 'media'] = $obj;
  15. $url = "https://api.q.qq.com/api/json/security/ImgSecCheck?access_token=". $access_token;
  16. $info = $this-> httpRequest( $url, $file);
  17. return RJson:: success( $info);
  18. }
  • 获取access_token

  
  1. //QQ小程序获取access_token
  2. private function getQQMiniToken() {
  3. $cacheKey = 'miniQQRcubeAccessToken';
  4. $access_token = Cache:: get( $cacheKey);
  5. if ( empty( $token)) {
  6. $appid = "你的APPID";
  7. $secret = "你的SECRET";
  8. $url = "https://api.q.qq.com/api/getToken?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
  9. $jsonResult = file_get_contents( $url);
  10. $resultArray = json_decode( $jsonResult, true);
  11. $access_token = $resultArray[ "access_token"];
  12. Cache:: set( $cacheKey, $access_token, 180);
  13. }
  14. return $access_token;
  15. }

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

  • HTTP请求(支持HTTP/HTTPS,支持GET/POST)

  
  1. //HTTP请求(支持HTTP/HTTPS,支持GET/POST)
  2. private function httpRequest( $url, $data = null)
  3. {
  4. $curl = curl_init();
  5. curl_setopt($curl, CURLOPT_URL, $url);
  6. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  7. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  8. if (! empty($data)) {
  9. curl_setopt($curl, CURLOPT_POST, TRUE);
  10. curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
  11. }
  12. curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  13. $output = curl_exec($curl);
  14. curl_close($curl);
  15. return $output;
  16. }
  • 保存Base64图片

  
  1. private function saveBase64Image( $base64_image, $ptype) {
  2. //保存位置--图片名
  3. $image_name = date( 'His'). str_pad( mt_rand( 1, 99999), 5, '0', STR_PAD_LEFT). ".jpg";
  4. $group_name = "_" . date( 'Ymd');
  5. $group_path = ROOT_PATH . 'public' . DS . 'static' . DS . 'jjfly'. DS . $group_name;
  6. $image_path = $group_path . '/'. $image_name;
  7. $http_path = "https://www.iftangtang.com/static/jjfly/" . $group_name . '/'. $image_name;
  8. if (! file_exists($group_path)) {
  9. mkdir ($group_path, 0777, true);
  10. }
  11. //解码
  12. $base64_image = str_replace ( " ", "+", $base64_image);
  13. $base64_image = str_replace( 'data:image/jpg;base64,', '', $base64_image);
  14. $base64_image = str_replace( '\n', '', $base64_image);
  15. $base64_image = str_replace( '\t', '', $base64_image);
  16. $decode = base64_decode($base64_image);
  17. if ( file_put_contents($image_path, $decode)){
  18. return $image_path;
  19. }
  20. return false;
  21. }
  • 简易封装接口用到的Json返回类:RJson.php

  
  1. <?php
  2. class RJson
  3. {
  4. /*
  5. * 状态码code
  6. * 200成功,201失败
  7. * 1001未登录或登录信息过期,1002为access_toke过期
  8. * */
  9. //请求成功返回json格式数据
  10. public static function success( $data='',$msg='操作成功',$code=200){
  11. $result = [
  12. 'data' => $data,
  13. 'msg' => $msg,
  14. 'code' => $code
  15. ];
  16. return json_encode($result, JSON_UNESCAPED_UNICODE);
  17. }
  18. //请求失败返回json格式数据
  19. public static function error( $msg='操作失败',$code=201,$data=''){
  20. $result = [
  21. 'data' => $data,
  22. 'msg' => $msg,
  23. 'code' => $code
  24. ];
  25. return json_encode($result, JSON_UNESCAPED_UNICODE);
  26. }
  27. }


转载:https://blog.csdn.net/hbqjzx/article/details/128739881
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场